为什么易失性不能正常工作

2023-12-09

今天我正在使用以下命令创建一项超时作业TimerTask但遇到了一个新问题,我有一个static volatile boolean多变的flag。我的理解是,一旦这个变量的值发生变化,所有正在运行的都会通知它thread。但是当我运行这个程序时,我得到了以下输出,这是不可接受的。

O/P:

--------------
--------------
DD
BB
Exiting process..
CC

我的期望是我最后一次打印应该是退出进程..为什么这种奇怪的行为?

我的代码是:

public class TimeOutSort {

    static volatile boolean flag = false;

    public static void main(String[] args) {

        Timer timer = new Timer();
        timer.schedule(new TimerTask() {

            @Override
            public void run() {

                flag = true;
                System.out.println("Exiting process..");
                // System.exit(0);
            }
        }, 10 * 200);

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (!flag)
                    System.out.println("BB");

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (!flag)
                    System.out.println("CC");

            }
        }).start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                while (!flag)
                    System.out.println("DD");

            }
        }).start();
    }

}

Edit:我怎样才能做到这一点?


volatile几乎意味着每次线程访问变量时,它必须确保使用每个线程可见的版本(即没有每线程缓存)。

This doesn't强制 CC 打印线程实际运行立即地之后flag已设置为true。一个线程设置标志是完全有可能的(尤其是在单核机器上)and打印消息beforeCC 打印线程甚至有机会运行。

另:请注意打印到System.out涉及获取锁(在println()调用),这可以modify测试代码的多线程行为。

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

为什么易失性不能正常工作 的相关文章

随机推荐

  • DOM 内容加载后附加的元素中的事件监听器

    我需要听一个 改变 事件
  • D3 区分具有拖动行为的元素的单击和拖动

    我无法成功区分click事件和drag使用 D3 js v3 绑定到两者的元素上的事件 下面代码中的圆圈被分配了拖动行为和click听众 演示在这里 var dragGroup d3 behavior drag on dragstart f
  • 将鼠标悬停在 li 上时更改文本颜色

    我想在出现链接时更改链接的文本颜色 li 元素悬停在上面 现在我有 nav li a hover margin left 10px padding left 10px background color 13118C color white
  • PHP、SimpleXML 对象的 json_encode、json_decode

    我的应用程序中的函数执行以下操作 使用史努比捕获网页 将结果加载到 DOMDocument 中 将 DOMDocument 加载到简单 XML 对象中 运行 XPath 来隔离所需文档的部分 对结果进行 json encode 并保存到数据
  • 何时在 Scala 方法声明中使用等号?

    带等号 object HelloWorld def main args Array String println Hello 没有等号 object HelloWorld def main args Array String println
  • (开放泛型类型)不指定参数的 typeof 泛型类型

    有人可以向我解释一下 C 语言的需求吗typeof SomeGenericType lt gt 没有指定具体参数 我整理了以下示例 var t1 typeof Nullable lt gt var t2 typeof Nullable
  • 使用 SVG 制作动画并翻转六边形

    我从未真正使用过 SVG 但现在阅读了一些有关它的教程并测试了一些东西 我正在学习如何制作类似六边形的形状 但现在需要使其在垂直轴上向下翻转并扩大尺寸 同时保持未翻转六边形的底部作为新翻转六边形的顶部 我的代码在这里 div class v
  • ApiExplorer 无法识别自定义类型的路由属性

    我有一个项目 我想在其中使用自定义类型的路由属性 我将自定义类型作为查询参数的以下代码工作正常 并且帮助页面显示自定义类型 GET api values 5 6 Route api values public string Get Inte
  • AndroidJavaObject.Call 数组传递错误(Unity for Android)

    我正在开发 Unity for Android 应用程序 它使用本机 Android 插件 我在里面使用AndroidJavaObject s Call method 正如它所说文档 方法的签名是 public void Call stri
  • 如何判断Android Service是否在前台运行?

    我有一个服务 我相信它在前台运行 如何检查我的实施是否正常工作 public static boolean isServiceRunningInForeground Context context Class
  • 成功上传图像后 firebase snapshot.downloadURL 未定义

    我的应用程序中有这段代码 我用它来上传图像并获取其 url 以便我可以将其保存在数据库中 该图像采用 base64 格式 并且上传成功 如我所见console log snapshot 输出 并且通过检查我的 firebase 存储 快照的
  • Fullcalendar JSON Feed 缓存

    我怎样才能得到全日历缓存来自 JSON feed 的事件 我不认为lazyfetching做我想做的事 它的有效期为一个月 假设我加载一个月 一月 然后更改为日视图 数据被缓存并且不发送ajax请求 但如果我将月份更改为二月并返回一月 一月
  • django-debug-toolbar 没有显示

    我看了其他问题 但无法弄清楚 我执行了以下操作来安装 django debug toolbar pip 安装 django debug toolbar 添加到中间件类 MIDDLEWARE CLASSES django middleware
  • Bash 脚本超级慢

    我正在更新一个旧脚本来解析 ARP 数据并从中获取有用的信息 我们添加了一个新的路由器 虽然我可以从路由器中提取 ARP 数据 但它采用了新的格式 我有一个文件 zTempMonth 它是来自两组路由器的所有 arp 数据 我需要将其编译成
  • 对 XML 文档的各个部分进行数字签名

    我有一个 XML 文档 其结构类似于以下内容
  • jsf 模板中的后台 url 路径

    我在这里遇到麻烦了 我有一个 JSF 应用程序 它有一个名为的模板文件基本模板 xhtml 该文件位于 resources template 文件夹中 遵循文件代码
  • 如何在从datalab运行的数据流管道中使用谷歌云存储

    我们一直在 datalab 中运行一个 Python 管道 该管道从 google 云存储中的存储桶中读取图像文件 导入 google datalab storage 最初我们使用 DirectRunner 效果很好 但现在我们尝试使用 D
  • 为什么 python max('a', 5) 返回字符串值?

    追溯一个ValueError cannot convert float NaN to integer我发现该行 max a 5 max 5 a 将返回a而不是 5 在上面的例子中我使用了示例字符串a但在我的实际情况下 字符串是NaN 拟合过
  • Spring中如何在请求参数中发送特殊字符

    如何处理请求参数中的特殊字符 这是我的控制器 Scope request RestController public class GetOperatorSeries RequestMapping value test method Requ
  • 为什么易失性不能正常工作

    今天我正在使用以下命令创建一项超时作业TimerTask但遇到了一个新问题 我有一个static volatile boolean多变的flag 我的理解是 一旦这个变量的值发生变化 所有正在运行的都会通知它thread 但是当我运行这个程