EJB 3.1容器管理并发与同步

我已经开始阅读有关单例会话bean和用于使用容器管理并发的注释。 与简单地使用’synchronized’关键字相比,我没有看到这样的好处,所以我怀疑有一些重要的东西我不知道。 从Rubinger&Burke,O’Reilly的书“ Enterprise JavaBeans 3.1 ”中考虑这个例子:

@javax.ejb.Lock(javax.ejb.LockType.READ) public String concurrentReadOnlyMethod(){...} @javax.ejb.Lock(javax.ejb.LockType.WRITE) public void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

这比在read-case和在write-case中使用synchronized关键字更好地省略注释更好,如下所示:

 public String concurrentReadOnlyMethod(){...} public synchronized void allowOnlyOneWriteAtATimeMethod(String stringToSet){...} 

简单。

“concurrentReadOnlyMethod”根本不同步,因此它不会获得同步的其他副作用(例如对内存模型中的变量的影响)。 此外,READ锁定将阻止WRITE锁定,因此只需同步,您可以同时运行两个方法的两个线程,而使用READ / WRITE锁定则不会。

显然,当你有几个READ锁和少量WRITE锁时,有更多的价值,因为所有的READ锁都可以共享并同时运行,而WRITE锁更像普通的同步。

好吧,正如Will所提到的,使用synchronized你实际上无法复制javax.ejb.Lock注释的行为,但你实际上可以通过使用ReadWriteLock锁来实现它,但这最终会有更多的工作。

作为旁注,由于单个实例不是在多个JVM之间共享的(这意味着它们不是分布式对象),因此我认为没有其他好处, Lock提供了易用性和开箱即用支持。

还请注意“如果不使用此注释,则假定为Lock(WRITE)的值”,因此您无法真正摆脱它。