在java中并发访问String变量

时间:2017-12-26 19:41:45

标签: java multithreading concurrency thread-safety

如果触发多个线程,是否需要同步字符串变量(状态)?

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对象并取消正在运行的线程。

我怀疑上面的代码是否在没有同步逻辑的情况下工作。如果它不能在这种情况下如何添加同步逻辑呢?

1 个答案:

答案 0 :(得分:0)

变量应该被声明为volatile。否则,线程可能会将值更新为&#34;失败&#34;,但主线程永远不会看到此更新。原因在这里解释: http://etutorials.org/Programming/Java+performance+tuning/Chapter+10.+Threading/10.6+Atomic+Access+and+Assignment/

这是不可能的(取决于触发代码的作用),这是不必要的,但它不值得承担风险。