Java多线程同步问题分析_多线程同步访问一个文件问题
分类:十二月
时间:2019-05-06
本文已影响
人
摘要:针对java多线程中,多个线程共享数据时存在的问题进行详细分析,结合实例阐述了java同步机制的重要性。关键词:JVM;进程;多线程;共享数据;同步机制 中图分类号:TP312 文献标识码:A DoI: 10.3969/j.issn.1003-6970.2012.04.010 while(flag) { if(tick>0) {System.out.println(currentThread(). getName()+”sale:”+tick--);} if(tick==0) flag=false;} 假设现在卖出只剩1张票,如果售票员1执行到if(tick>0),但还没执行System.out.println(currentThread(). getName()+"sale:"+tick--);这条语句时,CPU资源轮流到售票员2,但是tick还是1,那么售票员继续卖票,打印票并且tick--,tick为0,当CPU资源轮流到售票员1时,售票员继续打印票,那么打印的就是0,这样就出现严重错误,没有票了还在继续卖票,并且票号为0,不符合用户需求也不符合软件设计的要求。怎样测试这个程序呢?只要在if语句块中加Thread.sleep(10);这条语句,即 while(flag) { if(tick>0) { Thread.sleep(10);//等待10毫秒 System.out.println(currentThread(). getName()+"sale:"+tick--);} if(tick==0) flag=false;} 让程序在此等待10毫秒,就发现问题所在了。问题的原因是当多条语句在操作同一个线程共享数据时,一个线程线程对多条语句只执行了一部分,还没有执行完,另外一个线程就参与进来执行,导致共享数据发生错误。 3 解决问题 出现多线程抢占资源的问题是很多的,因为电脑运行的时候,会启动多个进程,而线程是进程的最小运行单元,并且一个进程间也可能有多个线程[4]。所以必然会有多个线程抢占CPU资源,这样就导致上面的问题发生了。要解决这个问题,对多条操作共享数据的语句,只能让一个线程全部执行完,在 4 总结 一个应用软件启动时,肯定会同时运行多个线程,多个线程在执行共享数据时,就会产生不可预料的错误,那么就需要用Java提供的同步机制来解决。同步的前提:第一,必须有两个或两个以上的线程;第二,必须是多个线程使用相同的代码块;第三,必须保证同步中只能有一个线程在运行。这就需要用JVM提供的synchronized同步机制,来解决多线程同步中的问题,保证用户需求和软件设计的正确。提供同步有好处也有弊端,好处是解决了多线程安全问题,弊端是消耗资源。
相关热词搜索:多线程 同步 分析 Java
|
Java多线程同步问题分析_多线程同步访问一个文件问题相关文章