【发布时间】:2015-08-05 14:19:02
【问题描述】:
我认为这个问题一定是在某个地方问过的,但是当我寻找它时,不幸的是,我只发现了不同的主题。无论如何这里是代码:
public class A {
Object lockX = new Object();
Object lockY = new Object();
Object lockZ = new Object();
int c1;
int c2;
public void foo1() {
synchronized(lockX) {
c1++;
}
}
public void bar1() {
synchronized(lockY) {
c1++;
}
}
public void foo2() {
synchronized(lockZ) {
c2++;
}
}
public void bar2() {
synchronized(this) {
c2++;
}
}
}
基本上 foo1 和 bar1 是不正确的。它们使用不同的锁来保护 c1,因此实际上 c1 不会受到保护,并且这两个功能可以同时运行。然而,我的问题是关于 foo2 和 bar2。他们还好吗?它们也使用不同的锁,但 bar2 锁定了整个对象,所以它会阻止同时修改 c2 吗?
【问题讨论】:
-
您有四种不同的锁,
lockX,lockY,lockZ和this。他们都不会阻止任何其他人。 -
在一个真实的程序中,如果你只是想从多个线程中计算一些东西,你应该使用 AtomicInteger。
标签: java synchronization