并发编程 - 内存模型是如何把保证原子性可见性有序性

    技术2022-07-10  95

    原子性(操作是不可分、操作不可被中断): Synchronized、Lock可见性(保障数据的一致,数据安全一部分): Volatile、Synchronized有序性(按照自己想要执行的顺序执行线程): Join

    内存模型解决原子性、可见性、有序性

    原子性问题基本数据类型(byte short int float char boolean )的变量的读写操作已经自动保证原子性,使用Synchronized或者是ReentrantLock保证方法(静态方法,实例方法)和代码块的原子性。

    工作内存和主内存之间的同步延迟造成的可见性问题使用Synchrozied和Volatile解决,能够使得在一个线程中修改的变量立即对其他线程可见,指令重排序带来的可见性问题,编译器优化重排序java内存模型的编译器重排序规则会禁止特定类型的重排序,指令并行重排序和内存系统的重排序java内存模型的处理器重排序规则要求编译器在生成指令序列的时候,插入特定类型的内存屏障指令通过内存屏障指令来禁止特定类型的重排序。

    对于重排序问题,使用volatile,编译器重排序规则和处理器重排序规则来解决,同时happens-before规则也保证多线程环境下两个操作之间的原子性,可见性,有序性

    总结:

    通过Synchronized和ReentrantLock保证代码块和方法的原子性,通过Synchrozied和Volatile解决可见性,内存屏障指令禁止指令重排序实现有序性。

    happens-before规则也保证多线程环境下两个操作之间的原子性,可见性,有序性。

    Processed: 0.010, SQL: 9