初学java多线程的问题

我看的书上的一个例子

 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了。同意楼上的

加锁就能达到你的目标