2012-06-17 58 views
3

嵌套同步塊是否比正常同步塊更快進入?或者,例如,以下哪個例程更快:嵌套同步的速度

void routine1(SyncClass a) { 
    a.syncMethod1(); 
    a.syncmethod2(); 
    a.syncMethod1(); 
} 

void routine2(SyncClass a) { 
    synchronized(a) { 
    a.syncMethod1(); 
    a.syncmethod2(); 
    a.syncMethod1(); 
    } 
} 

這些方法是同步的。我正考慮在不需要線程安全的情況下使用線程安全對象。所以併發級別不受影響。

另外,答案平臺是否依賴?

+0

你必須考慮的是在進行細粒度同步時的正確性。至於答案例程2速度更快,除非JVM粗加顯示器並像例程2那樣編譯例程1。鎖定/解鎖沒有固有的好處,除非中間有一些代碼。 – bestsss

+0

@bestsss在什麼情況下JVM會使顯示器變得粗大,以及爲什麼,究竟是什麼意思?你有鏈接到文檔? – warren

+0

顯示器粗化是一種避免頻繁進入顯示器的技術,因爲它不是免費的操作,需要CAS。一旦你有關鍵字(鎖定變粗),谷歌往往會產生相當不錯的結果 - 所以最初的java6白皮書:http://java.sun.com/performance/reference/whitepapers/6_performance.html#2.1.2 – bestsss

回答

0

看來,答案是肯定的,因爲對問題留下的評論。但有兩個警告。

1)由於並行執行的機會較少,線程可能更頻繁地彼此等待。

2)編譯器可以自動優化這種方式。

1

無論平臺如何,您最好在​​之前選擇最小的代碼元素,無論性能如何。

在​​塊中包含若干同步調用會降低併發性(並因此降低性能)。只有在您需要特定的呼叫序列進行同步時才能執行此操作。

如果您擔心除了之外的併發性,我不知道哪個更快。然而,我認爲你所描述的兩種方法在性能上的差異是不可察覺的。

+0

只能降低*併發性*。 – EJP

+0

@EJP微妙而有效!固定。 – cheeken

+0

請記住,如果JVM看起來合適,它可能會粗化顯示器。獲取顯示器不是免費的 – bestsss