首页   注册   登录
 liliumss 最近的时间轴更新
liliumss

liliumss

V2EX 第 373088 号会员,加入于 2018-12-26 17:11:11 +08:00
小白问一个 Java 线程 jmm 的问题
  •  1   
    Java  •  liliumss  •  24 天前  •  最后回复来自 az467
    22
    太惨了
    职场话题  •  liliumss  •  57 天前  •  最后回复来自 hlwjia
    12
    看烂代码,修改烂代码真是程序员的一个宿命阿
    问与答  •  liliumss  •  92 天前  •  最后回复来自 sun1991
    3
    v2 里都是 90 2000 后吗
     •  liliumss  •  294 天前  •  最后回复来自 alakey1989
    7
    liliumss 最近回复了
    25 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @sagaxu 谢谢 学习了
    25 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @az467 谢谢 请问看这方面知识有啥好文档呢
    25 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @sagaxu 谢谢 请问使用什么方法替代 system.out.print 呢
    26 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @az467 我本地也是这个结果 我纳闷是根据 jmm 搜第一个 thread 还在在循环 assgin count 的时候 第二个线程结束同步 write 给主存的值为啥影响了第一个线程的 count 这里并没设置 valiate 修饰 而用 boolan 做的 demo (见楼层)确是可以的
    26 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @Jooooooooo 谢谢你的回答
    意思就是线程 1 的那个 count++ 触发了 MESI 协议与主内存有交互了,而正好线程 2 把 count 值改变了所以线程 1 就直接满足条件推出了
    而线程 3 一直没更新,又没使用 volatile 保证可见性,所以即使线程 4 更改了 boolean 值也无法从循环跳出
    我理解的对吧,关键就是线程 1 的 count++导致了 2 种不同变量在后面操作的差别
    @passerbytiny 意思是 getter setter 就是 oop 的基础之一,去掉就失去 oop 的意义了
    26 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @fihserman123 用 boolean 值确是可以的 第一个线程一直卡在循环,这是为啥呢
    ```
    public class Test {
    private static Boolean flag = false;

    public static void main(String[] args) throws InterruptedException {

    new Thread(() -> {
    System.out.println("Thread3 start");
    while (!flag) {
    }
    }).start();

    Thread.sleep(1000);
    new Thread(() -> {
    flag = true;
    System.out.println("Thread4 end");
    }).start();
    }
    }



    ```
    26 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @kevincai100 我测试了下 boolean 值确是可以的 第一个线程会一直卡在循环中
    代码如下:
    public class Test {
    private static Boolean flag = false;

    public static void main(String[] args) throws InterruptedException {

    new Thread(() -> {
    System.out.println("Thread3 start");
    while (!flag) {
    }
    }).start();

    Thread.sleep(1000);
    new Thread(() -> {
    flag = true;
    System.out.println("Thread4 end");
    }).start();
    }
    }
    26 天前
    回复了 liliumss 创建的主题 Java 小白问一个 Java 线程 jmm 的问题
    @fihserman123 但是我顶一个静态的 boolean 值确是 2 线程互不影响的 这是什么原理呢
    43 天前
    回复了 isweal 创建的主题 职场话题 年后在公司上班的第一天就被通知了
    这真是进退二难啊
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1049 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:56 · PVG 04:56 · LAX 13:56 · JFK 16:56
    ♥ Do have faith in what you're doing.