public class Demo2{
public static void main(String [] args){
SellTicketSystem s1 = new SellTicketSystem();
SellTicketSystem s2 = new SellTicketSystem();
s1.setName("111");
s2.setName("2222222222");
s1.start();
s2.start();
}
}
class SellTicketSystem extends Thread{
private static int ticket=20;
public void run(){
synchronized(this){
while(true){
if(ticket>0){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(this.getName()+"卖到第"+ticket--+"张");
}
}
}
}
}
结果为:
2222222222卖到第20张
111卖到第19张
2222222222卖到第18张
111卖到第17张
2222222222卖到第16张
111卖到第15张
2222222222卖到第14张
111卖到第13张
2222222222卖到第12张
111卖到第11张
2222222222卖到第10张
111卖到第9张
2222222222卖到第8张
111卖到第7张
2222222222卖到第6张
111卖到第5张
2222222222卖到第4张
111卖到第3张
2222222222卖到第2张
111卖到第1张
2222222222卖到第0张
为啥锁了还有0 。
------解决方案--------------------
是锁的不同的对象,为什么票没有 各自 减各自的,而是有序减少
------解决方案--------------------
额是的,我粗心了,ticket--实际上是先输出ticket然后再执行ticket--的,说明线程A和线程B在ticket==1的时候同时进来,然后A把ticket--了,而B仍然输出ticket,此时就输出了被A减过的ticket就是0
------解决方案--------------------
这样的话222222222就卖不了票了
我告诉你把synchronized(this)改成synchronized(SellTicketSystem.class),是为了告诉你锁怎么用,不是说改这个你的代码就能完成你的想法(2个窗户同时售票),我后面说了,多线程代码结构就不是你这样的。
222222222不卖票的原因是锁的位置不对,一个线程一直占用,一直到票卖光了,另一个线程才能执行锁内的代码。
public class Demo2{
public static void main(String [] args){
Stack stack = new Stack();
SellTicketSystem s1 = new SellTicketSystem(stack,"111");
SellTicketSystem s2 = new SellTicketSystem(stack,"2222222222");
s1.start();
s2.start();
}
}
//共享数据
class Stack{
public int ticket=20;
public synchronized void sell(String name) {
int t = ticket--;
System.out.println(name+"卖到第"+t+"张");
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
}
}
class SellTicketSystem extends Thread{
private Stack stack;
private String name;
public SellTicketSystem(Stack stack,String name){
super();
this.stack = stack;
this.name = name;
}
public void run(){
while (stack.ticket>0) {
this.stack.sell(this.name);
}
}
}
为什么是全部是从20张票减少,而不是各自减去各自的
------解决方案--------------------
synchronized加上和不加上没有区别
------解决方案--------------------