黑马程序员技术交流社区
标题:
多线程安全问题
[打印本页]
作者:
徐传任
时间:
2012-10-10 13:19
标题:
多线程安全问题
public class TicketDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t0 = new Thread(t);
Thread t1 = new Thread(t);
t0.setName("窗口一:");
t1.setName("窗口二:");
t0.start();
t1.start();
}
}
class Ticket implements Runnable {
private int num = 100;
public void run() {
while(true) {
try {
sell();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sell() throws InterruptedException {
if(num>0) {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);
}
}
}
复制代码
我知道会产生安全问题,会出现0号票,不安全。但是我在运行的时候突然发现有两个同号的票,这个问题是怎么产生的。
窗口一卖票啦,卖票啦80
窗口二卖票啦,卖票啦80
窗口二卖票啦,卖票啦79
窗口一卖票啦,卖票啦78
窗口二卖票啦,卖票啦77
窗口一卖票啦,卖票啦76
窗口一卖票啦,卖票啦75
为什么会出现两个80号票呢?
是 num--在运行后给num赋值期间出现的问题吗?
如果分开写
System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num);
num--;这样我知道是两条语句出现问题,
但是System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这不是一条语句吗为什么还会出现问题。
具体System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这条语句在多线程期间是怎么出现同号票安全问题的原因的,麻烦给解释下
作者:
李兆宁
时间:
2012-10-10 17:06
多线程,要对操作的资源加锁,同步一下,就不会卖一样的票了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2