【发布时间】:2016-06-30 08:21:31
【问题描述】:
public class Main{
public static void main(String[] args) throws Exception {
// Creating objects for class Check(2 different objects)
Check c = new Check("s1");
Check c1 = new Check("s2");
c.start();c1.start();
}
}
class Check extends Thread{
Check(String name){super(name);}
private Integer ab = 2;
public void run(){
synchronized (ab) {
System.out.println(Thread.currentThread().getName());
for(int i=0;i<10;i++)System.out.print(i+" ");
}
}
}
这里我已经对变量 ab 进行了同步。而且我还创建了两个不同的类 Check 实例,但我总是得到 s1 的输出,然后是 s2,反之亦然,但没有混合,为什么会这样?当我已经创建了两个单独的对象(在 main 中),所以两个不同的线程,两个不同的 ab 变量,那么它如何成为两个不同对象的共享资源?
【问题讨论】:
-
顺便说一句,您没有在 变量 上进行同步,而是在变量所引用的对象上进行同步。这是一个重要的区别,因为有些人犯了错误,没有意识到变量可以在不同的时间引用不同的对象,有些人犯了错误,没有意识到同一个对象可以被多个变量引用。
-
这段代码看起来更像是一个测试代码而不是一个真实的案例,但是如果你想在一个无锁但线程安全的Number上同步,你可以使用AtomicInteger .
-
@jameslarge:我明白你在说什么。我对此并不精确,因为我的问题集中在其他一点上。无论如何,谢谢。 :)
-
@Jean-FrançoisSavard:是的,它是一个测试代码,与实际项目无关。只是检查。是的,AtomicInteger,我知道。谢谢你。 :)
-
@Jean-François:澄清一下,atomicinteger 更像是锁定的替代品,它不应该用作锁定。
标签: java multithreading thread-safety