关于多线程可见性学习后理解记录

本文介绍了并发编程中变量可见性的概念及其实现方法,包括final关键字、synchronized和volatile的作用及区别,以及它们如何帮助解决多线程环境下的数据一致性问题。

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

看了一些可见性的东西,然后有一些很粗的认识做个记录

首先所有的变量都存储再住内存中,每个线程都有自己独立的工作内存,里面保存该线程用到的共享变量的副本。

基本上线程基本可见性是可以保证的,但是为了安全性的考虑我们会做一些措施。

1,如果只是说可见性的话,final这个关键字修饰的肯定是可见的。。。。。

2,使用synchronized关键字即同步,他的工作过程:获得互斥锁---清空工作内存--从住内存中拷贝变量到最新副本到工作内存--执行代码--将更新后的共享数据刷新到主内存--

释放锁。从而实现数据的可见性。

3,volatile:通过加入内存屏蔽和禁止重拍需要来实现的。它可以通过修饰变量来实现该变量的可见性。再执行写操作时,会在操作后加入一条store屏障指令,执行读操作时

会在操作前加入一条load屏障指令。

那么volatile和synchronized哪个好啦,这个要看情况吧,首先线程安全出现的几个问题:

1/线程的交叉执行如果共享数据不可见的话就可能出现线程安全问题

2/重排序结合线程的交叉执行

重排序就是编译器或者处理器优化代码时,不会按照我们编写的顺序执行,再单线程的时候是安全的遵循as-if-serial即重排序后的执行结果要和正常的顺序结果相同,但是如果是

多线程的话就很可能出问题。

synchronized是原子性的他会排除重排序对我们执行结果的影响,但是volatile不会。所以如果我们的共享变量是 i;在代码中出现i++;或者i=i*3;这样的代码的时候还是用synchronized更好。

当然还可以用Lock这个类,其实它就类似于synchronized就不再记录了。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值