为什么Java EE单例会话bean的字段不必是volatile?

时间:2015-01-10 09:39:28

标签: java-ee singleton volatile

以下是来自Java EE教程的单例会话bean示例:

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
@Singleton
public class ExampleSingletonBean {

    private String state;

    @Lock(LockType.READ)
    public String getState() {
        return state;
    }

    @Lock(LockType.WRITE)
    public void setState(String newState) {
        state = newState;
    }
}

private String state字段如何变得不稳定?应用程序服务器如何保证此引用永远不会针对不同的同时HTTP请求进行本地线程缓存?

1 个答案:

答案 0 :(得分:1)

正如here所述,当您使用CONTAINER时,会使用Lock

现在锁本身以某种方式模仿volatile,可以阅读here

  

所有Lock实施都必须强制执行   相同的内存同步   由内置提供的语义   监视器锁,如Java中所述   语言规范,第三版   (17.4记忆模型):

     
      
  • 成功的lock操作有   相同的记忆同步效果   一个成功的Lock行动。
  •   
  • 成功   unlock操作具有相同的内存   同步效果为   成功的Unlock行动。
  •   

换句话说,隐式锁是" volatile" (可能不一定是关键字,而是实施)。