执行器服务完全初始化保证

时间:2017-01-15 03:41:33

标签: java multithreading

我有一个hashmap和一个在主线程中初始化和更新的复杂对象。

Map<String,String> map = new HashMap<>();
map.put("key1","val1");
map.put("key2","val2");
map.put("key3","va3");
map.put("key4","val4");

ComplexObject c1 = new ComplexObject();
c1.setPropert1(prop1);c1.setProperty2(map);

ExecutorService executorService  = Executors.newFixedThreadPool(10);

executorService.submit(()->{
    Map<String,String> m = c1.getProperty2();
    String val = m.get("key1"); //1
    //do something
});

在excutor服务中提交的线程是否保证在第1行看到val作为val1,或者它可以是在主线程中初始化的Hashmap由于指令重新排序而尚未完全初始化,并且在池中提交的线程可以获得val作为null.?

我应该怎样做才能确保在池中提交的线程完全初始化复杂对象c1,并且无论它们是hashmap还是更复杂的对象,它们的所有属性也都是完全设置的。

1 个答案:

答案 0 :(得分:4)

请参阅ExecutorService的文档:

  

内存一致性效果:在SyntaxError: Unexpected token < in JSON at position 0 at JSON.parse (<anonymous>) at n.parseJSON (jquery.min.js:4) at Ab (jquery.min.js:4) at z (jquery.min.js:4) at XMLHttpRequest.<anonymous> (jquery.min.js:4) Runnable任务提交到Callable happen-before任务所采取的任何操作之前,线程中的操作,转发生 - 之前通过ExecutorService检索结果。

所以,是的,Future.get()map将完全初始化为稍后在同一个帖子中提交的任务。