java面试题JUC篇

目录

一、volatile

1、介绍:

2、可见性

3、指令重排

4、volatile与syncronized比较

5、volatile应用场景

二、cas

1、cas介绍

2、cas底层原理

3、cas深层分析

4、cas与synchornzied

5、cas缺点

6、ABA问题介绍

7、ABA问题解决


一、volatile

1、介绍:

        volatile是java虚拟机提供的一款轻量级同步机制,保证可见性,不保证原子性,禁止指令重排。

2、可见性

        各个线程对主线程的共享变量的操作都是先拷贝到各自线程的工作内存再写回主内存。这就会存在一个问题,线程A读取变量后,线程B读取,线程A操作后,写回主线程,而此时线程B还是根据最先读取的变量进行操作。而可见性就是,在线程A写回主线程时,会去通知其他线程,此变量值已改变。

3、指令重排

        计算机在执行程序时,为了提高性能,编译器和处理器往往会进行指令重排。单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致。处理器在进行重新排序是必须要考虑指令之间的数据依赖性;多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测。

4、volatile与syncronized比较

        volatile轻量级,只能修饰变量。synchronized重量级,还可修饰方法。

        volatile只能保证数据的可见性,不能用来同步,因为多个线程并发访问volatile修饰的变量不会阻塞。synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。

5、volatile应用场景

        单例模式和代理模式

二、cas

1、cas介绍

        cas全称为compare and swap,中文名为比较并交换。例:主内存有一变量,线程T1与T2都要对其赋值操作,此时线程T1与T2都会读取主内存的值,T1在想要改变其值,会先用期望值(读取的值)与主内存值做比较,如果相同进行赋值操作,并返回true。通过volatile可见性,会通知T2线程,此值发生改变,此时T2线程想要对变量进行赋值操作,也会先用期望值与主内存值作比较,此时值不相等,线程T2将重新读取主内存中的值。此比较赋值操作会循环进行,知道值相等,并赋值成功。

2、cas底层原理

        cas的核心类为unsafe类,由于java方法无法直接访问底层,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe类存在于sun.misc包中,其内部方法操作可以像C的指针一样直接操作内存,因为Java中CAS操作的执行,依赖于Unsafe类的方法。

注意Unsafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法,都直接调用操作系统底层资源执行相应任务。

3、cas深层分析

        cas是cup的并发原语,功能为判断地址中的值与期望值是否一致,如果一致则更新,此过程是原子的。

        CAS并发原语体现在java语言中就是sun.misc.Unsafe类中的各个方法。调用Unsafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓的数据不一致问题。

4、cas与synchornzied

        synchcornzied是通过加锁来保证一致性的,并发性能会大大下降

        CAS不加锁,保证一致性,但是它如果多次比较,耗时时间长,开销大。

5、cas缺点

        多次比较循环时间开销大。

        只能保证一个共享变量的原子性

        会引入ABA问题

6、ABA问题介绍

        线程1和线程2从主线程读取变量A,线程1赋值需2s,线程2赋值需10s,线程1把变量赋值为B,然后线程1又把B赋值为A,此时线程2,再去比较发现期望值与主内存中的值相等。而无法得知线程1已对变量进行过了赋值操作。

7、ABA问题解决

        引入版本号的概念,版本号可用时间戳来赋值。在cas比较阶段,不仅比较值是否相等,还要比较版本号是否相同,如果版本号不同则说明已有线程更改其变量。

        

更新ing

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值