Java 何时同步变量?

Java 何时同步变量?,java,Java,我应该何时同步变量 我想只有一个线程可以访问它;这是否意味着我不需要同步它 synchronized(variableName){ } 如果只有一个线程访问它,则不需要同步它 如果要防止多线程同时更新变量,则应在多线程环境中进行同步。同步的原因是多线程可以访问代码块。使用以下命令 synchronized(whateverObject) { //... // code to be accessed by one thread here... } 确保代码块仅由一个线程访问。所有其他线程将

我应该何时同步变量

我想只有一个线程可以访问它;这是否意味着我不需要同步它

synchronized(variableName){

}

如果只有一个线程访问它,则不需要同步它


如果要防止多线程同时更新变量,则应在多线程环境中进行同步。

同步的原因是多线程可以访问代码块。使用以下命令

synchronized(whateverObject)
{ //...
 // code to be accessed by one thread here...
}
确保代码块仅由一个线程访问。所有其他线程将阻塞,直到第一个线程完成


除非代码是多线程的,否则不需要使用synchronized关键字。

根据您的代码片段,您正在上同步
,而未同步
variableName
。这两者之间有很大的区别。如果要保护
变量名
,则应在
同步
块中访问该变量名。像这样:

synchronized(syncVar){
     variableName = /* some operation which will modify the state of variableName */
}
这里的
syncVar
是您正在同步的变量,并保护
variableName
不被同时访问


此外,如果只有一个线程访问该变量,则无需同步。这可能是一个性能的打击

如果性能是一个重要的考虑因素,我最近读到:

void synchronized method() {
...
}
快于:

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

在当前JVM中。YMMV

他说的话。锁定仍然会带来开销,不管它有多小。所以如果你不需要锁,就不要锁。这当然不是在多线程中避免它的理由;)好的,但是如果一次只能运行一个线程,那么两个线程怎么能同时访问同一个变量呢?两个或多个线程可以同时运行,这就是多线程的全部概念。@user470184如果是单核微处理器,那么这是真的,“一次一条指令”,但一条指令通常不会执行完整操作、完整线程、方法、变量分配等。。然后JVM和OS会将时间分配给线程,很多事情会在“同一时间”(每个瞬间)发生,从这个意义上讲,就像你一边看电视一边吃饭,有时你一边看菜,另一边看电视,但你可以放心地说“我一边吃一边看电视”这和同步(variableName)是一样的吗{variableName=/*一些修改variableName*/}状态的操作可以正常工作,但通常我们会在一个对象上获得锁,然后修改另一个对象。