公平锁/非公平锁
共享锁/独享锁
可重入锁
互斥锁/读写锁
乐观锁/悲观锁
分段锁
偏向锁/轻量级锁/重量级锁
自旋锁
锁的状态:
偏向锁
是指一段同步代码一直被同一个线程访问,就会默认一个偏向锁
轻量级锁
在一段同步代码被多线程访问的时候就会被自动升级成轻量级锁
自旋锁
在多线程访问时没竟争上的就会变成循环尝试获取锁,好处是减少了线程的上下文切换
缺点是增加了cpu的损耗
重量级锁
一个线程获取到锁之后,另一个线程进入自旋的方式,来获取锁如果获取许多次不成功就会阻塞,那该锁就会从轻量级锁变成重量级锁,其他线程再次访问的时候就会变成阻塞状态,性能降低
锁的特性
公平锁
会按照多个线程申请锁的顺序来获得锁
非公平锁
并不是按照申请的顺序来,可能申请的在前面却是后面获得锁,非公平锁比公平锁的吞吐量大
Synchronized就是非公平锁
可重入锁
也可以被叫做递归锁 在外层方法获取锁后 进入内层方法就不用再获取锁了,会自动获取
避免了死锁。
乐观锁
从并发的角度来看待问题,不是一种类型 ,在执行某项操作的时候乐观的判断数据不会冲突,全程都不加锁,适合读数据因为吞吐量高但是不能解决脏读,和幻读这种问题。
悲观锁
从并发的角度来看待问题,不是一种类型 ,在执行某项操作的时候悲观的判断数据会冲突,全是悲观的加锁
独享锁
顾名思义就是只能被一个线程持有,ReentrantLock就是实现了独享锁,其实也是一种写锁,其中ReentrantLock的里面用的是一个标记来实现的
共享锁
顾名思义就是只能被多个线程访问,ReadWriteLock就是实现了共享锁,也是一种读锁,当然跟独享锁实现的区别是有一个同步状态,如果同步状态为大于0就是还能获取,如果等于0就不是获取其余的线程只能等待
互斥锁
访问共享资源的情况下在每个线程进去后做好标记,让后其他线程要在外面等待,等里面的人出来(销毁)下一个才能进
读写锁
基本和互斥锁一样 分读锁和写锁 读锁能重复加 而写锁一次只能加一次 也就是加了多个读锁能同时多个线程做读操作 而写锁就只能一次
锁的设计
分段锁
如果你对ConcurrentHashMap有了解就知道她也是基于分段锁的思想来设计的,
由于ConcurrentHashMap的篇幅太长就不再这里写了