Ben*_*est 1 java multithreading volatile
我有以下代码在类中初始化为静态变量:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我已经运行了connect方法,它生成了一个新线程.disconnect()方法将"connected"设置为"false".是否保证从connect()方法生成的线程将看到"connected"不再等于"true"?或者我是否必须在"已连接"上使用volatile关键字?值得注意的是我使用的是Java 1.4.2.
是否保证从connect()方法生成的线程将看到"connected"不再等于"true"?
只有当这是从衍生线程connect()的方法是设定一个connected到false!
生成的线程connected在启动之后将能够看到它是真的,因为启动线程是一个先发生的操作,并且源代码还在线程内建立了一个发生之前的排序.
但是,如果父线程在调用生成的线程后清除该connected标志,则不会保证生成的线程看到更改,除非您将该标志声明为.start()volatile
1.4和1.5行为之间的主要区别在于,写入volatile变量还将从Java 5向前刷新对非易失性变量的写入.(读取volatile变量也会清除所有缓存的非易失性变量值.)由于您似乎只涉及一个变量,因此此更改不应影响您.