多线程第一次print被重复执行

TheBigBangWOW 2018-02-26 02:37:40
以下案例是关于多线程操作静态变量不加锁的情况
不是很理解的地方是,为什么静态变量的第一个值50,不管运行多少次,总是被输出了3次,如果是线程安全问题的话,为什么其他的值,比如40,30等却不被重复输出,唯独第一个50被重复输出
加了synchronized之后可以不重复输出,但是想弄明白这个案例中为什么只有第一个值被输出了3次
谢谢大家了

class SaleTickets2 extends Thread{
static int num = 50;//票数

public SaleTickets2(String name) {
super(name);
}

@Override
public void run() {
while(true){
if(num>0){
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
num--;
}else{
System.out.println("售罄了..");
break;
}

}
}
}



public class Demo4_2 {
public static void main(String[] args) {
//创建线程对象
SaleTickets2 thread1 = new SaleTickets2("窗口1");
SaleTickets2 thread2 = new SaleTickets2("窗口2");
SaleTickets2 thread3 = new SaleTickets2("窗口3");
//开启线程
thread1.start();
thread2.start();
thread3.start();
//System.out.println("test");
}
}
...全文
524 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
TheBigBangWOW 2018-02-27
  • 打赏
  • 举报
回复
谢谢各位!!
aachen0 2018-02-27
  • 打赏
  • 举报
回复
这是cpu竞争的结果,我们只需知道多个线程同时操作同一个资源时会出现安全问题就行了,出现安全问题的数据是垃圾数据,没有任何意义
TheBigBangWOW 2018-02-26
  • 打赏
  • 举报
回复


试了一下,好像其他的值也会重复,如图中的第三次,就重复了一次50,一次20,所以应该跟第一个值没有必然的关系
谢谢各位了

dong_19890208 2018-02-26
  • 打赏
  • 举报
回复
窗口1售出了第1号票 售罄了.. 窗口2售出了第50号票 售罄了.. 窗口3售出了第23号票 售罄了.. 我用你的代码测试并不是50会输出3次,应该只是巧合
TheBigBangWOW 2018-02-26
  • 打赏
  • 举报
回复
引用 1 楼 soton_dolphin 的回复:
说明这三个线程一开始的时候看到的值都是50啊。
那为什么其他值不会出现 “看到的值都是xxx” 的现象?
soton_dolphin 2018-02-26
  • 打赏
  • 举报
回复
说明这三个线程一开始的时候看到的值都是50啊。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