Java 线程/易失性

2024-01-08

我有一个线程:

class Foo extends Thread
{
    boolean active = true;

    public void run()
    {
        while(active)
        {
            //do stuff
        }
    }

    public void end()
    {
        active = false;
    }

    public void hibernate()
    {
        synchronized(this)
        {
            wait();
        }
    }
 }

如果另一个线程调用end(), will Foo立即看到active is now false?具体来说,因为active isn't volatile,我不确定它会。我最初创建的end()作为避免不稳定的聪明方法,但现在我不确定它是否真的会达到我的预期。 另外,如果另一个线程调用hibernate(),哪个线程将进入睡眠状态?我打算Foo睡觉,所以如果这不能达到我的目的,那么非常欢迎其他建议。


如果另一个线程调用 end(),Foo 会立即看到 active 现在为 false 吗?

不,不会。或者至少,它不会一直看到它。

如果你想run为了始终立即看到新值,分配给变量的线程和读取变量的线程之间必须存在“随后出现”的关系。这可以实现:

  • 通过声明active易挥发的,
  • 通过把synchronized围绕读取和写入变量的语句进行块,
  • 通过使变量成为“原子”类型;例如AtomicBoolean, or
  • 通过使用其他一些适当的并发类;看到java.util.concurrent.*包。

...避免波动的巧妙方法...

将变量声明为易失性是确保正确同步的一种方法。事实上,正确的同步会带来性能开销。然而,正确的同步对于应用程序的可靠工作至关重要,避免它并不“聪明”。

(如果没有适当的同步,您的程序可能在大多数时间仍然可以工作,甚至可能总是在某些机器上工作。但是,有时它不会工作,实际行为可能取决于您运行该程序的机器,机器负载是什么,以及其他事情。)

另外,如果另一个线程调用 hibernate(),哪个线程会进入睡眠状态?

发出调用的线程将进入睡眠状态。除非其他线程执行以下操作,否则它不会醒来notify or notifyAll在同一个 Foo 对象上。

如果您只是想让应用程序进入睡眠状态并稍后唤醒,请使用Thread.sleep。但要注意使用sleep错误的方式可能会使您的应用程序变得缓慢且无响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 线程/易失性 的相关文章

  • 实现与扩展:何时使用?有什么不同?

    请用易于理解的语言进行解释或提供某些文章的链接 extends is for 延伸一类 implements is for 实施一个接口 接口和常规类之间的区别在于 在接口中您不能实现任何声明的方法 只有 实现 接口的类才能实现方法 C 中
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • 使用除 SINGLE_TABLE 之外的任何其他 Hibernate 继承策略时 JVM 崩溃

    好吧 这可能不太可能 但还是这样吧 在Java JRE 1 6 0 26 b03 中我有两个类 SuperControl及其子类SubControl 它们都需要是持久对象 我正在使用 Hibernate Annotations 来实现这一点
  • firebase推送通知错误Spring Boot服务器端

    我正在尝试从 Spring Boot 服务器端发送通知到客户端 android 服务器运行良好 一切都很好 2020 09 01 08 13 07 691 INFO 18941 restartedMain e DevToolsPropert
  • RSA SignatureException:签名长度不正确

    我在签署 rsa 签名时遇到问题 我有一个用私钥加密的签名 然而 当我尝试使用公钥验证它时遇到问题 我得到以下异常 java security SignatureException Signature length not correct
  • 是否可以从另一个方法传递 args[] 来调用 main 方法?

    我试图从另一个传递参数的方法调用类的主要方法 就像从命令行运行该类时一样 有没有办法做到这一点 您可以致电main方法就像您调用任何其他 静态 方法一样 MyClass main new String arg1 arg2 arg3 Exam
  • 正确使用 JDBC 连接池 (Glassfish)

    我需要在 Java Web 服务中作为会话 bean 实现数据库连接 但我不确定我这样做是否正确 我创建了一个类 public final class SQLUtils private static DataSource m ds null
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • BlackBerry SQLite:将一个 SQLite 数据库连接到另一个

    我正在尝试使用 SQLite 将一个 SQLite 数据库附加到 BlackBerry 上的另一个数据库附加数据库 http www sqlite org lang attach html命令 Database d1 d2 Statemen
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • 不要模拟值对象:过于通用的规则,没有解释

    以下是 Mockito 单元测试框架的引用 不要模拟值对象 为什么有人会想要这样做呢 因为实例化对象太痛苦了 gt 无效 原因 如果创造新的装置太困难 那就是一个迹象 代码可能需要一些认真的重构 另一种方法是创建 价值对象的构建者 有一些工
  • 如何通过子 POJO 的属性过滤复合 ManyToMany POJO?

    我有两个像这样的房间实体 Entity public class Teacher implements Serializable PrimaryKey autoGenerate true public int id ColumnInfo n
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • H2 - (相当)长的 INSERT 失败,错误 42000

    H2 内存中 插入 错误 42000 尝试过版本 1 4 196 1 4 197 1 4 199 我还尝试在 H2 服务器 本地 上执行 INSERT 也失败 给出错误的行 抱歉 但出于安全原因 我无法生成更多 INSERT INTO tb
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • 将带有 webapp 的 WAR 部署到 Maven 中央存储库是否有意义?

    这样做有意义吗 如果是 我在哪里可以找到使用简单的 Web Hello World 执行此操作的示例 当人们从 Maven 执行 Web 应用程序时 他们会使用 Jetty 来运行它吗 我想 tomcat 太重了 任何帮助将不胜感激 谢谢
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav
  • 我找不到 IntelliJ 快捷方式

    我使用 vim 一段时间 我知道有一个 intellij vim 插件 我很好奇内置的 IntelliJ 文本导航存在什么 如何打开实时模板来创建模板 如何查看以 tr 开头的现有模板列表 如何进行全局搜索并在当前文档中进行搜索 然后转到下

