如果触发多个线程,是否需要同步字符串变量(状态)?
class Request{
String status;
....// Some other variables used in thread
}
class Test{
public static void main(String[] args){
Requesr r = new Request();
List<Future> list= new ArrayList<Future>();
ExecutorService pool= Executors.newFixedThreadPool(10);
for(String input : inputList){
if(!"failed."equals(r.status)){
RequestHandler request = new RequestHandler(input,r);
Future f = pool.submit(request);
list.add(f);
}else{
//fail the job and return;
}
}
for (Future fTemp : list) {
if (fTemp.get() == null) {
// Task completed
}
}
}
}
class RequestHandler extends Runnable{
Map<String,String> input;
Requesr r;
RequestHandler(Map<String,String> input, Request r ){
this.input=input;
this.r = r;
}
@Override
public void run() {
if(!"failed".equals(r.status)){
try{
//some logic
}catch(Exception e){
r.Status = "failed";//status is assigned a value only here
}
}
}
}
状态是否需要同步才能在Test类for循环和其他线程中可见? 如下面的注释中所述,我将使用Future对象并取消正在运行的线程。
我怀疑上面的代码是否在没有同步逻辑的情况下工作。如果它不能在这种情况下如何添加同步逻辑呢?
答案 0 :(得分:0)
变量应该被声明为volatile。否则,线程可能会将值更新为&#34;失败&#34;,但主线程永远不会看到此更新。原因在这里解释: http://etutorials.org/Programming/Java+performance+tuning/Chapter+10.+Threading/10.6+Atomic+Access+and+Assignment/
这是不可能的(取决于触发代码的作用),这是不必要的,但它不值得承担风险。