当前位置: 代码迷 >> J2EE >> 线程有关问题 ,
  详细解决方案

线程有关问题 ,

热度:30   发布时间:2016-04-21 21:19:08.0
线程问题 ,急急急急急急

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 。

------解决方案--------------------
是锁的不同的对象,为什么票没有 各自 减各自的,而是有序减少
------解决方案--------------------
引用:
Quote: 引用:

抛开线程不说
if(ticket>0)这个判断条件加上 ticket-- 这个输出肯定是会出现0的啊,如果ticket==1>0,自然满足条件然后输出 ticket-- = 0 不是很正常吗

正常什么?
你执行下一段代码先试一试再说.
int ticket = 1;
if(ticket>0){
//这时1>0,所以能进来
System.out.println(ticket--);//这里打印的是1,而不是0,你要先搞明白ticket-- 。
}


额是的,我粗心了,ticket--实际上是先输出ticket然后再执行ticket--的,说明线程A和线程B在ticket==1的时候同时进来,然后A把ticket--了,而B仍然输出ticket,此时就输出了被A减过的ticket就是0

------解决方案--------------------
引用:
Quote: 引用:

这样的话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加上和不加上没有区别
------解决方案--------------------
引用:
  相关解决方案