1.锁基础知识

1)CAS

参考:https://blog.csdn.net/cringkong/article/details/80533917
参考:https://blog.csdn.net/v123411739/article/details/79561458
真实的CAS操作是由CPU完成的,CPU会确保这个操作的原子性,CAS远非JAVA代码能实现的功能
含义:CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。
如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作,只告诉我这个位置现在的值即可。

延伸:volatile与static差异 

参考:https://www.cnblogs.com/dolphin0520/p/3920373.html    https://blog.csdn.net/frankarmstrong/article/details/55657290

2)AQS

参考: https://www.jianshu.com/p/da9d051dcc3d    https://www.cnblogs.com/fsmly/p/11274572.html

2.锁种类

1)synchronized:
用于同步方法和代码块,执行完后自动释放锁。其中锁的获取和释放分别是monitorenter和monitorexit指令,该锁在实现上分为了偏向锁、轻量级锁和重量级锁,其中偏向锁在1.6是默认开启的,轻量级锁在多线程竞争的情况下会膨胀成重量级锁,有关锁的数据都保存在对象头中。
2)Lock:
Lock是一个锁的接口,提供获取锁和解锁的方法(lock,trylock,unlock)【接口】
ReentrantLock:(参考:https://www.jianshu.com/p/fe027772e156)【类】
ReentrantLock是Lock接口的实现类,基于AQS实现的,在AQS内部会保存一个状态变量state,通过CAS修改该变量的值,修改成功的线程表示获取到该锁,没有修改成功,或者发现状态state已经是加锁状态,则通过一个Waiter对象封装线程,添加到等待队列中,并挂起等待被唤醒。
3)ReadWriteLock:【接口】(参考:https://baijiahao.baidu.com/s?id=1649257642735492589&wfr=spider&for=pc
可以实现读写锁,当读取的时候线程会获得read锁,其他线程也可以获得read锁同时并发的去读取,但是写程序运行获取到write锁的时候,其他线程是不能进行操作的,因为write是排它锁,而上面介绍的两种不管你是read还是write没有抢到锁的线程都会被阻塞或者中断,它也是个接口,里面定义了两种方法readLock()和writeLock(),他的一个实现类是ReentrantReadWriteLock。

3锁的使用

(1)synchronized使用总结
对于同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前对象的Class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。
偏,轻,重锁,分别解决三个问题,只有一个线程进入临界区,多个线程交替进入临界区,多线程同时进入临界区。
(2)Lock:
(3)ReadWriteLock:接口

4.其他
1)可重入锁,一个线程下如果一个方法被synchronized修饰,此时方法中包含的方法也由synchronized修饰,则可以访问,则是可重入的。https://www.cnblogs.com/incognitor/p/9894604.html
2)CountDownLatch(参考:https://www.jianshu.com/p/7c7a5df5bda6?ref=myread)

3)symaphore (参考:https://www.cnblogs.com/whgw/archive/2011/09/29/2195555.html

posted on 2020-09-28 01:16  youshoujing  阅读(157)  评论(0)    收藏  举报