在我们的应用程序(用Java编写的Android)中,我们有一个包含int字段的Thread
派生类:
public class MyThread extends Thread {
public int myValue = 0;
public void doWork() {
while (true) {
System.out.println(myValue);
}
}
}
// On some other thread
myThread.myValue = 42;
只有<{1}}类从int字段读取,而我想要另一个写的线程(如上例所示)。
据我所知,原始类型(例如Java中的int)是以原子方式读/写的。
我是否应该保护对此int字段的访问权限(使用MyThread
关键字)?
我读过here根据Java内存模型,如果没有明确传达,甚至可能看不到几个线程共享的内存更新
引用:如果没有明确的沟通,你无法保证哪些写入得到 其他线程看到的
我应该保护对该字段的访问还是其他线程可以(原子地)更新它而不需要任何修改?
答案 0 :(得分:3)
您应该做的是将其声明为volatile
。请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html。
答案 1 :(得分:2)
你打算如何更新int变量?如果它是直接修改的,那么将变量设置为volatile是有用的
public volatile int myValue = 0;
但更新为read-modify
,因此您需要彼此同步线程
和[this link]对于理解volatile
答案 2 :(得分:1)
原始类型(例如Java中的int)以原子方式读/写。
线程总是看到某个线程写入的变量的值;没有一些随意的价值从空气中拉出来。除非声明为volatile
,否则64位数字变量(长和双)不具有超薄空中安全性,因为允许JVM将64位值视为两个32位读取操作。因此,即使您使用原始类型,也应使用Volatile
。
在多线程中还有两件事: 1。原子性2.可见性
易失性保证可见性部分不是原子性部分。因此,如果您要增加K++
之类的变量而不是synchronize
,那么您不能保证atomicity
部分。