黑马程序员技术交流社区
标题:
Q1:诡异!用同步代码块处理后多线程仍然出现安全问题
[打印本页]
作者:
dicegame
时间:
2013-7-27 22:06
标题:
Q1:诡异!用同步代码块处理后多线程仍然出现安全问题
本帖最后由 杜光 于 2013-7-28 09:28 编辑
package qbb;
class Ticket implements Runnable{
private int ticketNo = 100;
public void run(){
while(true){
Object obj = new Object();
synchronized(obj){
if(ticketNo > 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "\t"
+ ticketNo-- + " has been saled");
}
}
}
}
}
public class Test{
public static void main(String[] args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
用eclipse运行后,结果中仍然出现0,-1,-2等错票,为什么呢?
作者:
王磊
时间:
2013-7-27 22:14
同步锁的对象定义错误,应该讲Object obj = new Object();定义在类的成员位置。或者直接使用this作为锁。
楼主这样将所定义在了run方法内,相当于4个线程分别创建了4个锁,并且互不干涉。
多线程同步的要求是操作共有数据的线程,要操作同一个锁。
作者:
诸隆隆
时间:
2013-7-27 22:58
.....同步块的作用是因为操作用一个数据,或者同一个数据库,只允许一个线程进入,但你new了四个线程后没有直接带参,相当于建了四个数据。不是一个数据。
作者:
dicegame
时间:
2013-7-28 14:27
王磊 发表于 2013-7-27 22:14
同步锁的对象定义错误,应该讲Object obj = new Object();定义在类的成员位置。或者直接使用this作为锁。
...
汗,原来是这样,谢谢!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2