师兄,关于可见性的问题
来源:12-14 保证可见的规则

manong22
2019-10-28
第一个问题,线程a执行下面第一个代码,线程B执行第二个,只打印a=2这种情况,我可不可以理解为线程A只在第一次读取a变量时从主内存中读,然后保存副本修改,在打印时不会读主内存,所以打印只为2,不会出现3的情况。
第二个问题:代码在上面基础上多了一个 b = a的操作,然后打印出了3,2,想了半天出现这个结果只可能是因为在打印时从主内存中读取了a的值,然后就和上面第一个问题矛盾了
第三个问题,上面第二个问题的代码还有一个结果打印出1,1的结果,这不就违反了单线程happen-before原则了吗,老师帮忙解释下,最好详细点,我有点晕
写回答
3回答
-
manong22
提问者
2019-10-28
package src.threadcoreknowledge.jmm; import java.util.concurrent.CountDownLatch; /** * @program: muti_thread_AND_hign_concurrency * @author: yaopeng * @create: 2019-10-27 21:18 **/ public class test { static volatile int a =1 ; static volatile int b =1 ; public static void main(String[] args){ for(;;){ a = 1; b = 1; CountDownLatch latch = new CountDownLatch(1); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } a = 2; b = a; System.out.println(a+","+ b ); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } a = 3; } }); thread1.start(); thread2.start(); latch.countDown(); } } }
师兄代码已经发了
012019-10-28 -
悟空
2019-10-28
我要有你main函数的代码才能分析,贴一下完整代码吧
012019-10-28 -
悟空
2019-10-28
麻烦把代码文字版贴一下,我运行看看。现在的图片不方便复制。
00
相似问题