比较这个Java EE企业javabean:
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class BMC {}
..用这个bean:
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Lock(LockType.READ)
public class CMC {}
因为容器管理的并发是默认的,所以可以像这样重写第二个bean:
@Singleton
@Lock(LockType.READ)
public class CMC {}
因此它让我感到奇怪。有什么不同?我可以 1)关闭容器管理的并发,就像我在BMC
类中一样,或者我可以 2)使用容器管理的并发但是注释类像我在CMC
课上那样读锁。只要我没有在类声明的某处放入写锁,CMC
类就已经有效地关闭了容器管理的并发控制。
可以说我演示的两个结构之间存在技术差异吗?有没有争论为什么一个结构比另一个结构更好或更受欢迎?
答案 0 :(得分:2)
根据LockType.WRITE javadoc使用LockType.READ确实创建了一个锁。此锁允许执行具有READ锁的其他方法,但阻止任何具有WRITE锁的方法运行,直到释放READ锁。
除非使用容器管理的并发,否则肯定会有一些与创建READ锁相关的开销(可能是最小的并且不明显),除非使用容器管理并发,否则不会遇到。
对于不同的人或不同的情况或不同的优先级,哪个更好可能有不同的答案。
答案 1 :(得分:-4)
Bean开发人员负责管理对bean实例的并发访问。
Container负责管理对bean实例的并发访问。
http://docs.oracle.com/javaee/6/api/javax/ejb/ConcurrencyManagementType.html