如果我访问同步方法或同步块内的对象,那么被访问的元素中的所有对象都是否同步?
想象一下,有一个对象队列具有同步的add()和take()方法,接受并发出复杂对象Thing.事情有很多列表与其他不同的对象.
现在图像线程在创建Thing之前,将一些现有对象放入Thing中,修改其中的一些对象等等. Before线程添加了Thing to Queue.稍后线程从队列中夺取事情.
问题:将Thing及其所有子项/子对象处于与离开之前相同的状态?即使线程之后也许在这些子元素之一稍早工作?因为我为线程映像处理器可能在该子元素上仍然可能有一些缓存信息(该子对象的地址仍然相同).所有这些缓存的东西只能通过以同步方式访问父对象Thing而无效?
请不要给出使用并发库等答案.我想了解发生了什么.
解决方法
Java内存模型中的重要概念是
happens-before order.读取操作之前发生的写入操作的结果对于这些读取操作是可见的.其他结果可能或可能不可见.
事件发生的顺序是由线程之间的动作的同步顺序以及单个线程中的自然动作顺序引起的.
如果你在一个对象之前进行同步(例如你的队列),并且在此同步块内部或之前对Thing及其“子对象”进行所有的操作,并且在同一个队列中同步并在这个对象之后读取这些对象同步块,那么所有这些更改都可见到After.