Java synchronized块 - 锁定对象

Roa*_*oam 0 java synchronized

在示例代码中

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是一个对象而不是一个原始的?

我在这里错过了什么?

注意:我看到了

lock对同步和使用它作为锁有什么区别?

和

Java同步方法锁定对象或方法?

在其他一些讨论中.

rge*_*man 6

实施1.

你正在锁定lock1对象.没有其他需要锁定的东西lock1可以执行.让两个方法锁定不同的对象意味着这两个方法可以并发运行,但没有两个线程可以同时运行相同的方法.

实施2.

创建一个方法synchronized意味着整个方法体隐式地存在于一个synchronized(this)块中(或者Class如果方法是对象则在对象上同步static.如果两个方法都是synchronized,那么一个方法会阻止另一个方法同时运行,这是不同的,然后同时锁定不同对象的方法.

实施3.

如果c1是对象而不是基元,那么语义与实现1非常相似 - 锁定显式对象.