Java面试题二:synchronized 和 volatile 、ReentrantLock 、CAS 的区别

本文详细介绍了Java中synchronized、volatile和ReentrantLock的使用和区别。synchronized提供同步锁,保证线程安全,但可能导致阻塞;volatile确保可见性和有序性,不保证原子性;ReentrantLock则提供了更细粒度的锁控制,如可设置公平锁、分组唤醒线程等,同时支持中断和自旋锁。
摘要由CSDN通过智能技术生成

目录

0、相关文章:

1、synchronized关键字的作用

2、volatile关键字的作用

3、volatile和synchronized的作用和区别是什么?

4、CAS机制详解

5、ReentrantLock(重入锁)详解

六、ReenTrantLock可重入锁(和synchronized的区别)总结


0、相关文章:

Java中线程安全的体现(原子性、可见性、有序性)(自己的)

1、synchronized关键字的作用

synchronized   美 [ˈsɪŋkrənaɪzd]  同步  synchronize的过去分词和过去式

synchronized提供了同步锁的概念,被synchronized修饰的代码段可以防止被多个线程同时执行,必须一个线程把synchronized修饰的代码段都执行完毕了,其他的线程才能开始执行这段代码。 因为synchronized保证了在同一时刻,只能有一个线程执行同步代码块,所以执行同步代码块的时候相当于是单线程操作了,那么线程的可见性、原子性、有序性(线程之间的执行顺序)它都能保证了。

2、volatile关键字的作用

volatile  美 [ˈvɑːlətl]  不稳定的,易挥发的

单例模式为什么要用Volatile关键字

其实volatile关键字的作用就是保证了可见性和有序性(不保证原子性),如果一个共享变量被volatile关键字修饰,那么如果一个线程修改了这个共享变量后,其他线程是立马可知的。为什么是这样的呢?比如,线程A修改了自己的共享变量副本,这时如果该共享变量没有被volatile修饰,那么本次修改不一定会马上将修改结果刷新到主存中,如果此时B去主存中读取共享变量的值,那么这个值就是没有被A修改之前的值。如果该共享变量被volatile修饰了,那么本次修改结果会强制立刻刷新到主存中,如果此时B去主存中读取共享变量的值,那么这个值就是被A修改之后的值了。 

volatile能禁止指令重新排序,在指令重排序优化时,在volatile变量之前的指令不能在volatile之后执行,在volatile之后的指令也不能在volatile之前执行,所以它保证了有序性。
 

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值