很简单, 出票里加锁就行了完整锋野代码:
public class Test {public static void main(String[] args) {
for(int i=0 i<3 i++){
new Thread("线程 " + i){
public void run() {
while(true){
int p = getNumber()
if(p >0 ){
System.out.println(getName() + " 票号: " + p)
}else{
System.out.println("没票了")
break
}
}
}
}.start()
}
}
public static int num = 100 //总票数
/**
* synchronized 同步锁
* @return
*/
public static synchronized int getNumber(){
if(num >0){
return num -- //如果大于0, 银基喊则返回当前锋旅票并减少一张
}
return 0
}
}
首先,定义的锁(lock)不对,必须是同一个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制;启漏
其次,你如果想要呈现多线程的竞争,不可以穗圆在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify();
以下我稍微修改下,会形成两个线悄族烂程交替执行的情形:
public class ThreadTest {public static Object obj = new Object()
public static int number = 10// 用static共享票源,不知道可以不,按理说是可以的
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my = new MyThread()
MyThread my2 = new MyThread()
Thread t1 = new Thread(my2, "2号窗口")
Thread t2 = new Thread(my, "1号窗口")
t1.start()
t2.start()
}
static class MyThread implements Runnable {
public void run() {
while (true)
synchronized (obj) {
if (number > 0) {
System.out.println(Thread.currentThread().getName()
+ "正在卖票," + "还剩" + number + "张票")
number--
obj.notifyAll()
try {
obj.wait()
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
} else
break
}
}
}
}
你的答案有肆雹租两个肆碰问题:1,obj不是static,就是裂兆说每个线程都有自己的obj,synchronize锁的是自己线程的obj,不能起到阻塞其它线程的作用。运行的话会看到有的票被出售多次。
2,while (num >0)在syncronize之外,因为没被同步,其它线程可能在对比num >0之后修改num的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。
所以最后的答案才能得到可靠的结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)