我将使用一个静态变量进行多线程。线程运行时将更新此变量。更新过程将由updateModel
功能完成。这是我的代码片段
public static int total = 0;
...
run(){
// there will be calculation before update value ex: int ext = this.total/10
updateModel();
}
synchronized void updatedModel(){
this.total += 1;
}
updateModel是否需要同步?
答案 0 :(得分:4)
你在这里做错了,你使用this
引用来同步静态变量,因为方法updatedModel()
是实例。 It's not thread safe anyway!
使用静态引用来同步静态内容或使该方法updatedModel()
静态
答案 1 :(得分:3)
答案 2 :(得分:1)
当我没记错时,+=
不是原子操作,因此可能会发生一个线程进入updateModel
并读取值42
,然后上下文切换和另一个线程输入updateModel
,读取值42
,将其递增到43
,然后上下文切换,第三个线程进入updateModel
,读取值43
,将其递增到{ {1}},然后上下文切换,第一个线程再次将值设置为44
。所以,如果你想保证每个线程都将值递增1,你应该同步它。