这是我的一个电影院卖票的代码, 我加了锁对象,为什么运行 还是还出现0票和-1票的情况,请大神给解答一下
package sellTicket;
public class SellTicket implements Runnable {
int ticket = 100;
public final static Object obj =new Object();
public SellTicket() {
}
@Override
public void run() {
while (ticket > 0) {
synchronized (obj) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在销售复仇者联盟的第" + (ticket--) + "张票...");
}
}
}
}
package sellTicket;
public class SellTicketDemo {
public static void main(String[] args){
SellTicket st=new SellTicket();
Thread th1=new Thread(st,"窗口1");
Thread th2=new Thread(st,"窗口2");
Thread th3=new Thread(st,"窗口3");
th1.start();
th2.start();
th3.start();
}
}
运行结果:
....
窗口1正在销售复仇者联盟的第12张票...
窗口1正在销售复仇者联盟的第11张票...
窗口1正在销售复仇者联盟的第10张票...
窗口1正在销售复仇者联盟的第9张票...
窗口1正在销售复仇者联盟的第8张票...
窗口1正在销售复仇者联盟的第7张票...
窗口1正在销售复仇者联盟的第6张票...
窗口1正在销售复仇者联盟的第5张票...
窗口1正在销售复仇者联盟的第4张票...
窗口1正在销售复仇者联盟的第3张票...
窗口1正在销售复仇者联盟的第2张票...
窗口1正在销售复仇者联盟的第1张票...
窗口3正在销售复仇者联盟的第0张票...
窗口2正在销售复仇者联盟的第-1张票...
我把线程沉睡的这一块代码去掉,或者加在while循环前面都没有用,还是会出现0和-1,只是程序的运行速度变快了,请大神给解答下这道题,为什么给了锁对象之后,还是会出现多个线程操作同一个数据的问题..难道不是应该等待一个线程运行完毕,解锁后 下一个线程抢到cup控制权 然后判断条件,进来执行语句吗?
|