如果我运行线程1并在其中创建HashMap,当线程1完成时,我可以在线程2中读取和/或修改它吗?
// thread A
// stuff
new BukkitRunnable() {
public void run() {
final Map<String,Boolean> map = new HashMap<String,Boolean>();
// fill it with data...
new BukkitRunnable() {
public void run() {
// use the map
}
}.runTask(plugin); // Running it on thread A 0.05 sec later.
}
}.runTaskAsynchronously(plugin); // Running it on a new thread
答案 0 :(得分:2)
只要在线程1中Map
的最后一次更新与线程2中Map
的第一次访问之间存在发生在之前的障碍,否则运行线程2的CPU的内存缓存可能看不到更改。
请参阅javadoc中的Memory Consistency Properties。
所以,只是线程1完成的事实是不够的。现在,如果你在Map
完成之后启动第2个线程,那么你很好,因为start()
建立了这样的发生之前关系。
或者,它取决于 如何在线程之间共享Map
引用。