一java内存刷新易失性:一个好的程序设计?

2023-12-03

这是与此相关的问题:java:在一个变量上使用 易失性 VS 每个变量

我有一个或多个不同的对象。我想改变其中的某些状态,然后我想让该状态对其他线程可见。

出于性能原因,我不想使该对象中的每个成员变量都是易失性的。 有时我想在单线程应用程序中使用这些对象。所以在这种情况下,挥发性也会很糟糕。

所以我有以下内容:

//these following mehtods change some internal variable state. These variables are not volatile or synchronized

boolean volatile memoryFlusher=false;

Thread1:

obj1->changeSomeState();
obj1->changeMoreState();
obj2->alsoSomeStateChange();

//and now i want to make that state visible to others

memoryFlusher=false; //volatile write


Thread2:

boolean tmp=memoryFlusher; // volatile read but variable is not used again

obj1->getState();
obj2->getState();

所以到目前为止,它或多或少与我一开始链接的相关问题相同。

所以现在我想问以下问题:

我的内存Flusher没有优化掉吗? (在我的其他问题中未得到解答) 每个易失性写入/读取都会刷新所有内存状态?其他(也是非易失性)变量?

现在真正的新问题是:

这是一个好的设计吗? 因为我没有在任何地方看到这样的代码,所以我发布在这里。

我应该以其他方式对我的 Progamm 进行编程吗? 是否还有其他最佳实践来提高性能并获得可见性? 在程序设计视图中是否还有其他最佳实践,而不是做这样的事情?

Edit:

我改变的状态是无关的。 所以我想要一个内存变量一个内存刷新器,并且没有锁定机制。它应该将大量的单个易失性变量替换为一个。在某个地方,我不需要显式的易失性内存刷新,因为我使用同步,例如

synchronized(x)
{
    ...
    obj1->stateChange() //if internally is used a volatile, then i have a volatile memory flush and later the synchronized-end memory-flush, i guess (is that right?)
    ...
}

这就是一个例子,它在哪里有用?

概括: 但这是否正确,我认为使用内存刷新的方式?


您的易失性读取和写入未得到优化,但我认为此代码没有任何用处。这可能就是为什么你在其他地方看不到它的原因。不过,你没有说出你的期望,所以谁知道呢?

看起来您想要确保 Thread2 可靠地读取 Thread1 所做的状态更改。嗯,只有当您确定 Thread2 中的代码实际运行时,这才有效after线程1中的代码。

你怎么知道情况是这样?

我建议if确实有任何方法可以确保 Thread2 代码发生在之后如果在 Thread1 代码中,那么已经存在一个内存屏障来证明这一事实,并且使您的 volatile 变量变得不必要。

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

