使用同步方法替代同步代碼塊是否有優點|Java Debug 筆記

**本文正在參加「Java主題月 - Java Debug筆記活動」,詳情查看 活動連接 **markdown

問題: 有人能夠告訴我用同步方法替代同步代碼塊有什麼優點嗎? 最好舉個例子併發

------------------------------如下爲回答,按支持票數排序----------------------------------ui

回答1(支持票數442):
Can anyone tell me the advantage of the synchronized method over the synchronized block with an example? Thanks.
複製代碼

使用同步方法替換同步代碼塊並無明顯的優點。 也許有一個(可是我並不認爲是一個優點)就是你不須要再加上對象引用this。 同步方法:this

public synchronized void method() { // blocks "this" from here.... 
    ...
    ...
    ...
} // to here
複製代碼

同步代碼塊:spa

public void method() { 
    synchronized( this ) { // blocks "this" from here .... 
        ....
        ....
        ....
    }  // to here...
}
複製代碼

看見了嗎?根本沒有優點。code

可是,塊確實比方法具備優點,主要是在靈活性上,由於您能夠將另外一個對象用做鎖,而同步該方法將鎖定整個對象。 比較如下兩塊代碼:orm

// 鎖住整個對象
... 
private synchronized void someInputRelatedWork() {
    ... 
}
private synchronized void someOutputRelatedWork() {
    ... 
}
複製代碼
// 使用指定的對象鎖
Object inputLock = new Object();
Object outputLock = new Object();

private void someInputRelatedWork() {
    synchronized(inputLock) { 
        ... 
    } 
}
private void someOutputRelatedWork() {
    synchronized(outputLock) { 
        ... 
    }
}
複製代碼

一樣,若是擴展方法仍然能夠保持同步鎖的部分:對象

private void method() {
     ... code here
     ... code here
     ... code here
    synchronized( lock ) { 
        ... very few lines of code here
    }
     ... code here
     ... code here
     ... code here
     ... code here
}
複製代碼
回答2(支持票數142):

惟一的不一樣是同步代碼塊能夠選擇指定對象做爲鎖,然而同步方法只能使用this(或同步類方法使用其對應的類實例)。例如,下面兩種語義是等效的:排序

synchronized void foo() {
  ...
}

void foo() {
    synchronized (this) {
      ...
    }
}
複製代碼

後者更靈活,由於它能夠競爭任何對象(一般是成員變量)的關聯鎖。它也更精細,由於您能夠在塊以前和以後執行併發代碼,但仍能夠在該方法內執行。固然,經過將併發代碼重構爲單獨的非同步方法,您也能夠輕鬆使用同步方法。這樣使用可使代碼更容易理解。input

相關文章
相關標籤/搜索