2011-05-17 26 views
0

什麼時候應該同步一個變量?何時同步變量?

我認爲它只會被一個線程訪問;這是否意味着我不需要同步它?

synchronized(variableName){ 

} 

回答

6

如果它只能被一個線程訪問,則不需要同步它。

如果要保護變量免受多線程同時更新的影響,您應該在多線程環境中進行同步。

+0

他說什麼。無論多小,鎖定仍然會產生開銷。所以不要鎖定,如果你不需要。這當然沒有理由在多線程中避免它;) – Mr47 2011-05-17 16:19:43

+0

好吧,但是如果只有一個線程可以在任何時候運行,那麼兩個線程怎麼能夠同時訪問同一個變量呢? – 2011-05-17 17:46:50

+0

兩個或多個線程可以同時運行,這是多線程的整體概念。 – Marcelo 2011-05-17 17:48:19

0

同步化的原因是一段代碼可能被多個線程訪問。使用以下內容,

synchronized(whateverObject) 
{ //... 
// code to be accessed by one thread here... 
} 

確保代碼塊將僅由一個線程訪問。所有其他線程將阻塞,直到第一個線程完成它。

除非代碼是多線程的,否則不需要使用synchronized關鍵字。

1

按您的代碼段,你是同步上variableName,你是不是同步variableName。這有很大的區別。如果要保護variableName,則應在​​區塊中訪問該區域。就像這樣:

synchronized(syncVar){ 
    variableName = /* some operation which will modify the state of variableName */ 
} 

這裏syncVar是要在其上同步和保護variableName從同時訪問的變量。

另外,如果只有一個線程訪問該變量,則不需要同步。它可能是一個性能問題。

+0

是 - 同步(variableName){ variableName =/*一些操作,它將修改variableName */ } – 2011-05-17 19:00:55

+1

它將工作沒有任何錯誤。但通常我們鎖定一個對象並修改另一個對象。 – Bhushan 2011-05-17 19:22:32

0

如果性能是很高的代價,我最近看了:

void synchronized method() { 
... 
} 

快於:目前的JVM

void method() { 
    synchronized (this) { 
    ... 
    } 
} 

。 YMMV