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

Why Java EE singleton session bean's fields don't have to be 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 请求在线程本地缓存?

here 所述,当您使用 CONTAINER 时,将使用 Lock

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

All Lock implementations must enforce the same memory synchronization semantics as provided by the built-in monitor lock, as described in The Java Language Specification, Third Edition (17.4 Memory Model):

  • A successful lock operation has the same memory synchronization effects as a successful Lock action.
  • A successful unlock operation has the same memory synchronization effects as a successful Unlock action.

换句话说,隐式锁是"volatile"(也许不一定是关键字,而是实现)。