java进阶干货程序员Java

Java 多线程(二):内存模型与 Synchronized、V

2018-03-10  本文已影响387人  聪明的奇瑞

Java 内存模型

并发编程

内存模型抽象

内存可见性

重排序

名称 代码示例 说明
写后读 a=1;b=a; 写一个变量之后,再读这个位置
写后写 a=1;b=2; 写一个变量之后,再写这个位置
读后读 a=b;b=1; 读一个变量之后,再写这个位置

重排序

可见性分析

synchronized 特性

Volatile 特性

number++;

案例分析

描述 顺序 输出结果
写线程执行 1.1 操作后,读线程抢占到了 CPU 资源执行了 2.1、2.2,然后写线程再执行了 1.2 1.1->2.1->2.2->1.2 3
写线程 1.1 跟 1.2 进行了冲排序,写线程先执行了 1.2 操作后,读线程抢占到了 CPU 资源执行了 2.1、2.2,然后写线程再执行了 1.1 1.2->2.1->2.2->1.1 0
读线程先抢占到 CPU 资源执行了 2.1,然后写线程再执行了 1.1、1.2 2.1->1.1->1.2 0
public class Demo {
    // 共享变量
    private int result = 0;
    private boolean flag = false;
    private int number = 1;

    // 写操作
    public void write() {
        flag = true;        // 1.1
        number = 2;        // 1.2
    }

    // 读操作
    public void read() {
        if (flag) {          // 2.1
            result = number * 3;      // 2.2
        }
        System.out.println("result 值为:" + result);
    }

    // 线程内部类
    private class ReadWriteThread extends Thread{
        // 根据构造方法中传入的 flag 确定线程是读操作还是写操作
        private boolean flag;

        public ReadWriteThread(boolean flag) {
            this.flag = flag;
        }

        @Override
        public void run() {
            if (flag)
                // flag 值为 true 执行写操作
                write();
            else
                // flag 值为 false 执行读操作
                read();
        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        // 启动线程执行写操作
        demo.new ReadWriteThread(true).start();
        // 启动线程执行读操作
        demo.new ReadWriteThread(false).start();
    }
}

案例优化

// 写操作
public synchronized void write() {
    flag = true;        // 1.1
    number = 2;        // 1.2
}
// 读操作
public synchronized void read() {
    if (flag) {          // 2.1
        result = number * 3;      // 2.2
    }
    System.out.println("result 值为:" + result);
}
上一篇下一篇

猜你喜欢

热点阅读