0

在我们的应用程序(用 Java 为 Android 编写)中,我们有一个Thread包含 int 字段的派生类:

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;

该类MyThread仅从int 字段读取,而我希望另一个线程写入它(如上面的示例中所示)。

据我所知,Java 中的 int 等原始类型是原子读/写的。

我应该保护对这个 int 字段的访问(使用synchronized关键字)吗?

我在这里读到,根据 Java 内存模型,如果没有显式通信,甚至可能看不到对几个线程共享的内存的更新

Quote: 没有明确的通信,你不能保证哪些写入被其他线程看到

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

4

3 回答 3

3

您应该做的是将其声明为volatile. 请参阅http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

于 2013-10-31T09:04:38.973 回答
2

你将如何更新 int 变量?如果是直接修改,那么将变量设置为 volatile 很有用。
public volatile int myValue = 0;
但更新是read-modify这样你需要相互同步线程。
并且[此链接]将有助于理解 volatile

于 2013-10-31T09:26:36.133 回答
1

原始类型(如 Java 中的 int)是原子读/写的。

线程总是看到某个线程写入的变量的值;不是凭空抽出的随机值。除非声明为volatile,否则 64 位数值变量(long 和 double)不具有无意义的安全性,因为允许 JVM 将 64 位值视为两个 32 位提取操作。因此,即使您使用原始类型,您也应该使用Volatile.

多线程还有两件事:1.原子性 2.可见性

易失性保证可见性部分而不是原子性部分。因此,如果您要增加一个变量K++,那么synchronize您也不能保证该atomicity部分。

于 2013-10-31T09:10:26.377 回答