2014-03-05 71 views
0

我将使用一个静态变量的多线程。这个变量在线程运行时会被更新。更新过程将通过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

您是否真的必须在线程中更新总数? – hasan83

+0

是的,对于你们两个人 –

+0

我建议你改用AtomicInteger。这种方式不需要同步。 – krems

回答

4

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

使用静态参考静态内容同步,或使该方法updatedModel()静态

+0

所以我需要添加静态同步updateModel()? –

+0

@IniKoqApah:是的,这是一个可能的解决方案。 –

+1

谢谢,我刚刚读了一些教程,这是java程序员最大的错误,忘记用静态变量来表示需要同步的静态变量 –

3

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

是,该变量需要同步和好兆头使用AtomicInteger.

保持这种方法,因为它是。使变量线程安全。

1

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