使用Synchronized (this) 對當前對象進行同步化,這很容易理解;但對其他對象同步化,應該怎樣理解?比如下面的代碼,synchronized(syncObject) 語句,syncObject 就是一個普通對象Object,這樣又有什么意義了?import static net.mindview.util.Print.*;class DualSynch { private Object syncObject = new Object(); public synchronized void f() { for(int i = 0; i < 5; i++) { print("f()"); Thread.yield(); } } public void g() { synchronized(syncObject) { for(int i = 0; i < 5; i++) { print("g()"); Thread.yield(); } } }}public class SyncObject { public static void main(String[] args) { final DualSynch ds = new DualSynch(); new Thread() { public void run() { ds.f(); } }.start(); ds.g(); }}
5 回答

慕后森
TA貢獻1802條經驗 獲得超5個贊
我的理解是 Java 中每個對象都有一把鎖,synchronized (this) 鎖的是對象本身,synchronized (object) 鎖的是一個作為鎖的 Object。
以下代碼中的兩個 synchronized 塊之間不構成同步,因為兩個塊的鎖加在了不同對象上
class SyncSample {
Object lock = new Object();
synchronized void m1() {
System.out.println("m1");
}
void m2() {
synchronized (lock) {
System.out.println("m2");
}
}
}

夢里花落0921
TA貢獻1772條經驗 獲得超6個贊

拉莫斯之舞
TA貢獻1820條經驗 獲得超10個贊
public synchronized void f()
相當于synchronized (this)
也就是對象本身,synchronized(syncObject)
加鎖的是另外一個對象syncObject。
這樣的結果就是:你new出來一個DualSynch
對象,在兩個線程中f()
方法和g()
方法是可以并發執行的,但是在兩個線程中f()
和f()
不能并發執行,g()
和g()
不能并發執行。
添加回答
舉報
0/150
提交
取消