2011-05-17 75 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