一java内存刷新易失性:一个好的程序设计? 的相关文章

  • 解析 (yyyy-MM-dd) 格式的字符串日期

    我有一个 2013 09 18 形式的字符串 我想将其转换为 java util Date 我正在做这个 SimpleDateFormat sdf new SimpleDateFormat yyyy MM dd Date converted
  • C++ 11 相当于 java.util.ConcurrentHashMap

    我发现自己不断地编写互斥体代码 以便同步对 std unordered map 和其他容器的读 写访问 以便我可以像使用 java util concurrent 容器一样使用它们 我正要开始编写一个包装器来封装互斥体 但我宁愿使用经过良好
  • 如何在c#中指定时间后取消后台工作者

    如何在 C 中的指定时间后取消后台工作程序或取消无响应的后台工作程序 看看这个教程 http www albahari com threading part3 aspx http www albahari com threading par
  • 始终等待页面加载到 PageObjects 上

    因此 当出现问题时 我只是创建了一个简单的 selenium JBehave 代码 我将首先发布简化的代码 然后稍后解释我的问题是什么 所以这里我们有一个简单的 AbstractClass 它将在我的 PageObjects 上继承 此类仅
  • Android:TelephonyManager 类

    我不明白为什么 API 文档中这么写TelephonyManager类是public 但是当我尝试创建一个实例时 它说它不是公共类 并且无法从包中访问 我看到它也说使用Context getSystemService Context TEL
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 线程安全的异步字节队列

    我有一个回调方法 只要有新数据可用 就会调用该方法 public delegate void DataCallback byte buffer int offset int count 我想将其包装在一个实现与此类似的接口的类中 publi
  • 如何在 Java 中使用 HTML 解析器和 Apache Tika 来提取所有 HTML 标签?

    我下载了 tika core 和 tika parser 库 但找不到将 HTML 文档解析为字符串的示例代码 我必须删除网页源的所有 html 标签 我能做些什么 如何使用 Apache Tika 进行编码 您想要 html 文件的纯文本
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • IntelliJ - 无效源版本:17

    我已经在 IntelliJ 中使用 Gradle 创建了一个使用 Java 17 的新 Java 项目 运行我的应用程序时出现错误Cause error invalid source release 17 我的设置 我已经安装了openjd
  • gwt 文本框添加更改处理程序

    我有一个从设计师那里收到的文本框 但是我在 GWT 中编写了操作 问题是文本框为空 但是当通过按下按钮用值填充文本框时 将显示警报框 通知值已更改 但没有成功 帮助我 TextBox zip1 null function onModuleL
  • “强制更新快照/版本” - 这是什么意思

    在 Maven 项目中 选择 更新项目 时 有一个名为 强制更新快照 版本 的选项 它有什么作用 强制更新快照 版本 就像运行以下命令 mvn U install U 也可以用作 update snapshot 看here http boo
  • 短 2 个字节

    我正在从串行端口读取一个长度为 133 字节的数据包 最后 2 个字节包含 CRC 值 我使用 Java 将 2 个字节值制成单个 我认为很短 这就是我所做的 short high 48 0x00ff short low 80 short
  • 按钮悬停和按下效果 CSS Javafx

    我是 CSS 新手 为按钮定义了以下 CSS 样式 其中id并且应用了自定义样式 但不应用悬停和按下效果 bevel grey fx background color linear gradient f2f2f2 d6d6d6 linear
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • 空检查时可能未初始化错误

    我正在检查变量是否已初始化 但此时 netbeans 给了我variable reader might not have been initialized警告 我该如何解决 抑制这个问题 这是我的代码 摘要 final Reader rea
  • 如何在给定点停止线程?

    我试图停止一些线程 阅读一些有关优雅地执行此操作的正确方法的内容 但我一定做错了什么 因为它根本不起作用 起初我尝试不使用lock with IsRunning不稳定 然后尝试使用锁 这是我所拥有的 private volatile boo
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request
  • 将其元素添加到另一个列表后清除列表

    我正在做一个程序 它获取更多句子作为参数 我制作了 2 个列表 一个称为 propozitie 其中包含每个句子 另一个称为 propozitii 其中包含所有句子 问题是 当我在遇到 后清除 propozitie 列表时 它也会清除 pr

