【Java多线程】内存模型/volatile /Atomic原子类

多线程的三大特性
原子性 独一无二,一致性 保证线程安全问题
可见性 java内存模型图
有序性 join,wait,notify

什么是java内存模型?
答:(属于)多线程可见性jmm
java内存结构是jvm内存分配

Java内存模型,决定了一个线程与另一个线程是否可见
java内存模型 主内存,本地私有内存

public class ThreadDemo extends Thread {
    private boolean flag = true;

    @Override
    public void run() {
        super.run();
        System.out.println("Thread starting run");
        while (flag) {
        }
        System.out.println("Thread Stop");
    }

    public void setFlag(boolean flag){
        this.flag = flag;
    }


    public static void main(String[] args) {
        ThreadDemo threadDemo = new ThreadDemo();
        threadDemo.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        threadDemo.setFlag(false);
        System.out.println("Stop");
    }
}

上面代码执行后线程停止了才对啊,为什么没停止
答:其实嘛就是和上面说的java内存模型一样,因为子线程没有及时刷新数据导致的

解决方法就是给flag变量加上volatile关键字强制刷新就可以了
volatile 作用保证线程之间的可见性,但不保证原子性

所以jdk1.52中有个并发包类在
java.util.concurrent.atmoic中
具体请查看jdk 1.5及以上的api手册

发表评论

邮箱地址不会被公开。 必填项已用*标注