为什么 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"(也许不一定是关键字,而是实现)。
这是 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 successfulLock
action.- A successful
unlock
operation has the same memory synchronization effects as a successfulUnlock
action.
换句话说,隐式锁是"volatile"(也许不一定是关键字,而是实现)。