我有以下代码,这些代码被初始化为类中的静态变量:
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。
发布于 2011-09-14 02:33:51
连接是否保证从
()方法派生的线程将看到"connected“不再等于"true"?
仅当从connect()方法派生的线程是将connected设置为false的线程!
衍生的线程将能够在启动后看到connected为true,因为启动线程是一个发生之前的操作,并且源代码还在线程内建立了一个发生之前的排序。
但是,如果父线程在派生线程上调用start()之后清除了connected标志,则不能保证派生线程看到更改,除非您将该标志声明为volatile。
和1.5行为之间的主要区别在于,从Java5开始,写入volatile变量也会刷新对非易失性变量的写入。(读取易失性变量还会清除所有缓存的非易失性变量值。)由于您似乎只涉及一个变量,因此此更改应该不会影响您。
发布于 2011-09-14 02:33:13
是的,你应该使用volatile。这将确保当字段的值被更新时,所有检查该字段的线程都将具有更新后的值。否则,您不能确保不同的线程将获得更新值。
发布于 2011-09-14 02:32:37
那么,即使您没有添加volatile关键字,其他线程也能够读取连接的变量。通过添加volatile等,您可以同步访问变量。
https://stackoverflow.com/questions/7406643
复制相似问题