随机推荐

  • 采用可选块参数的子例程

    与接受的原型相关的注意事项尽管如此 以下两个设计的子程序是否可以存在于同一包中 即提供一个可选的块参数 例如sort does sub myprint for print n sub myprint my block shift for p
  • 如何最好地合并多个字典中的值?

    我创建了一个函数 它接受字典的多个参数 并返回一个连接的字典 我在网上研究了一段时间关于连接合并字典的内容并测试了有趣的字典 它们都会导致更新值 或覆盖它们 我的用例是传入字典 其中每个键都有一个值 并且想要一个具有相同或不同键的字典 以及
  • 使用 Android 读取 NXP ICODE SLI-L 标签

    我正在尝试在我的 Android 应用程序中读取 NXP 开发的 NFC 标签 可以使用 Android 读取标签 恩智浦应用程序 https play google com store apps details id com nxp ta
  • 如何将共生矩阵转换为稀疏矩阵

    我开始处理稀疏矩阵 所以我对这个主题并不是很精通 我的问题是 我有一个来自单词列表的简单共现矩阵 只是一个二维共现矩阵 逐字计算一个单词在同一上下文中出现的次数 由于语料库不是那么大 因此矩阵非常稀疏 我想将其转换为稀疏矩阵以便能够更好地处
  • 如何将 cordova-crosswalk 应用程序的 x86 和 ARM APK 发布到 Play 商店?

    我的应用程序是使用 Cordova 和 Crosswalk 开发 发布的 Crosswalk 生成一个适用于 ARM cpu 的 apk 和另一个适用于 x86 cpu 的 apk 目前 当我将 ARM apk 上传到 Play 商店 然后
  • SSRS 将多个数据集合并为一张图

    我一直在网上寻找一种在 SSRS 2008 R2 中完全组合数据集的方法 基本上 我需要创建一个由多个不同数据集 所有数据集具有相同的列 如下所示 组成的单个表和图表 这些数据集是从多个 SQL 服务器检索的 防止我将它们组合在单个查询中
  • 仅在 Python 中将 datetime 对象转换为日期字符串

    我看到很多关于将日期字符串转换为datetimePython 中的对象 但我想走另一条路 我有 datetime datetime 2012 2 23 0 0 我想将它转换为字符串 2 23 2012 您可以使用strftime http
  • Xamarin iOS 防止特定视图控制器旋转

    需要防止特定视图控制器上的屏幕旋转我在下面尝试过 public override bool ShouldAutorotateToInterfaceOrientation UIInterfaceOrientation toInterfaceO
  • Select2:动态隐藏某些选项

    基本上我正在寻找的是能够从所选项目的下拉列表中隐藏选项的能力 因此 从技术上讲 它们仍然是选项 但您只是无法单击它们 因为它们是隐藏的 我浏览了文档并发现了与禁用相关的内容 不幸的是我非常特别想要隐藏项目的能力 有人对如何实现这一目标有建议
  • 继承构造函数

    为什么这段代码 class A public explicit A int x class B public A int main void B b new B 5 delete b 导致这些错误 main cpp In function
  • Java 制作一个单独的注释,结合其他注释

    使用 Play Framework 2 2 制作 RESTful API 在我正在使用的模型中 我只想输出 Json with Jackson 相关对象的 Id 而不是整个对象 我找到了如何做到这一点 如下所示 JsonIdentityIn
  • 使用 FileProvider 在 Android N 上打开下载的文件

    由于 FileProvider 的更改 我必须修复适用于 Android N 的应用程序 我基本上已经阅读了关于这个主题的所有内容 但没有找到适合我的解决方案 这是我们之前的代码 它开始从我们的应用程序下载 并将它们存储在Download文
  • Dart/Flutter 中什么时候应该使用分号?

    我是 Dart Flutter 的初学者并尝试阅读this https dart dev guides language language tour但我仍然不明白什么时候使用分号 为什么我们不在小部件的每个括号末尾插入分号 Dart中有两种
  • 我可以查出坐标是否在城市内吗?

    假设我有一个 LatLng 对象 有什么方法可以检查它是否代表城市内的可能位置 如何获得城市的边界 我正在使用谷歌地图V3 您尝试过反向地理编码吗 http code google com apis maps documentation j
  • 程序收到信号:“EXC_BAD_ACCESS”

    我有一个字符串变量 它存储日期选择器中的日期 但是当我在其他函数中使用它的值时 我收到类似程序收到信号的错误 EXC BAD ACCESS 注意 变量是全局定义的 code void changedDate UIDatePicker pic
  • 从相机预览中的触摸事件中检索准确的 RGB 值

    我一直在开发一个 Android 应用程序 它只需要检索并在相机预览上显示触摸事件的坐标和 RGB 值 我是这种编程语言的初学者 我只是想尝试一下 但应用程序在触摸事件期间不断崩溃 这是我在 Android 中尝试过的代码 When cop
  • 在 PyQt 中显示其他语言字符

    PyQt4 有没有办法显示其他语言字符 如果有 我应该采取什么方法 方向 提前致谢 Qt 使用 Unicode 并且应该能够以您拥有合适字体的任何语言显示 Unicode 文本 例如 Roberto Alesina 的简单 Hello Wo
  • 新的“dynamic”C# 4.0 关键字是否弃用了“var”关键字?

    当 C 4 0 出现时 我们有了如此处描述的动态关键字excellent presentation by Anders Hejlsberg http channel9 msdn com pdc2008 TL16 C 的发展速度比我能跟上的要
  • OSGi - 这项技术有多成熟?

    我有一个要求 我需要共享一些网络资源 jsp html js images css等 跨越不同Spring based Struts 2应用程序 似乎OSGi可以用来实现这个吗 有人可以指点一下如何实现这一目标吗OSGi 其次我想知道的是O
  • Java 线程/易失性

    我有一个线程 class Foo extends Thread boolean active true public void run while active do stuff public void end active false p