多线程七大状态
1.新建
2.可运行/就绪
3.运行
4.死亡
5.阻塞状态(Synchronized)
6.等待(wait)
7.超时等待(sleep)
cas的三大问题:
1.ABA问题
2.自旋消耗资源
3.只能保证一个共享变量的原子操作
锁的种类
1.乐观锁-cas
2.悲观锁-synchronized、ReentrantLock
3.自旋锁
4.递归锁(可重入锁):任何线程获取了锁之后可以再次获取该锁而不会被阻塞,识别获取锁的线程是否为当前占据锁的线程,如果是则再次成功获取。获取锁后进行自增,
5.读写锁:ReentrantReadWriteLock
6.公平锁
7.非公平锁:在java里面,synchronized默认就是非公平锁,ReentrantLock可以通过构造函数来设置该锁是公平的还是非公平的,默认是非公平的。
8.共享锁:多个线程可以获取读锁,以共享的形式持有,本质上与乐观锁,读写锁一样,JAVA的共享锁也是ReentrantReadWriteLock
9.独占锁:只有一个线程可以获取锁,与悲观锁,互斥锁一样,JAVA的独占锁有:synchronized,ReentrantLock
10.重量级锁:synchronized
11.轻量级锁
12.偏向锁
13.分段锁:ConcurrentHashMap
14.互斥锁(同步锁):互斥锁用最简单的一句话来理解:某个资源只能被一个线程访问,读读,读写,写读,写写都是一样的。
15.死锁
总结
JAVA里面主要有ReentrantLock ,synchronized,Lock三种,类别也是不一样
synchronized:属于独占锁、悲观锁、可重入锁、非公平锁
ReentrantLock:继承了Lock类,可重入锁、悲观锁、独占锁、互斥锁、同步锁。
Lock:Java中的接口,可重入锁、悲观锁、独占锁、互斥锁、同步锁