Java多线程同步问题分析

时间:2022-08-11 01:29:29

Java多线程同步问题分析

摘要:针对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同步机制,来解决多线程同步中的问题,保证用户需求和软件设计的正确。提供同步有好处也有弊端,好处是解决了多线程安全问题,弊端是消耗资源。

上一篇:“索尼探秘” 下一篇:基于android手机的加密QR二维码识别系统