我的功能需要同步吗?

时间:2014-03-05 07:53:11

标签: java multithreading thread-safety

我将使用一个静态变量进行多线程。线程运行时将更新此变量。更新过程将由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是否需要同步?

3 个答案:

答案 0 :(得分:4)

你在这里做错了,你使用this引用来同步静态变量,因为方法updatedModel()是实例。 It's not thread safe anyway!

使用静态引用来同步静态内容或使该方法updatedModel()静态

答案 1 :(得分:3)

  

我将使用一个静态变量进行多线程。

是的,该变量需要同步,并且需要使用AtomicInteger.

保持该方法不变。使变量线程安全。

答案 2 :(得分:1)

当我没记错时,+=不是原子操作,因此可能会发生一个线程进入updateModel并读取值42,然后上下文切换和另一个线程输入updateModel,读取值42,将其递增到43,然后上下文切换,第三个线程进入updateModel,读取值43,将其递增到{ {1}},然后上下文切换,第一个线程再次将值设置为44。所以,如果你想保证每个线程都将值递增1,你应该同步它。

相关问题