2013-08-05 28 views
0

我有一类ReadWriteLock和方法的一个子集开始与以下常见前奏:同步/锁定/ GuardedBy诠释锁定实例

rwLock.readLock().lock(); 
try { 
    ... 
} finally { 
    rwLock.readLock.unlock(); 
} 

和方法的另一个子集,利用相同的前奏,​​但这次使用writeLock()代替。我觉得这种编码风格很冗长(丑陋?),并且正在通过注释寻找替代方式。 是否有任何同步注释可以预先添加到我的方法/变量ala @Synchronized(rwLock.readLock())@Synchronized(rwLock.writeLock())

我发现有是Java EE一个@Lock,但它有两大缺点:1)对于这样一个简单的要求,我不希望从SE移动到EE和2),它并不需要一个Lock对象作为参数并使用其自己的ReadWriteLock实例。

另一种替代方法是将Lock封装成一个AutoClosable并使用try (AutoClosable acLock = new AutoClosableLock(lock)) { ... },它引入了一个虚拟变量(acLock)和实例化每次新AutoClosableLock

+0

考虑到这是java.util.concurrent类所使用的习惯用法,锁类的设计者,我会认为你不能做得更好。 – assylias

回答

0

我倾向于使用同步,除非有真正的理由不这样做。在这些比较罕见的情况下,我会根据您的建议使用Lock。我将代码封装在方法中,一旦它们工作,我就不再看它们了。我不觉得所有的代码都需要看起来很漂亮,尤其是低级代码(在Java中很难做到这一点)

+0

很多时候,方法访问是只读的,很少有更新类字段。因此,使用'synchronized'将会是不公平的,定期的读操作会被不必要地阻塞。 –

+0

@VolkanYazıcı这是一个很好的例子,你应该使用RedWriteLock。但是,除非经常出现这种情况,否则您可能会发现性能差异不大,简单的代码更可取。例如,我不会改变它,除非我看到它在proifler中是个问题。通常,如果您不测量性能要求,那么您只是在猜测。 –