okyesok1515 2019-01-12 14:40 采纳率: 100%
浏览 661
已采纳

Java中关于原子变量和多线程安全问题

自学java碰到些问题,向各位大佬们请教下
多线程安全问题产生的前提 是不是 多线程对共享数据进行了非原子操作
既然是共享数据进行非原子性操作的化,那用AtomicXxx类应该能解决吧
但是....

package Thread_01;

import java.util.concurrent.atomic.AtomicInteger;

class TicketSale2 implements Runnable{
    //private int tickets=100;
    AtomicInteger tickets=new AtomicInteger(10);
    Object object=new Object();
    //线程任务为售票,所以将该任务在run方法中执行
    public void run(){
        while(true) {
        //synchronized (object) {

            if(tickets.get()>0) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"您好,您的票号为"+tickets.getAndDecrement());
            }
            else{break;}
        //}
        }
    }
}
public class TicketDemo3 {
    public static void main(String[] args) {
        //线程任务对象
        TicketSale2 ticketSale=new TicketSale2();
        //线程对象
        Thread t1=new Thread(ticketSale);
        Thread t2=new Thread(ticketSale);
        Thread t3=new Thread(ticketSale);
        Thread t4=new Thread(ticketSale);
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}

还是会产生线程安全问题...这是为什么呢 还望大佬们抽空解答下
图片说明

  • 写回答

1条回答 默认 最新

  • 舍文 2019-01-12 16:11
    关注

    tickets.get() 是原子操作,tickets.getAndDecrement()是原子操作。但是两个操作合起来就不具备原子性了。判断和操作分离了。
    Thread-2 , Thread-3, Thread-1 执行tickets.get() 都是1 ,但是sleep20毫秒以后,Thread-2先执行tickets.getAndDecrement()于是打印0,
    Thread-3接着执行tickets.getAndDecrement(),但是tickets当前值为0,于是打印-1 ,Thread-1最后执行tickets.getAndDecrement(),但是tickets
    的当前值为-1,于是打印-2

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图