【发布时间】:2014-07-17 09:18:36
【问题描述】:
我在 StackOverflow 上的一条好评评论中读到了这篇文章:
但是如果你想安全的话,你可以添加简单的 synchronized(this) {} 在你的最后@PostConstruct [方法]
[注意变量不是易变的]
我在想 happens-before 只有在写入和读取都在 synchronized 块中执行或至少读取是易失性的情况下才会强制执行。
引用的句子正确吗?空的synchronized(this) {} 块是否会将当前方法中更改的所有变量刷新到“一般可见”内存?
请考虑一些场景
如果第二个线程从不对
this调用锁怎么办? (假设第二个线程以其他方法读取)。请记住,问题是关于:将更改刷新到其他线程,而不是为其他线程提供一种方式(同步)来轮询原始线程所做的更改。在 Spring@PostConstruct上下文中,其他方法也很可能不同步 - 正如原始评论所说。是否仅在另一个线程的第二次和后续调用中强制更改的内存可见性? (请记住,这个同步块是我们方法中的最后一次调用)——这会将这种同步方式标记为非常糟糕的做法(第一次调用中的值过时)
【问题讨论】:
标签: java concurrency synchronized volatile memory-model