【发布时间】:2013-08-09 23:06:32
【问题描述】:
在示例代码中
public class MsLunch {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}
在this 页面上,
lock1 和 lock2 控制着 c1 和 c2 响应的更新。
然而,
synchronized(lock2)
正在获取对象lock1的锁,并在同步块时释放它
synchronized(lock1) {
c1++;
}
被执行。
当这个块被执行时,可能有 this 对象的成员 c1 的更新仍然 - 我没有 看看这个更新是如何被阻止的 与代码中一样在 lock1 上同步。
是对象lock1有独占访问权—— 没有别的(?)
那么,如何实现
public void inc1() {
synchronized(lock1) {
c1++;
}
}
上面的代码不同于
public void synchronized inc1() {
c1++;
}
甚至
public void inc1() {
synchronized(c1) {
//do something on c1
}
}
当 c1 是一个对象而不是一个基元时?
我在这里错过了什么?
注意:我看到了
What is the difference between synchronized on lockObject and using this as the lock?
和
Java synchronized method lock on object, or method?
在其他一些讨论中。
【问题讨论】:
-
为什么你认为
synchronized(lock2)锁定了lock1? -
我熟悉并发文档,只是阅读了该页面。它没有说
synchronized(lock2)锁定lock1,因为它没有。 -
这通常是同步块的工作方式—— synchronize(someStuff) 获取 someStuff 的锁,因此在线程完成执行该块之前没有其他人可以访问 someStuff。阅读页面。
-
@Roam:不,你错了。检查我更新的答案。
标签: java synchronized