kro*_*old 1 java multithreading java-memory-model
假设我有以下代码:
final Catalog catalog = createCatalog();
for (int i = 0; i< 100; i++{
new Thread(new CatalogWorker(catalog)).start();
}
Run Code Online (Sandbox Code Playgroud)
"Catalog"是一个对象结构,而createCatalog()和"Catalog"对象结构的方法并没有考虑并发性.产品目录中有几个非最终的非易失性引用,甚至可能存在可变状态(但是必须要处理)
我理解内存模型的方式,这段代码不是线程安全的.有没有简单的方法让它安全?(这个问题的通用版本实际上是关于在线程爆炸之前创建的共享结构的单线程构造)
不,没有简单的方法可以确保安全.并发使用可变数据类型总是很棘手.在某些情况下,使每个操作Catalog同步(最好是在私有锁上)可能会起作用,但通常你会发现一个线程实际上想要执行多个操作而不会冒任何其他线程搞乱事情的风险.
只是同步每次访问变量应该足以使Java内存模型问题不那么相关 - 例如,你总是会看到最新的值 - 但更大的问题本身仍然很重要.
任何不可变的状态都Catalog应该是正常的:在构造Catalog和正在启动的新线程之间存在"发生之前" .从规范的第17.4.5节:
在启动线程中的任何操作之前,对线程的start()调用发生.
(并且构造完成在调用之前发生start(),因此构造发生在启动线程中的任何操作之前.)