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票也是由于这样造成的。这就是同步问题。抢票的票数与我们想要的结果不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值