此实例中是否需要"volatile"关键字?(JAVA)

Ben*_*est 1 java multithreading volatile

我有以下代码在类中初始化为静态变量:

public class MyXlet extends Xlet {
   boolean connected = false;
   ...

   void connect() {
      // some code goes here, starts a new thread
      MyXlet.connected = true;
   }

   void disconnect() {
      // some code goes here, the new thread is designed to terminate once connected is false;
      MyXlet.connected = false;
   }
}
Run Code Online (Sandbox Code Playgroud)

假设我已经运行了connect方法,它生成了一个新线程.disconnect()方法将"connected"设置为"false".是否保证从connect()方法生成的线程将看到"connected"不再等于"true"?或者我是否必须在"已连接"上使用volatile关键字?值得注意的是我使用的是Java 1.4.2.

eri*_*son 6

是否保证从connect()方法生成的线程将看到"connected"不再等于"true"?

只有当这是从衍生线程connect()的方法是设定一个connectedfalse!

生成的线程connected在启动之后将能够看到它是真的,因为启动线程是一个先发生的操作,并且源代码还在线程内建立了一个发生之前的排序.

但是,如果父线程调用生成的线程清除该connected标志,则不会保证生成的线程看到更改,除非您将该标志声明为.start()volatile

1.4和1.5行为之间的主要区别在于,写入volatile变量还将从Java 5向前刷新对非易失性变量的写入.(读取volatile变量也会清除所有缓存的非易失性变量值.)由于您似乎只涉及一个变量,因此此更改不应影响您.


Joh*_*n B 5

是的你应该使用volatile.这将确保在更新字段的值时,检查该字段的所有线程都将具有更新的值.否则,您无法确保不同的线程将获得更新的值.