标签:同步 Java ## CAS 添加 线程 数组 资源
## 线程是否要锁住同步资源
* 锁住?悲观锁
* 不锁住?乐观锁
## 锁住同步资源失败 线程是否要阻塞
* 阻塞
* 不阻塞自旋锁,适应性自旋锁
## 多个线程竞争同步资源的流程细节有没有区别
* 不锁住资源,多个线程只有一个能修改资源成功,其它线程会重试无锁
* 同一个线程执行同步资源时自动获取资源偏向锁
* 多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放?轻量级锁
* 多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒?重量级锁
## 4.多个线程竞争锁时是否要排队
* 排队公平锁
* 先尝试插队,插队失败在排队非公平锁
## 一个线程的多个流程能不能获取同一把锁
* 能?可重入锁
* 不能非可重入锁
## 多个线程能不能共享一把锁
* 能?共享
* 不能排他锁
## 悲观锁与乐观锁
悲观锁与乐观锁时一种广义的概念,体现的是看待线程同步的不同角度。
## 悲观锁
悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不会被别的线程修改。 锁实现:`synchronized`?接口`Lock`的实现类 适用场景:写操作多,先加锁可以保证写操作时数据正确。
## 乐观锁
乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。 锁实现:`CAS`算法,例如`AtomicInteger`类的原子自增时通过`CAS`自旋实现。 适用场景:读操作较多,不加锁的特点能够使其读操作的性能大幅度提升。 乐观锁的执行流程: 线程A获取到数据以后直接操作,操作完数据以后准备更新同步资源,更新之前会先判断内存中同步资源是否被更新: 1.如果没有被更新,更新内存中同步资源的值。 2.如果同步资源被其他线程更新,根据实现方法执行不同的操做(报错or重试)。
## CAS算法
全名:Compare And Swap(比较并交换) 无锁算法:基于硬件原语实现,在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。 jdk中的实现:java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。 算法涉及到的三个操作数:
```
需要读写的内存值V
进行比较的值A
要写入的新值的B
```
![](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625305991462445.jpg)
## CAS存在的问题
**1.ABA问题** 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题。 举例:一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,你老婆出轨之后又回来,还是原来的老婆吗?ABA问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的钱,在你发现之前又还了回来。但是别人却已经触犯了法律。 但是jdk已经解决了这个问题。 想追下源码来着,但是一追发现直接到c了。
**2.循环时间长开销大** **3.只能保证一个共享变量的原子操作**
# 总结
谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。
为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的
**并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析),[有需要的朋友可以戳这里即可免费领取](https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB)**
![我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625305992894254.jpg)
66个Java面试知识点
**架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)**
![我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625305992181473.jpg)
**算法刷题(PDF)**
![我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...](http://www.icode9.com/i/li/?n=2&i=images/20210703/1625305992474258.jpg)
标签:同步,Java,##,CAS,添加,线程,数组,资源
来源: https://blog.51cto.com/u_15291849/2973316
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。