深入解析Java的可见性与有序性原理

发表时间: 2024-06-02 11:25

一、可见性(Visibility)

1.指的是:一个线程对变量的修改可被其他线程看见。

2.Java提供了volatile、synchronized、final、Lock等来保证可见性。

3.volatile:volatile修饰的变量在每次访问时都会从主内存中读取,并且在修改后会立即刷新回主内存。

4.synchronized:当线程进入一个synchronized块时,它首先会获取该对象的锁,然后清空自己的工作内存,从主内存中加载该对象的最新值。当线程退出synchronized块时,它会将自己工作内存中的变量值刷新回主内存中。

5.final:被 final 修饰的字段在构造器中一旦完成,并且构造器没有把this的引用传递出去( this 引用逃逸时,其他线程有可能通过这个引用访问到"初始化了一半"的对象),那final字段对其他线程就是可见的。



二、有序性(Ordering)

1.指的是:程序的执行顺序按照代码的先后顺序执行。

但在并发编程中,指令重排可能会使程序的执行顺序与代码的书写顺序不一致。

2.Java提供了volatile、synchronized、Lock、happens-before等来保证有序性。

3.volatile:volatile变量的读写操作前后会插入相应的内存屏障,防止指令重排序。

4.synchronized:synchronized块或方法的同步机制可以保证同步块内的代码执行顺序。

一个变量在同一时刻只允许一个线程对其进行 lock 操作。

5.happens-before:Java内存模型(JMM,Java Memory Model)定义了哪些操作必须在其他操作之前发生,哪些操作必须按照特定的顺序执行。

6.如果在本线程内观察,所有操作都是有序的(线程内表现为串行的语义);如果在另一个线程中观察本线程,所有操作都是无序的(指令重排现象和工作内存与主内存同步延迟现象)。









微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!