我有以下代码在类中初始化为静态变量:
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。
答案 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,除其他外,您可以访问变量同步。