【发布时间】:2013-05-27 20:50:27
【问题描述】:
我正在关注here的例子
我已将processCommand 修改为-
private void processCommand() throws InterruptedException {
this.command = "xyz";
}
完整代码-
import java.util.logging.Level;
import java.util.logging.Logger;
public class WorkerThread implements Runnable {
private String command;
public WorkerThread(String s) {
this.command = s;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(WorkerThread.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println(Thread.currentThread().getName() + " Commad at start :" + command);
try {
processCommand();
} catch (InterruptedException ex) {
}
System.out.println(Thread.currentThread().getName() + " Command after processCommand : " + command);
}
private void processCommand() throws InterruptedException {
this.command = "xyz";
}
}
现在,我希望看到同步问题,对吧?基本上,当
System.out.println(Thread.currentThread().getName()+' Start. Command = '+command);
被执行了,它CAN获取值xyz,对吧?但我从来没有看到它。我在 Thread.Sleep 中尝试了各种值。
那么在这种情况下,是什么让this.command = "xyz"; 语句线程安全?
我正在以这种方式开始线程-
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
【问题讨论】:
-
向我们展示您的完整代码。
-
是什么让你认为这是线程安全的?您的代码在
command变量上没有同步,并且它不能保证command的值是否被多个线程访问。仅仅因为您的代码没有抛出错误,并不意味着它是正确或安全的:) -
@greedybuddha - 确切地说 - 我不认为它是线程安全的,但我的实验表明它是。在这个例子中我如何诱导竞争条件?
-
@user375868 启动多线程,尝试修改
command。 -
@tarrsalah 我已经这样做了。
标签: java multithreading thread-safety threadpool