java多线程的卖票问题

java多线程的卖票问题,第1张

首先,定义的锁(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的值,可能导致计数为负数的票被卖出,或者其它奇怪的结果。

所以最后的答案才能得到可靠的结果。

public class Test {

public static void main(String[] args) 亩散{

Runnable ticket=new TrainTicket()

Thread seller1=new Thread(ticket)

Thread seller2=new Thread(ticket)

seller1.start()

seller2.start()

}

}

class TrainTicket implements Runnable{

//100张一下就卖完了,改成1000吧。假设座位号为1-1000;

public int n=1000

@Override

public 迅数氏void run() {

while(n>0){

System.out.println(Thread.currentThread().getName()+"卖出毕纯了座位:"+n)

n--

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12513601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存