老师救命啊,我的程序使用volatile依然存在可见性问题

来源:12-10 可见性问题

长袜子皮皮93

2020-01-01

public class FieldVisibility {

  volatile int a = 1;
  volatile int b = 2;

//  static final Set<ExecutionResult> results = new HashSet<>();

  /**
   * 四种结果:
   * ExecutionResult{a=3, b=2} write1 -> read -> write2
   * ExecutionResult{a=3, b=3} write1 -> write2 -> read
   * ExecutionResult{a=1, b=2} read -> write1 -> write2
   * ExecutionResult{a=1, b=3} 发生可见性问题
   *
   * 解决可见性问题可以使用volatile关键字,修饰之后运行结果:
   *
   * @param args
   * @throws InterruptedException
   */
  public static void main(String[] args) throws InterruptedException {

    for(int i=0;i<50000;i++) {
      FieldVisibility fieldVisibility = new FieldVisibility();

      Thread thread1 = new Thread(() -> {
        try {
          Thread.sleep(1);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        fieldVisibility.change();
      });

      Thread thread2 = new Thread(() -> {
        try {
          Thread.sleep(1);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        fieldVisibility.print();
      });

      thread1.start();
      thread2.start();
//      thread1.join();
//      thread2.join();
    }
//    for(ExecutionResult result : results) {
//      System.out.println(result.toString());
//    }
  }

  public void change() {
    a = 3;
    b = a;
  }

  public void print() {
//    results.add(new ExecutionResult(a, b));
    System.out.println("a=" + a + "; b=" + b);
  }
}

救命,老师,同学们!

写回答

2回答

悟空

2020-01-01

这个问题我找到了,你看一下:http://coding.imooc.com/learn/questiondetail/141325.html

0
0

悟空

2020-01-01

改变打印时候a和b的顺序
打印不是原子的
这个问题有同学提过一样的,你看一下问答区哈

0
5
悟空
回复
长袜子皮皮93
这个问题我找到了,你看一下:http://coding.imooc.com/learn/questiondetail/141325.html
2020-01-01
共5条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程