日期:2014-05-20  浏览次数:20667 次

多线程卖票问题


为什么始终都是一个线程在执行呢????
------解决方案--------------------
按楼主的代码设计,一个线程输出时对的。
假如t1线程先获得运行权,那么它得到了对象obj的锁,而且一直不释放,直到运行到 50次循环,这是这个线程结束,锁也释放,其他线程得到锁能运行,但i的值已经是50了,直接退出了。
把同步块缩小一下,即可正常。
class MyThread extends Thread {
static Object obj = new Object();
static int i = 0;

public void run() {
while(true) {//改成while循环。
try {//这个放在同步块外。
Thread.sleep(5);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
synchronized (obj) {
if(i < 50) {//这里判断是否该结束。
System.out.println(Thread.currentThread().getName() + "---" + i);
i++;
}
else {
break;//超出50 结束 。
}
}
}
}
}

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


为什么始终都是一个线程在执行呢????

想知道为什么吗?因为你上了锁之后没释放锁。你现在的情况是一个线程买完所有票才会轮到下一个线程执行。就是因为你上锁了,而在线程运行过程中没有释放。
六楼的代码乃正解
------解决方案--------------------
static变量(static Object obj = new Object())可以理解为类变量,虽然你创建了四个Ticket3,但obj只有一个,四个Ticket3在争抢obj的锁,但每次只有一个线程能占有obj的锁,因此只有一个线程(获得obj锁的线程)跑。。。
------解决方案--------------------
内存被锁,其他线程无法获取obj的锁。
看一下“java锁,可重入性”