我有一个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还是更复杂的对象,它们的所有属性也都是完全设置的。
答案 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
将完全初始化为稍后在同一个帖子中提交的任务。