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

锁定可变对象-为什么将其视为不良做法?

易阳朔
2023-03-14
问题内容

看到这个答案。它说:

六个非常糟糕的例子;

锁定在可变字段上。例如,synced(object){object = …; }

锁定可变字段有什么问题?如果object被声明为final但不是不可变的类怎么办?


问题答案:

这是一个坏主意,因为如果另一个线程更改了关键部分中的引用,则这些线程将不再看到相同的引用,因此它们将不会在同一对象上同步,从而不受控制地运行。例:

 synchronized(lock1) {
     lock1 = new Object();
     sharedVariable++;
 }

假设有2个线程试图进入此关键部分。线程1进入,线程2等待。线程1进入,重新分配lock1并继续。现在,线程2看到的锁与线程1获得的锁不同,后者也是免费的,因此它也可以进入关键部分。随之而来的是有趣!

如果对象为final,则无法将引用重新分配给其他对象,因此上述问题不再适用。



 类似资料:
  • 问题内容: 有一个很大的材料了有这表明印刷异常的堆栈跟踪是不好的做法。 例如从Checkexp中的RegexpSingleline检查: 可以使用此检查来查找常见的不良做法,例如调用ex.printStacktrace() 但是,我正在努力寻找能够给出正当理由的任何地方,因为肯定可以使堆栈跟踪对于跟踪导致异常的原因非常有用。我知道的事情: 最终用户永远不应看到堆栈跟踪(出于用户体验和安全目的) 生

  • 问题内容: 我一直看到警告,不要在JavaScript中使用全局变量,但是似乎人们说这的唯一原因是因为阻塞了全局名称空间。我可以想象通过将所有变量放入一个大对象中来轻松解决此问题。现在的问题是:除了方便起见,还有其他原因不使用全局变量吗?它们是否涉及任何性能或兼容性问题? 问题答案: 它们使全局名称空间混乱,并且查找速度比局部变量慢。 首先,拥有许多全局变量始终是一件坏事,因为很容易忘记您在某个地

  • 问题内容: 我目前遇到一个问题,我有两个我需要调用的模块,它们需要能够修改相同的变量。 我决定创建一个名为的全局变量,并在其中存储所需的变量。 但是我一直在阅读,使用全局变量是一种不好的做法。为什么? 我仅创建一个变量,该变量不应与其他任何冲突,因为它是我的应用程序的名称。 问题答案: 几乎在所有编程语言中,全局变量都被视为反模式,因为它们使遵循和调试代码变得非常困难。 浏览代码时,您永远不知道哪

  • 问题内容: 以及你使用哪种替代策略来避免LazyLoadExceptions? 我确实了解到公开会议存在以下问题: 在不同的jvm中运行的分层应用程序 事务仅在最后提交,最有可能你希望在结果之前提交。 但是,如果你知道你的应用程序在单个vm上运行,为什么不通过使用开放会话视图策略来减轻痛苦呢? 问题答案: 因为从性能和理解的角度来看,在视图层中发送可能未初始化的代理(尤其是集合)并从那里触发hib

  • 可变一的示例和说明如下: 它不起作用的第一个原因 它不起作用的最明显的原因是初始化Helper对象的写操作和对Helper字段的写操作可能不按顺序进行或被感知。因此,调用getHelper()的线程可以看到对helper对象的非空引用,但看到的是helper对象字段的默认值,而不是构造函数中设置的值。 谢谢

  • 问题内容: 就像标题所问的那样,Django伙计们为什么决定使用querydict来实现request.POST对象(当然,这又使整个事情变得不可变了?) 我知道你可以通过复制帖子数据来对其进行更改 但是为什么呢?当然,仅允许事物变得易变会更简单吗?还是由于其他原因使用它而可能导致问题? 问题答案: 这是一个谜,不是吗?在调查中,一些表面上似乎合理的理论是错误的: 这样POST对象就不必实现变异方