随机推荐

  • Java 重写私有函数不显示多态行为

    public class Shape final private void print System out println in class Shape public static void main String args Shape
  • 如何知道 onCreateView 函数中哪个选项卡处于活动状态?

    我如何知道我的哪个选项卡处于活动状态 public View onCreateView LayoutInflater inflater ViewGroup容器 Bundle savingInstanceState 函数 以下代码仅适用于首次
  • 调用 SwingWorker.get( ) 时防止 GUI 冻结

    我有一个程序 我正在加载文件 同时显示一个窗口以通知用户正在加载文件 我决定创建一个 FileLoader 类 它是一个 SwingWorker 它实际上处理加载文件 还有一个 ProgressWindow 它实现 PropertyChan
  • Java 砖块碰撞 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我一直在开发一款 Breakout 游戏 除了砖块碰撞之外 几乎所有的事情都完成了 球在墙壁和桨上弹跳得很好 但当它碰到砖块时 它会直接穿过它们 我很确定问题出在主类的 chec
  • RestSharp 忽略响应字符集编码

    我正在使用 RestSharp 版本 105 1 0 NET 4 5 1 对我们自己的 API 进行 REST 调用 此 API 发送带有以下特别感兴趣的标头的响应 Content Type application json Charset
  • 在 Java 中截取屏幕截图(机器人,代码可以工作,但不能与外部全屏应用程序一起使用)

    我使用以下代码来截取屏幕截图 Robot robot new Robot BufferedImage image robot createScreenCapture screenRectangle ImageIO write image p
  • 区分联合表中的行

    我正在使用此 sql 查询从两个不同的表中选择没有匹配列的数据 select from SELECT s shout id s user id s time FROM shouts s union all select v post id
  • Visual Studio 相当于 c++11(或更低版本)中的 gcc __attribute__((unused))?

    我正在尝试编写一个宏 以便在用户需要时使用抑制未使用的变量警告 例如 在派生类中 当您尚未实现整个类时 我知道我可以删除变量名称 但为了明确起见 我更喜欢宏 到目前为止我有这个 ifdef WIN32 define UNUSED x x e
  • 在 VS2013 中使用 VS2008 (v90) C++ 工具集?

    微软文档解释如何在 VS2013 中使用 2010 或 2012 工具集 有谁知道 2008 工具集是否也有向后支持 我正在从 2008 年升级到 2013 年的几个项目 但我的团队领导希望我们最初升级项目文件 但仍以与 2008 年相同的
  • Git svn 变基失败

    I use git svn跟踪 SVN 存储库 当我尝试做一个git svn rebase我收到此错误 Incomplete data Delta source ended unexpectedly 这是一个大型仓库 具有悠久的历史 仅仅获
  • MVC4 Windows 身份验证重定向到帐户/登录

    我正在设置Windows 身份验证在 MVC 4 应用程序中使用视觉工作室2013并使用IIS Express 开发服务器 但是 我被重定向到 Account Login 就好像我正在使用表单身份验证一样 我的 bin 文件夹 或任何地方
  • 在 RECEIVE_BOOT_COMPLETED 上通过广播接收器访问数据库

    当手机完成启动后 我想根据数据库中的小时 分钟 信息自动重新注册一些警报 我尝试使用广播接收器来执行此操作 但它不起作用 当尝试在启动时访问数据库 DB 帮助程序类时 它会崩溃 通过应用程序访问数据库帮助程序类时 它工作正常 这是可能的还是
  • boost::spirit::karma 输出引号内的字符串

    我正在尝试使用 boost spirit karma 转义引号中的字符串 如果它只是一个字符串 则效果很好 但是 对于 std vector 中 boost variant 中的字符串 则不然 只是打印字符串确实有效 但是我不太明白为什么
  • 字符串有隐藏字符,无法验证,

    大约2小时前我问了一个问题 不需要看问题 只是一个参考 使用node js存储图像出现错误 给出的解决方案实际上与我的代码相同 我试图找到我的代码和他的代码之间的差异 看看他做了什么修改才能使其工作 但没有任何修改 所以我想到尝试一下在线I
  • 既然“invoke”已被软弃用,那么替代方案是什么?

    rlang invoke 现已软弃用 purrr invoke 退休了 如今 以编程方式调用带有参数列表的函数的简洁方法是什么 tldr Use exec代替invoke use map2 plus exec代替invoke map 示例i
  • UIImagePickerController 如何隐藏翻转相机按钮?

    有没有办法隐藏 UIImagePickerController 内的翻转相机按钮 谢谢阅读 我最终使用 UIImagePickerController 的自定义子类来解决此 和其他 问题 import SMImagePickerContro
  • 将包含十六进制值的字节数组转换为十进制值

    我正在 c 中进行应用程序 这里我想将包含十六进制值的字节数组转换为十进制值 假设我有一个字节数组为 array 0 0X4E array 1 0X5E array 2 0X75 array 3 0X49 在这里 我想将该十六进制数组转换为
  • random_state在train_test_split和分类器中的作用

    基于这个答案 Scikit learn 中的随机状态 伪随机数 如果我使用相同的整数 比如 42 random state 然后每次进行训练 测试分割时 它应该给出相同的分割 即每次运行期间训练中的数据实例相同 测试时的数据实例相同 But
  • XSLT根据父子元素的值删除子元素

    我正在尝试使用这里使用的一些相同的逻辑https stackoverflow com a 10629806 662877 到不同的 XML 但没有得到预期的输出 如果 TERR KHM6 则删除 剥离这两个元素创建付款项目 and 创建支付
  • 一java内存刷新易失性:一个好的程序设计?

    这是与此相关的问题 java 在一个变量上使用 易失性 VS 每个变量 我有一个或多个不同的对象 我想改变其中的某些状态 然后我想让该状态对其他线程可见 出于性能原因 我不想使该对象中的每个成员变量都是易失性的 有时我想在单线程应用程序中使