2011-08-24 36 views
9

我已经开始阅读关于单例会话bean和用于使用容器管理的并发的注释。与单纯使用'synchronized'关键字相比,我没有看到这个好处,所以我怀疑有一些重要的东西我错过了。从书“Enterprise JavaBeans 3.1”由Rubinger &伯克认为这个例子中,奥莱理:EJB 3.1容器管理并发与同步

@javax.ejb.Lock(javax.ejb.LockType.READ) 
public String concurrentReadOnlyMethod(){...} 

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

这怎么比读情况下,所有toghether省略了注释,并在写的情况下使用​​关键字更好,像这样:

public String concurrentReadOnlyMethod(){...} 

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

回答

4

简单。

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

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

+1

如果我理解正确,我可以像这样非正式地说:给定一个包含上述两个方法的类,使用容器管理并发性,语义是“只要没有写入就允许并发读取”。对比例的语义是“允许并发读取,也可以在写入时进行,但一次只能写入一个线程”。 –

+0

是的,它总结得非常好。 –

+0

您可以给我一个EJB 3.1中READ/WRITE锁定语义的参考吗?即使在规范中我也找不到它。 – illEatYourPuppies

2

好,由威尔所说,与​​你不能真正复制的javax.ejb.Lock注释的行为,但实际上你可以通过使用ReadWriteLock锁做到这一点,但是这到底是更多的工作。

作为一个方面说明,因为singleton实例不是跨多个JVM(即它们不是分布式对象)共享的,所以我认为Lock确实没有其他好处,它提供了易用性和开箱即用性支持。

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