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 READWRITE 在这里的正确使用。

如果您有更多语句,并且无法以原子方式和对其他客户端透明的方式调用它,您可以在当前对象上使用 synchronized 语句:

 public void setStatus(String newStatus) {
    synchronize(this){
       myStatement();
       myOtherStatement();
       status = newStatus;
    }
  }