通过使用同步代码块解决实现Runnable接口的方式的线程安全问题
class Window1 implements Runnable{
private int Ticket =20;//多个线程共用一个Ticket
//创建一个对象,用做同步监视器
Object object = new Object();
public void run() {
while (true) {
//同步监视器为一个对象
synchronized (object) {
//synchronized (this)也可以 ,此时的this为window1对象,多个线程共用一个Window1对象,所以同步监视器也是惟一的
int a=21-Ticket;
if (Ticket>0) {
System.out.println(Thread.currentThread().getName()+" 卖出第 "+a+"张票");
Ticket--;
}
else {
break;
}
}
}
}
}
public class WindowsTest1 {
public static void main(String[] args) {
Window1 w=new Window1();//一个对象,多个线程
Thread t1=new Thread(w);
Thread t2=new Thread(w);
Thread t3=new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}