Java中锁的分类

乐观锁、悲观锁

乐观锁:不加锁的并发操作是安全的

可重入锁

RerntrantLock

当一个线程进入到一个同步方法中,然后在此方法中要调用另一个同步方法,

而且两个方法公用同一把锁

此时线程是可以进入到另一个同步方法中的。

读写锁

ReentrantReadWriteLock

读读共享,读写互斥、写写互斥

分段锁

jdk8之后,去除了真正的分段锁,concurrentHashMap内有给方法加锁;

把锁进一步细粒度化提高并发效率。

Java中锁的分类_第1张图片

自旋锁 

获取锁的一种方式,例如原子类,当抢锁失败后,重试几次,抢到了就继续,抢不到线程阻塞。因

不断地进行尝试,会消耗cpu资源,因此适合时间短的线程,提高效率。

公平锁、非公平锁

公平锁:按照获取锁的顺序分配,ReentrankLock底层可以设置公平锁,默认是非公平锁         

Java中锁的分类_第2张图片 

构造方法参数为true设置公平锁。  

共享锁、独占锁

共享锁:多个线程共享同一把锁,读写锁中的读读操作

独占锁:synchronized ReentrankLock,读写锁中的写操作

锁的状态

1.无锁

2.偏向锁:一段同步代码被一个线程一直访问,该线程就会自动获取锁,降低获取锁的代价。

3.轻量级锁:在偏向锁的基础上,如果有其他线程访问,将会升级为轻量级锁,让线程以自旋的方式获取锁,线程不会阻塞。

4.重量级锁:当锁为轻量级锁时,自旋不会一直持续下去,达到一定次数后,还没有获取到锁,就会进入阻塞状态,该锁膨胀为重量级锁。当高并发时,获取不到锁的进入阻塞状态,等待操作系统调度

你可能感兴趣的:(java,开发语言)