共享内存(int)与java线程的同步

时间:2013-10-31 09:03:08

标签: java android multithreading thread-safety java-memory-model

在我们的应用程序(用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内存模型,如果没有明确传达,甚至可能看不到几个线程共享的内存更新

  

引用:如果没有明确的沟通,你无法保证哪些写入得到   其他线程看到的

我应该保护对该字段的访问还是其他线程可以(原子地)更新它而不需要任何修改?

3 个答案:

答案 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部分。