[英]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()
方法是设定一个connected
到false
!
生成的线程在启动后将能够看到connected
为真,因为启动线程是“ 先发生”操作,并且源代码也会在线程内进行排序之前建立“ 先发生”操作 。
但是,如果父线程在生成的线程上调用start()
之后清除connected
标志,则除非保证将标志声明为volatile
否则不能保证生成的线程会看到更改。
1.4和1.5行为之间的主要区别在于,写入volatile
变量还将刷新从Java 5开始对非易失性变量的写入。 (读取易失性变量还会清除所有缓存的非易失性变量值。)由于似乎您只涉及一个变量,所以此更改不会影响您。
是的,您应该使用volatile。 这将确保在更新字段的值时,检查该字段的所有线程都将具有更新的值。 否则,您将无法确保不同的线程将获得更新后的值。
好吧,即使您没有添加volatile关键字,其他线程也将能够读取连接的变量。 通过添加volatile等,您可以同步访问变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.