另一个试图提供我从这里和其他来源的答案中得到的东西的总结(第一次尝试离基地很远,我希望这个更好)。
Java内存模型是关于将一个线程中写入内存的值传播给其他线程,以便其他线程在从内存中读取时可以看到它们。
总之,如果你获得一个互斥锁,任何释放该互斥锁的线程所写的任何东西都将对你的线程可见。
如果您读取一个易失性变量,在读取它之前写入该易失性变量的任何内容对于读取线程都是可见的。此外,写入变量之前写入变量的线程完成的任何易失性变量写入都是可见的。而且,在Java 1.5中,任何写操作都是可变的或不可变的,在写入volatile变量之前写入到volatile变量的任何线程上发生的任何写操作都将对您可见。
构建对象后,可以将其传递给另一个线程,并且所有最终成员都将在新线程中可见并完全构建。对非最终成员没有类似的保证。这使我认为赋予最终成员充当了写入volatile变量(内存围栏)。
线程在Runnable退出之前写入的任何内容对执行join()的线程都是可见的。线程在执行start()之前写入的任何内容都可以在生成的线程中看到。
另一件要提到的事情是:volatile变量和同步有一个很少提及的函数:除了刷新线程缓存并提供一次一个线程访问外,它们还可以防止编译器和CPU重新排列同步读写边界。
没有一个是新的,其他答案都表明它更好。我只是想写这个来清理我的头。
感谢您的链接!它不会取代一本书(我会得到),但它确实给了我一个洞见:我习惯于考虑同步,而内存模型更多地关注重新排序。我需要学会区分这两者,并想到最后一个。 – Arkadiy 2008-12-12 18:40:04