亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

結合下面一段java代碼,請問一下synchronized 塊對當前對象和其他對象有是什么區別?

結合下面一段java代碼,請問一下synchronized 塊對當前對象和其他對象有是什么區別?

海綿寶寶撒 2019-03-15 18:15:08
使用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");

        }

    }

}


查看完整回答
反對 回復 2019-04-17
?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

利用一個單獨的對象作為鎖對象。這種情況下也可以使用ReentrantLock,然后用它的lock()、unlock()代替synchronized。


查看完整回答
反對 回復 2019-04-17
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

public synchronized void f()相當于synchronized (this)也就是對象本身,synchronized(syncObject)加鎖的是另外一個對象syncObject。
這樣的結果就是:你new出來一個DualSynch對象,在兩個線程中f()方法和g()方法是可以并發執行的,但是在兩個線程中f()f()不能并發執行,g()g()不能并發執行。


查看完整回答
反對 回復 2019-04-17
  • 5 回答
  • 0 關注
  • 549 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號