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

时间:2011-09-13 18:27:26

标签: 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;
   }
}

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

3 个答案:

答案 0 :(得分:6)

  

是否保证从connect()生成的线程   方法会看到“已连接”不再等于“真”?

仅当从connect()方法生成的线程是将connected设置为false的线程时才会生效!

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

但是,如果父线程在在生成的线程上调用connected之后清除start()标志,则生成的线程不会保证到除非您将标记声明为volatile,否则请参阅更改。

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

答案 1 :(得分:5)

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

答案 2 :(得分:-1)

好吧,即使你没有添加volatile关键字,其他线程也能够读取连接变量。通过添加volatile,除其他外,您可以访问变量同步。