栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何演示Java多线程可见性问题?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何演示Java多线程可见性问题?

通过删除操作修改此处的示例,我得出一个示例

提出强调使用volatile重要性的最常见示例是while(keepRunning):

public class Test extends Thread {    boolean keepRunning = true;    public static void main(String[] args) throws InterruptedException {        Test t = new Test();        t.start();        Thread.sleep(1000);        t.keepRunning = false;        System.out.println(System.currentTimeMillis() + ": keepRunning is false");    }    public void run() {        while (keepRunning)  System.out.println(System.currentTimeMillis() + ": " + keepRunning);    }}

由于

keepRunning
可以(有效地)保留在运行
while
循环的线程的高速缓存中,因此在将程序设置为
false keepRunning
后,该程序可能会长时间打印
“ true” keepRunning

但是请注意,没有公开竞争条件的可靠方法。(请参阅我的其他答案。)在某些情况下,此示例可能在硬件/操作系统/ jvm的某些组合中公开。

该示例在我的环境中始终失败(线程永不停止运行)。

// Java environment:// java version "1.6.0_0"// OpenJDK Runtime Environment (IcedTea6 1.6.1) (6b16-1.6.1-3ubuntu3)// OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)public class Test2 extends Thread {    boolean keepRunning = true;    public static void main(String[] args) throws InterruptedException {        Test2 t = new Test2();        t.start();        Thread.sleep(1000);        t.keepRunning = false;        System.out.println(System.currentTimeMillis() + ": keepRunning is false");    }    public void run() {        while (keepRunning)         {}    }}

注意,这类问题完全取决于编译器/运行时/系统。特别是,编译器可以确定添加指令以从内存中读取变量,即使它不是易失性的(这样代码也可以工作),因此vm和jit可以优化从内存中的读取操作,仅使用寄存器,甚至可以使用寄存器。处理器可以对指令重新排序-
不会影响这种情况,但是在其他多线程情况下,如果修改了多个变量,它可能会影响其他线程的感知状态。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/394839.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号