2017-10-13 179 views
3

我迁移我的EJB豆类和我有并发 问题上的一些豆类我对方法和类注释@Lock(LockType.READ)@Lock(LockType.WRITE)当并发由容器管理的,但在Spring并发性是由bean管理的,我可以在Spring中做什么等同于锁定两个同时读/写操作?的Java EJB迁移到Spring

例如这个类:

@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; 
    } 
} 

回答

1

@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的正确使用。

如果您有更多的陈述,而这不能被援引原子和其它客户的透明的方式,你可以在当前对象上使用​​声明:

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