kuk*_*c67 1 java thread-safety
我尝试了以下内容,但没有奏效:
"开始"课程:
public class Start implements Runnable {
Start start;
LoadExample loadExample;
Thread mainThread;
Thread loadExampleThread;
private boolean running = false;
public static boolean isExampleLoaded = false;
public static void main(String[] args) {
begin = new Start();
loadExample = new LoadExample();
begin.start();
}
public synchronized void start() {
mainThread = new Thread(this, "Main");
mainThread.start();
loadExampleThread = new Thread(loadExample, "Load Example");
loadExampleThread.start();
}
public void run() {
running = true;
while (running) {
if(isExampleLoaded){
System.out.println("Loaded!");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
"LoadExample"类:
public class LoadExample implements Runnable {
public void run(){
//blabla, loading if you will...
Start.isExampleLoaded = true;
}
}
Run Code Online (Sandbox Code Playgroud)
您可能会在上面的代码中发现语法错误,但这只是因为我在没有签入Eclipse的情况下键入了这个错误.我的原始代码非常相似,Eclipse没有显示任何错误或警告.
我的问题是代码不会打印"已加载!".我认为这是因为(1)线程无法更改静态变量或其他类的变量,或者(2)更改只是更新当前线程而不是其他(s),但我可能错了.
任何澄清表示赞赏.
编辑:
如果您发现上述任何错误,请告诉我,我会尽快更新.
您需要标记变量volatile才能使此示例正常工作.没有volatile,读取线程将读取isExampleLoaded一次,而不是再次读取,因为编译器知道该变量尚未写入.
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |