class Window2 extends Thread
{
static int ticket=100;
public void run()
{
while(true)
{
synchronized (Thread.class)
{
if(ticket>0)
{
System.out.println(Thread.currentThread().getName()+"卖票,票号为"+ticket);
ticket--;
}
else
break;
}
try {
System.out.println(Thread.currentThread().getName()+"正在等待1s");//卖完票等待
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class SynchronizedTest {
public static void main(String[] args)
{
Window2 w1=new Window2();
Window2 w2=new Window2();
Window2 w3=new Window2();
w1.setName("线程1");
w2.setName("线程2");
w3.setName("线程3");
w1.start();
w2.start();
w3.start();
}
}
执行结果如下
如上图所示,线程1先卖了票,然后才到线程3卖;那么应该是线程1先等待1s啊,为什么是线程3先等待?
线程的执行是可以不按照顺序的,由cpu去调配。你的锁只是锁了扣除票数的环节,保证了卖片的安全性。
因为你后面打印的等待1秒不在synchronized 锁里了,不属于抢占资源!!