黑马程序员技术交流社区
标题:
synchronized同步锁的时候为什么不起作用
[打印本页]
作者:
李志敏
时间:
2013-4-21 22:42
标题:
synchronized同步锁的时候为什么不起作用
本帖最后由 李志敏 于 2013-4-21 23:06 编辑
毕老师11天10视频中的代码
class Ticket implements Runnable{
private int tic=100;
public void run(){
while(true){
synchronized (new Object()) {
if(tic>0){
try {
Thread.sleep(10);//出现-1、-2号票 有安全问题
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"ticket"+tic--);
}
}
}
}
}
public class TicketDemo {
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();
}
}
复制代码
输出结果依然有-1,-2号的票 这是怎么回事?
作者:
932759732
时间:
2013-4-21 22:50
本帖最后由 杨玄文 于 2013-4-21 22:51 编辑
你的锁有问题。
建议把锁定义在外面。
Object obj = new Object();
然后用obj当锁。
你这样子每次循环都会新new出一个锁来。所以是锁不住的。
作者:
崔自成
时间:
2013-4-21 23:03
问题出在 synchronized (new Object()) 这里 ,每次都会new出一个新的对象,即使用的不是同一把锁。应该是
class Ticket implements Runnable{
......
......
private Object obj = new Object();
public void run(){
while(true){
synchronized (obj) {//确保每次使用的都是同一把锁
.....
.....
.....
作者:
李志敏
时间:
2013-4-21 23:03
本帖最后由 李志敏 于 2013-4-21 23:05 编辑
杨玄文 发表于 2013-4-21 22:50
你的锁有问题。
建议把锁定义在外面。
Object obj = new Object();
哦 现在好了
作者:
袁梦希
时间:
2013-4-21 23:05
楼主你好:
你的同步代码块里面的锁有问题,因为你用的是匿名对象,每次判断锁的时候,都是不同的对象。
因为同步代码块中的锁必须是同一个锁并且可以是任意锁,可以是this锁,也可以是.class文件。
所谓的锁也就是synchronized (锁){};中传的参数你可以把对象改为如下所示:
class Ticket implements Runnable {
private int tic = 100;
private Object obj = new Object(); //这里定义的代码,就是定义的锁对象
public void run() {
while (true) {
synchronized (obj) { //这里就是装的锁对象,其实也可以不用定义锁对象,直接传个任意对象就行,如this或者某类的.class文件都可以,保证锁的唯一
if (tic > 0) {
try {
Thread.sleep(10);// 出现-1、-2号票 有安全问题
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "ticket" + tic--);
}
}
}
}
}
public class TicketDemo {
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();
}
}
复制代码
希望可以帮助楼主。
作者:
wangyougu010
时间:
2013-4-21 23:13
不能在锁对象那new对象的,这样每次都是新的对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2