使用request.getSession()作为锁定对象?

MCS*_*MCS 11 java concurrency session locking thread-safety

我有一些获取和设置会话属性的java代码:

Object obj = session.getAttribute(TEST_ATTR);
if (obj==null) {
  obj = new MyObject();
  session.setAttribute(obj);
}
Run Code Online (Sandbox Code Playgroud)

为了使这段代码成为线程安全的,我想将它包装在一个synchronized块中.但是我用什么作为锁定对象呢?使用会话是否有意义?

synchronized (session) {
  Object obj = session.getAttribute(TEST_ATTR);
  if (obj==null) {
    obj = new MyObject();
    session.setAttribute(obj);
  }
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 5

使用您无法控制的锁通常会让人皱眉。锁的范围应尽可能紧密,并且由于会话或多或少是全局对象,因此不适合使用。尝试使用与java.util.concurrent.locks包不同的锁,并将其范围限定到您的类。