首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下是否需要"volatile“关键字?(Java)

在这种情况下是否需要"volatile“关键字?(Java)
EN

Stack Overflow用户
提问于 2011-09-14 02:27:26
回答 3查看 169关注 0票数 1

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

代码语言:javascript
复制
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"?或者,我必须在"connected“上使用volatile关键字吗?值得注意的是,我使用的是Java 1.4.2。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-14 02:33:51

连接是否保证从

()方法派生的线程将看到"connected“不再等于"true"?

仅当从connect()方法派生的线程是将connected设置为false的线程!

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-09-14 02:33:13

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

票数 5
EN

Stack Overflow用户

发布于 2011-09-14 02:32:37

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7406643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档