CAS-2

1、cas是什么

cas就是compare  and  swap,比较和交换

2、什么是重量级锁

虚拟机分为用户态和内核态,重量级锁就是需要操作系统进行调配资源,轻量级锁是不用惊动到操作系统,使用到重量级锁:从用户空间切换到内核空间

3、锁的升级过程(synchronized升级)

Java1.6为Synchronized做了优化,增加了从偏向锁到轻量级锁再到重量级锁的过度

锁的升级过程就是:new一个新的对象,这只是一个普通对象,使用的是偏向锁,然后如果有轻度的竞争,变为轻量级锁,如果竞争越来越激烈,那么就变为重量级锁

4、Cas(比较与交换)无锁,其实是自旋锁

Cas:compare and  swap,就是比较和替换,CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B,内部执行的机制是:只有当内存地址v的值,等于旧的预期值A,才会修改为新值b。

举个例子:

  1. 有个地方存着内存值v为10的数据
  2. 线程1对这个数据进行更改,它要修改的新值b为11此时,预期值为10,内存值也为10
  3. 就在线程1提交结果的时候,线程2也同样操作这个数据,它修改为12,同样它的预期值是10,内存值也为10 ,那么内存值和预期值是相等的,线程2提交它的修改结果,那么这时候线程提交的时候,预期值10,而内存值变为12,内存值和预期值不相等,那么线程1就不能提交
  4. 这个时候线程1就进入自旋的状态,等它的预期值变为12,这个时候,预期值和内存值变为相等,就可以修改新值

 

5、Cas和synchronized关键字的区别和作用

相同点:都能解决一些线程安全问题

不同点:cas的设计是采用乐观的思想,乐观的认为程序中的并发情况不那么严重,才让线程去不断尝试(自旋)

Synchronized的设计是采用悲观的思想,悲观认为程序并发非常严重,只允许一个线程对结果进行操作,每一步操作都上锁

6、Cas的应用场景:

Atomic系列类,以及lock系列类的底层实现

7、Cas的缺点:

第一个:就是线程非常多的时候,非常耗费CPU的资源,因为cas允许每个线程都自旋

第二个:cas只保证单个变量的原子性,不能保证多个多个,举个例子:

就比如说我们的原子类AtomicInterger类,规定一个增减多少,再规定一个增减的数值后,这就相当于多个变量,而cas是不能保证多个变量的原子性

第三个:就是臭名昭著的ABA问题

https://www.toutiao.com/a6566102256750428680/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1×tamp=1588219965&app=news_article&utm_source=weixin&utm_medium=toutiao_android&req_id=2020043012124401012903514413031FF7&group_id=6566102256750428680


7、什么是ABA问题

就是一个线程a要修改某个数据,但是在多线程情况下,其他的线程先做了修改,但是这个改变又符合线程a的cas规则,那么线程a又把数据修改回去,但是线程a不知道其他的线程做了修改,这影响它是不知道的

8、解决aba问题

https://www.toutiao.com/a6694822487286350347/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1×tamp=1588220787&app=news_article&utm_source=weixin&utm_medium=toutiao_android&req_id=202004301226270101290321681005923A&group_id=6694822487286350347

9、jol  Java对象布局,作用,展示对象的MarkWord,从MarkWord就可以看出这个是普通对象、偏向锁、自旋锁、中相继锁

10、各种锁的MarkWord

11、偏向锁(不需要惊动系统的内核)

12、自旋锁 轻量级锁(不需要惊动系统的内核),修改MarkWord

13、重量级锁(需要使用到系统的内核,得不到锁的线程进入waitset 等待,不在消耗系统内存资源)

14、以上厕所为例,解释偏向锁、自旋锁和重量级锁的区别:

 偏向锁就是有一个厕所,也只有一个,那么没有人跟他竞争,就是这个人可以一直上厕所,从系统层面就是把自己的用户id给系统就行了;突然之间,来多了一两个人,那么就大家需要排队上厕所了,但是此时竞争也不会太激烈,排排队大家也可以上厕所,拿到锁的人上厕所,没有拿到的就等一下(自旋);人越来越多,这样等的人就会越来越多,竞争也会变得很激烈,大家一直 自旋,那么就会耗费内存,这样就需要内核介入了,把能获取到锁的去上厕所,其他方法到waitset集合去,等到那个人上完厕所出来,就再竞争锁

15、锁重入的原因可重入锁是什么?

可重用锁就是比如 a方法拥有Object  o的这把锁,b方法也同样拥有O这个对象的锁,那么a方法可以调用b方法,b方法也可以调用a方法,也就是他们都可以获得对方的锁

16、Volatile的作用:

禁止指令重排  使对象在各个线程可见

17、对象的创建过程

第一步:new一个对象t,底层只会半初始化对象,那么就只会赋值m=0

第二步:程序中赋值8给m属性,把这个值赋值到新初始的对象中,那么m=8

第三步:将新建立的t对象和m属性建立连接

18、什么是CPU的指令重排

19、什么是dcl单例,Dcl单例需不需要加volatile关键字?

Dcl单例就是懒汉模式下的双重检验锁单例的写法

这个写法下,虽然双重检验锁可以保证线程下的原子性,但是程序编译后,变成汇编执行以后,由于指令重排的发生,这时候就不保证原子性,所以要使用volatile关键字禁止指令重排

需要

Volatile的一个作用就是禁止底层指令重排,新建对象的时候,CPU有可能会出现指令重排的现象,这种是提高效率的提现,一般不会造成结果不同,但由于新建对象的半初始化存在,可能会出现意外的结果(这样的概率很低,高并发情况下会大大增多),因此,一定要在DCL单例的加上volatile关键字

https://www.cnblogs.com/codingmengmeng/p/9846131.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值