Java EJB 迁移到 Spring
Java EJB migration to Spring
我正在将我的 EJB 迁移到 Spring bean,我遇到了并发问题
在某些 bean 上,我在方法上有注释 @Lock(LockType.READ)
或 @Lock(LockType.WRITE)
,当并发由容器管理时,我有 class,但在 Spring 并发中由 bean 管理,关于锁定两个同时的 read/write 操作,我在 Spring 中可以做些什么?
例如关于这个 class :
@Singleton
@Lock(READ)
public class SharedSingletonBean {
private String data;
private String status;
public String getData() {
return data;
}
public String getStatus() {
return status;
}
@Lock(WRITE)
public void setStatus(String newStatus) {
status = newStatus;
}
}
对于 @Lock(READ)
,您无需执行任何操作,因为 READ
值意味着该方法仅进行读取,并且可以与多个客户端同时访问或共享。
例如这两种方法的情况:
public String getData() {
return data;
}
public String getStatus() {
return status;
}
对于 @Lock(WRITE)
作为这个:
@Lock(WRITE)
public void setStatus(String newStatus) {
status = newStatus;
}
表示该方法是写的
所以实际上,WRITE
值使容器阻止任何客户端在另一个客户端执行它时调用该方法。
要对 Spring 做同样的事情,对 String
字段使用 volatile
修饰符就足够了,因为您只在方法中进行赋值。
您不会有并发性或没有更新值问题,因为 volatile
变量的赋值始终是原子的并且为其他线程更新并且使用此解决方案,就像在您的实际情况中一样,最后一个客户端总是正确的。
另外,作为旁注,我不太相信 @Lock READ
和 WRITE
在这里的正确使用。
如果您有更多语句,并且无法以原子方式和对其他客户端透明的方式调用它,您可以在当前对象上使用 synchronized
语句:
public void setStatus(String newStatus) {
synchronize(this){
myStatement();
myOtherStatement();
status = newStatus;
}
}
我正在将我的 EJB 迁移到 Spring bean,我遇到了并发问题
在某些 bean 上,我在方法上有注释 @Lock(LockType.READ)
或 @Lock(LockType.WRITE)
,当并发由容器管理时,我有 class,但在 Spring 并发中由 bean 管理,关于锁定两个同时的 read/write 操作,我在 Spring 中可以做些什么?
例如关于这个 class :
@Singleton
@Lock(READ)
public class SharedSingletonBean {
private String data;
private String status;
public String getData() {
return data;
}
public String getStatus() {
return status;
}
@Lock(WRITE)
public void setStatus(String newStatus) {
status = newStatus;
}
}
对于 @Lock(READ)
,您无需执行任何操作,因为 READ
值意味着该方法仅进行读取,并且可以与多个客户端同时访问或共享。
例如这两种方法的情况:
public String getData() {
return data;
}
public String getStatus() {
return status;
}
对于 @Lock(WRITE)
作为这个:
@Lock(WRITE)
public void setStatus(String newStatus) {
status = newStatus;
}
表示该方法是写的
所以实际上,WRITE
值使容器阻止任何客户端在另一个客户端执行它时调用该方法。
要对 Spring 做同样的事情,对 String
字段使用 volatile
修饰符就足够了,因为您只在方法中进行赋值。
您不会有并发性或没有更新值问题,因为 volatile
变量的赋值始终是原子的并且为其他线程更新并且使用此解决方案,就像在您的实际情况中一样,最后一个客户端总是正确的。
另外,作为旁注,我不太相信 @Lock READ
和 WRITE
在这里的正确使用。
如果您有更多语句,并且无法以原子方式和对其他客户端透明的方式调用它,您可以在当前对象上使用 synchronized
语句:
public void setStatus(String newStatus) {
synchronize(this){
myStatement();
myOtherStatement();
status = newStatus;
}
}