【发布时间】:2017-03-27 20:35:41
【问题描述】:
有人说如果多个线程在读/写,那么你需要使用同步,如果一个线程在读/写而另一个线程只在读,那么你必须使用 volatile。我不明白这两种情况之间的区别。
基本上,在对 volatile 字段的写入操作完成后,所有读取器(尤其是其他线程)都可以看到该字段的值。
然后,如果我将变量定义为 volatile,首先 threadA 将读取其值,threadA 将更新其值并将其写入内存。之后该变量将对 threadB 可见。那我为什么需要同步块呢?
【问题讨论】:
-
我建议你做一些independent reading。这个问题比你意识到的要复杂得多。但举个简单的例子——如果我想以原子方式设置 两个 变量怎么办?
-
另外推荐:《Java并发实战》
-
@dnault 鉴于当时的问题,这似乎有点太高级了......
-
@BoristheSpider 当您尝试以原子方式设置两个变量时,您将使用 volatile 定义这两个变量,并且 volatile 字段的值将对所有其他线程变得不可见,直到第一个线程完成其工作。顺便说一句,您的链接支持我的想法。如果将 c 变量定义为 volatile,则不再需要同步方法。
-
@hellzone 非常非常错误和非常危险的话。
c++和c--不是原子操作,volatile不会帮助你。欢迎来到并发世界...
标签: java multithreading