EJB 3.1容器管理并发与同步

时间:2011-08-24 16:25:57

标签: java concurrency ejb-3.1

我开始阅读有关单例会话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){...}

2 个答案:

答案 0 :(得分:4)

简单。

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

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

答案 1 :(得分:2)

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

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

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