我看的书上的一个例子
public class ThreadDemo3
{
public static void main(String args[])
{
TestThread t = new TestThread();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread extends Thread
{
private int tickets = 20;
public void run()
{
while(true)
{
if(tickets>0)
System.out.println(Thread.currentThread().getName()+"出售票"+tickets--);
else
break;
}
}
}
按照我的想法,tickets应该是依次减小的,但是为什么跑出来的是乱序的呢?
我想的:
结果:
System.out.println(Thread.currentThread().getName()+"出售票"+tickets--);
这一行不是原子操作。tickets--得到表达式的值后,可能发生线程切换,输出别的线程
System.out.println(Thread.currentThread().getName()+"出售票"+tickets--); 这一行对tickets的操作不是院子操作,多个线程竞争tickets变量,
比如线程1开始执行了对tickets的操作,并输出了这时是19,线程2 刚执行了tickets--还没有输出,它的cpu资源使用完了,该轮到线程3执行了,这时输出就是18了。同意楼上的
加锁就能达到你的目标