当前位置: 首页 > 面试题库 >

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

满博
2023-03-14
问题内容

我有一些Java代码可以获取并设置会话属性:

Object obj = session.getAttribute(TEST_ATTR);
if (obj==null) {
  obj = new MyObject();
  session.setAttribute(obj);
}

为了使该代码具有线程安全性,我想将其包装在一个同步块中。但是我该怎么用做锁定对象呢?使用会话是否有意义?

synchronized (session) {
  Object obj = session.getAttribute(TEST_ATTR);
  if (obj==null) {
    obj = new MyObject();
    session.setAttribute(obj);
  }
}

问题答案:

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



 类似资料:
  • Hibernate有悲观锁定机制,可以用来锁定数据库行。 session.lock(Object对象,LockMode锁模式)。 假设我锁定了一个对象: > 如果其他线程也发出上述语句 1,会发生什么?该线程会简单地阻塞吗?还是会得到某种异常?像 CannotAcquireLock 异常这样的东西?我想了解 1,2,3 的行为。 如果线程获取了锁然后死亡会发生什么?锁会自动释放吗?还是记录永远锁定

  • 问题内容: 在Windows上是否可以通过Python脚本锁定PC? 我不想自己实施某种锁定-我想使用与用户在开始菜单中按+或锁定机器时也使用的锁定屏幕相同的锁定屏幕。 问题答案: 这可以通过 user32.dll中 的函数来完成: __ 此功能与按Ctrl + Alt + Del并单击“锁定工作站”具有相同的结果。 在Python中,可以使用Python stdlib中的ctypes / win

  • 问题内容: 这些通话实际上对会话意味着什么? 输出值 问题答案: 在服务方法内部,我们请求会话,并且所有事情都会自动获取,就像创建HttpSession对象一样。无需生成唯一的会话ID。无需创建新的Cookie对象。一切都会在后台自动发生。 调用请求对象的方法后,容器将立即创建会话的新对象,并生成一个唯一的会话ID来维护会话。该会话ID被传输回响应对象,以便每当客户端发出任何请求时,它也应将会话I

  • 问题内容: 输出是 线程1开始 线程1的内部演示 线程2开始 线程2的内部演示 由于,执行尚未结束。 我已经通过类的同一个实例来的两个类的构造函数和。 对in 的调用位于一个块中。 要在通话中是 没有 的块。 所以,当被执行时,由于块,的监视器应锁定,导致拒绝访问,以由所述。 但是,这没有发生。 预期的输出是 (输出在完成之前。) 因此,我的基本问题是: 即使 尚未完成 块, 如何成功执行? 问题

  • 问题内容: 以下代码抛出。 这是输出: 怎么可能为空? 问题答案: 以下是有关瞬时变量的一些事实: - 当在实例变量上使用Transient关键字时,将 防止该实例变量被序列化。 - 在反序列化时,瞬态变量将恢复为其 默认值 ..... 例如: 对象引用变量 诠释为 boolean to etc ....... 所以这就是您反序列化时得到a的原因…

  • 问题内容: 我在这里思考:如果您有2个线程执行需要同步的FAST操作,那么非阻塞方法不是比阻塞/上下文切换方法更快/更好的方法吗? 非阻塞的意思是: while(true){如果(checkAndGetTheLock())中断;} 如果您有太多线程在锁中循环,我唯一想到的就是饥饿(CPU耗尽)。 如何平衡一种方法与另一种方法? 问题答案: 以下是 Java Concurrency in Pract