【发布时间】:2016-12-13 12:50:23
【问题描述】:
我有一位制作人:
maintains ref StateRef to object StateObj
implements method modify() method which modifies StateObj
implements getRef() method which will be used by consumers
我有多个消费者获得对 StateObj 的引用并读取 StateObj
(生产者:修改 stateObj,消费者读取(仅)stateObj)
所以在典型的设计中,我需要消费者的读锁和生产者的写锁,这可能是低效的。
但由于只有一个 writer,我将 modify() 方法编写为:
1. Ref refToCloneCopy = StateRef.clone()
2. update(refToCloneCopy)
3. StateRef = refToCloneCopy
优点:我不必对消费者强制执行读锁定。
我想确保在第 3 步未完成之前“getRef()”将继续将 ref 返回到 StateObj,并且在第 3 步之后“getRef”将返回 ref 到 newState/ClonedObj
没有竞争条件或一致性的要求,即如果一半消费者收到对 oldState 的引用,而另一半消费者收到对 newState(clonedObj) 的引用,则可以。但是 getRef 不应该返回一些奇怪的 ref 值,它应该返回 oldState 或 new State。
我为此使用 Java8。 ... 在消费者端或生产者端没有过多(或否)锁定的情况下有效处理此问题的最佳方法是什么?
更新: 即使我们决定在上面的第三步中锁定,我想确保作者/生产者的锁定请求应该比消费者的锁定请求具有更高的优先级
【问题讨论】:
标签: java java-8 locking synchronized producer-consumer