可见性 原子性

有序性

import org.junit.jupiter.api.Test;

public class T {
    //flag初始值
    static boolean flag = false;

    @Test
    public void business() {
        new Thread(() -> {
            //①资源准备
            prepare();
            //②资源准备好,更改flag标志
            flag = true;
        }, "线程1").start();

        new Thread(() -> {
            //main线程
            while (!flag) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //基于准备好的资源 执行操作
            execute();
        }, "线程2").start();
    }

    public static void prepare() {

    }

    public static void execute() {

    }
}

class HelloWorld {
    int data = 0;

    public void increment() {
        data++;
    }
}

线程1执行顺序:②->①,

1、线程1执行②,flag=true。
2、线程2直接略过资源准备,直接执行操作execute()
3、程序bug

可见性

public class T {
    private int data = 0;

    public void business() {

        new Thread(() -> {
            data++;
        }, "线程1").start();

        new Thread(() -> {
            while (data == 0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "线程2").start();
    }
}

1、线程2一开始获得data=0
2、线程1 data++ = 1
3、线程2 不会立刻获得data=1,一直while死循环

posted @ 2024-09-30 20:25  干饭达人GoodLucy  阅读(2)  评论(0编辑  收藏  举报