下面是一个卖票的程序,使用obj作为同步代码块中的锁。同步代码块是在ticket类中。我创建了两个tikect类的对象t和t1,两对象中的obj都是同一个,以t和t1各创建了2个线程,这四个线程共用的是同一个obj锁,应该共同卖出100张票,而不是各自卖出100张票。
public class test{
public static void main(String[] args) {
Object obj = new Object();
//object作为ticket类中对象锁
Ticket t = new Ticket(obj);
Ticket t1 = new Ticket(obj);
//t t1都有同一个obj对象
//两组线程各自卖了100张票,而不是一共卖了100张
new Thread(t).start();
new Thread(t).start();
new Thread(t1).start();
new Thread(t1).start();
}
}
class Ticket implements Runnable{
private Object obj;
private int ticket = 100;
public Ticket(Object obj) {
this.obj = obj;
}
public void sellTicket(){
while(true) {
synchronized (obj){
System.out.println(Thread.currentThread().getName() + " 剩余票数:" + ticket--);
if(ticket <= 1)
break;
}}
}
public void run(){
sellTicket();
}
}