我开始阅读有关单例会话bean和用于使用容器管理并发的注释的内容。与简单地使用'synchronized'关键字相比,我没有看到这样的好处,所以我怀疑有一些重要的东西我不知道。考虑Rubinger& amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;伯克,奥莱利:
@javax.ejb.Lock(javax.ejb.LockType.READ)
public String concurrentReadOnlyMethod(){...}
@javax.ejb.Lock(javax.ejb.LockType.WRITE)
public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...}
在阅读案例和在写案例中使用synchronized
关键字时,如何更好地省略注释,如下所示:
public String concurrentReadOnlyMethod(){...}
public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...}
答案 0 :(得分:4)
简单。
“concurrentReadOnlyMethod”根本不同步,因此它不会获得同步的其他副作用(例如对内存模型中的变量的影响)。此外,READ锁定将阻止WRITE锁定,因此只需同步,您可以同时运行两个方法的两个线程,而使用READ / WRITE锁定则不会。“/ / p>
显然,当你有几个READ锁和几个WRITE锁时会有更多的价值,因为所有的READ锁都可以共享并同时运行,而WRITE锁更像普通的同步。
答案 1 :(得分:2)
好吧,正如Will所提到的,使用synchronized
你实际上无法复制javax.ejb.Lock
注释的行为,但你实际上可以通过使用ReadWriteLock
锁来实现,但这是最后还有更多的工作。
作为旁注,由于单个实例不在多个JVM之间共享(意味着它们不是分布式对象),因此我认为没有其他好处Lock
提供了易用性和外观盒子支持。
请注意“如果不使用此注释,则假定为Lock(WRITE)的值”,因此您无法真正摆脱它。