繁体   English   中英

在这种情况下是否需要“易失性”关键字词? (Java)

[英]Is the “volatile” keyword word needed in this instance? (Java)

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

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。

是否可以保证从connect()方法产生的线程将看到“ connected”不再等于“ true”?

只有当这是从催生了螺纹connect()方法是设定一个connectedfalse

生成的线程在启动后将能够看到connected为真,因为启动线程是“ 先发生”操作,并且源代码也会在线程内进行排序之前建立“ 先发生”操作

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM