Java各种锁关系简述
乐观锁和悲观锁是锁的总体实现的思想层面概念:
乐观锁:就是乐观思想,即认为读多,每次读取数据不会加锁,只有在更新数据的时候会加锁,再进行更新,常见的实现方式(版本号控制,cas算法,共享锁等)
悲观锁:就是悲观思想,即认为写多,每次读写数据前先加锁,再进行读写,常见悲观锁:synchronized和ReentrantLock等独占锁
自旋锁:是一种锁竞争机制,比如在悲观锁里,需要获取的时候是否使用自旋锁的方式竞争还是阻塞式
Synchronized 同步锁,属于独占式的悲观锁,Synchronized 锁机制会根据线程竞争情况在运行会有偏向锁、轻量锁、重量锁
可重入锁(递归锁),广义上的可重入锁,,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。在 JAVA 环境下 ReentrantLock 和 synchronized 都是 可重入锁。
公平锁与非公平锁,是指一种锁竞争的策略:
公平锁(Fair)
加锁前检查是否有排队等待的线程,优先排队等待的线程,先来先得
非公平锁(Nonfair)
加锁时不考虑排队等待问题,直接尝试获取锁,获取不到自动到队尾等待