JAVA并发编程实战-2Java内存模型:看Java如何解决可见性和有序性问题

本文深入探讨了Java内存模型的本质,即如何通过synchronized、final、volatile关键字及happens-before规则来实现线程间的可见性和有序性。文章详细解释了volatile的作用机制,以及happens-before原则在确保操作顺序中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 学习上篇文章知道,可见性是由缓存导致的,有序性是由编译优化导致的。禁用缓存和编译优化,也就解决了这两个问题。然而设置缓存和编译优化的目的是为了提供性能,直接禁用缓存和编译优化显然是不可行的;

  2. 故而需要按需缓存和编译优化。JAVA内存模型本质就是提供了程序员按需缓存和编译优化的方法。这些方法具体为synchronized、final、volatile和6个happens before规则;

  3. volatile

volatile int v = false;
int x = 20;
void write(){
	x= 42;
	v = true;
}
void read(){
	if(v == true){
		
	}
}
  1. happen before规则,一个操作的结果对后一个操作是可见的。

    • 在一个线程中,前一个操作的结果对后一个操作可见;
    • 对volatile修饰的变量,对该变量写的操作happens before后续对该变量读的操作;
    • 假如A happens before B,B happens before C,则A happens before C;
    • 线程的释放锁 happens before 线程的获得该锁。
    • start(),有线程A和线程B,在A调用B.start(),调用前A中所有的操作对线程B可见
    • join(),有线程A和线程B,在A调用B.join(),线程B中的所有操作,对B.join()后的操作可见
  2. final关键字:待补充

  3. 好的评论:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值