java中同步问题及其处理方法

在多线程的应用中,由于多个线程使用、修改同一个数据,就有可能产生最终数据与想要结果不同的现象。例如编写一个抢票程序如下:

public class Piao {
    public static void main(String[] args) {
        ExecutorService service=Executors.newCachedThreadPool();
        QiangPiao thread=new QiangPiao();
        Future result=service.submit(thread);
        Future result2=service.submit(thread);
        }
}
class QiangPiao implements Runnable{
    private Integer mun=50;
    private boolean flag=true;
    @Override
    public  void run() {

        while(flag) {
            task();
        }
        
    }
    public  void task() {
        if(mun==0)
        {
            flag=false;
            return ;
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println(Thread.currentThread().getName()+"=="+--mun);
    }
}

结果为:

pool-1-thread-2==49
pool-1-thread-1==49
pool-1-thread-1==48
.......
pool-1-thread-2==-1

为什么出现这样的结果了?这就是因为多线程的使用,线程-2在计算--mun的时候内存中将--mun 的值还未及时写回到mun的时候线程-1也运行到了这里这时候mun值依旧还是50。这样就出现了重复抢票的问题。同时-1票也是由于这样造成的。这就是同步问题。抢票的票数与我们想要的结果不同。

你可能感兴趣的:(java)