**本文正在參加「Java主題月 - Java Debug筆記活動」,詳情查看 活動連接 **markdown
問題: 有人能夠告訴我用同步方法替代同步代碼塊有什麼優點嗎? 最好舉個例子併發
------------------------------如下爲回答,按支持票數排序----------------------------------ui
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
}
複製代碼
惟一的不一樣是同步代碼塊能夠選擇指定對象做爲鎖,然而同步方法只能使用this
(或同步類方法使用其對應的類實例)。例如,下面兩種語義是等效的:排序
synchronized void foo() {
...
}
void foo() {
synchronized (this) {
...
}
}
複製代碼
後者更靈活,由於它能夠競爭任何對象(一般是成員變量)的關聯鎖。它也更精細,由於您能夠在塊以前和以後執行併發代碼,但仍能夠在該方法內執行。固然,經過將併發代碼重構爲單獨的非同步方法,您也能夠輕鬆使用同步方法。這樣使用可使代碼更容易理解。input