在示例代码中
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++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个页面上,
lock1和lock2正在控制c1和c2上的更新.
然而,
synchronized(lock2)
Run Code Online (Sandbox Code Playgroud)
获取对象lock1的锁定并在同步块时释放它
synchronized(lock1) {
c1++;
}
Run Code Online (Sandbox Code Playgroud)
被执行.
在执行此块时,仍然可以对此对象的成员c1进行更新 - 而且我没有看到如何通过在代码中同步lock1来阻止此更新.
对象lock1是否有独占访问权限 - 没有别的(?)
那么,实施方式如何
public void inc1() {
synchronized(lock1) {
c1++;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中有所不同
public void synchronized inc1() {
c1++;
}
Run Code Online (Sandbox Code Playgroud)
甚至
public void inc1() {
synchronized(c1) {
//do something on c1
}
}
Run Code Online (Sandbox Code Playgroud)
当c1是一个对象而不是一个原始的?
我在这里错过了什么?
注意:我看到了
和
在其他一些讨论中.
实施1.
你正在锁定lock1对象.没有其他需要锁定的东西lock1可以执行.让两个方法锁定不同的对象意味着这两个方法可以并发运行,但没有两个线程可以同时运行相同的方法.
实施2.
创建一个方法synchronized意味着整个方法体隐式地存在于一个synchronized(this)块中(或者Class如果方法是对象则在对象上同步static.如果两个方法都是synchronized,那么一个方法会阻止另一个方法同时运行,这是不同的,然后同时锁定不同对象的方法.
实施3.
如果c1是对象而不是基元,那么语义与实现1非常相似 - 锁定显式对象.