- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我指的是 Joshua Bloch Effective Java 的第 261 - 262 页
// Properly synchronized cooperative thread termination
public class StopThread {
private static boolean stopRequested;
private static synchronized void requestStop() {
stopRequested = true;
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested())
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
Note that both the write method (requestStop) and the read method (stop- Requested) are synchronized. It is not sufficient to synchronize only the write method! In fact, synchronization has no effect unless both read and write operations are synchronized.
Joshua 的示例在this
上同步。但是我的疑问是,synchronized
必须作用于同一个对象吗?比如说,如果我将代码更改为
private static void requestStop() {
synchronized(other_static_final_object_monitor) {
stopRequested = true;
}
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
这还能避免 active 失败吗?
也就是说,我们知道在读/写期间为同一对象获取监视器可以避免 active 失败(根据 Joshua Bloch 的示例)。 但是在读/写期间为不同的对象抓取监视器怎么样?
最佳答案
我不相信这是有保证的,尽管如果它在所有现有实现中确实是我也不会感到惊讶。 Java 语言规范,section 17.4.4声明如下:
An unlock action on monitor m synchronizes-with all subsequent lock actions on m (where subsequent is defined according to the synchronization order).
我相信在锁内读取/写入共享变量的所有安全性都源于规范中的要点 - 并且仅指定有关单个监视器上的锁定和解锁操作的任何内容。
编辑:即使这确实适用于单个变量,您也不想将它用于多个变量。如果您在拿着监视器时更新多个变量并且在拿着监视器时只从它们读取,您可以确保您始终读取一组一致的数据:在您完成之前没有任何东西会写入变量 Y阅读它,但在您读取变量 X 之后。如果您使用不同的监视器进行读取和写入,那么一致性就会消失:在您读取它们时,值可以随时更改。
关于java - 关于避免 liveness failure 的疑惑——在 Effective Java 中讨论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744085/
问题:您好,我已经为我的一个客户创建了一个 DBMS,其中有一个功能,即从相同的表单输入将值拆分为四个不同的表(但是)有时会发生值输入到 table1 和 table2 而不是 table3 和 ta
我正在开发基于 Web 的应用程序,该应用程序需要在将任何文件上传到服务器之前检查其大小。 如果 Web 开发人员可以通过任何方式在客户端检查文件大小而不是在服务器端检查文件大小,从而避免不必要的服务
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 5年前关闭。
好的,这个线程将更像是对标题中提到的主题的讨论。我一遍又一遍地搜索整个主题,但没有找到适合我的好/可接受的解决方案。 场景 假设我有一个 android 项目,我需要一个第三方库(例如 drag-so
我正在进行的项目使用用户创建的多个“墙”进行讨论。 我的问题涉及如何在 MySQL 数据库中对此进行建模。 拥有一个名为“walls”的表,其中包含诸如创建者等信息,以及另一个名为“messages”
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
发现了一个有趣的问题,我首先在 WinForms 中发现,然后在 Silverlight 中再次发现,而且在数据绑定(bind)方面也很可能是 WPF。 我有一个带有多个选项卡的选项卡控件。当用户点击
我正在用 VBA 编写一个方法,但我收到了 ByRef 参数类型不匹配。在做了一些研究之后,我找到了一个快速的解决方法——将我的值存储在另一个变量中,然后将该新变量传递给我的方法。谁能向我解释疯狂背后
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我一直在尝试修改 Odoo 讨论,但没有成功。 这就是我要实现的目标: 我将带有“新消息”按钮的消息添加到 Odoo 模块(在类 mro.order 中)。消息显示在讨论模块中: 但我需要标题类似于“
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
为任何错误的术语道歉——我对计算机科学很陌生,我几乎只知道 Clojure(但我想我会说我很了解它)。 所以,我没有对此进行大量研究,但有时我发现在编写 Clojure 代码时它很有用,以便能够从该数
a) 匿名卷 使用数据容器时,您可以像这样使用匿名卷 version '2' services: consumer: volume_from: - data-container
var yourObjects = [ { object: {obj1:"aa"}, direction: 'top' }, { object: "obj2", direction: 'left' }
我正在尝试使用 Disqus API 将帖子添加到现有的讨论/论坛。在文档中我可以读到我可以作为访客发送评论而无需身份验证。文档是这样说的: http://disqus.com/api/docs/po
因此,我偶然发现了一本名为“C++科学计算指南”的C++书的练习。 这是练习: “编写代码,为三个2×2矩阵的 double 浮点数A,B,C动态分配内存,并为A和B的条目分配值。令C = A +B。
规则 CA1008指定所有枚举都应具有 0 值,该值应命名为 Unknown(我们不在此处讨论标志)。我理解您想防止未初始化的值自动获得意义的原因。假设我定义了以下枚举: enum Gender {
前几天,Google 通知我,我的 Gmail 帐户可能已被盗用,因为它已被两个来自异常位置的 IP 地址访问。由于我通常(并且愚蠢地)为每个网站使用相同的密码,所以我决定改变一下并使用不同的密码。
RubyGems.org ,官方 gems 站点,提供的功能很差。我想为我的网站找到一些好的 gems,但这是不可能的——它只提供了几个“新 Gems”/“今天下载最多的” gems,以及所有的列表
我如何提取我博客中的最新对话(整个网站)并显示最近的 10 条评论作为来自 Disqus 的对话摘要? 最佳答案 您可以使用 Disqus 论坛/listPosts API 方法构建一个最新评论小部件
我是一名优秀的程序员,十分优秀!