java线程同步问题,买票

Python010

java线程同步问题,买票,第1张

while

(ticket

>

0)

{

<----

sale()

}

如果在箭头的位置第一个线程切换,并且这个时候ticket=1

那么第二个线程也会通过,此时ticket=1,恰巧第二个线程又切换到第三个线程,ticket=1.那么接下来

sale()会执行3次

就成了-2,

所以需要在sale()内部在做一次判断。

原因就是你同步的位置不对,判断要在同步内部。

首先,定义的锁(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

}

}

}

}