自旋锁:就是不断地通过循环来试图获取锁,避免上下文切换的巨大代价。某些临界区操作仅仅是修改或者读取某个值,操作时间很短。
在不是很严格的意义上可以认为:
悲观锁 = 操作系统互斥锁,关开中断实现 = 重量级锁
乐观锁 = 自旋锁,CAS实现 = 轻量级锁 (自适应自旋锁可以控制轮询的次数或者时间,超过就阻塞了)
偏向锁 = 压根没有锁
Java中有三种锁,偏向锁,轻量级锁和重量级锁
当然Java中还存在读写锁,读写锁的实现方式暂时不明。
可重入锁:当前获取锁的线程可以再次获取锁
公平锁:加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得。
关于更细粒度的锁是不是会导致性能下降的问题
1.更细粒度的锁几乎一定能引起并发性能的上升。
2.对于单线程程序性能的影响:
如果取消了大锁之后,加上细粒度的锁太多,会导致性能下降,如python中的GIL。
但是像mysql那样,当从表级锁切换到行级锁,依然只有一个锁的时候,个人认为不会导致单线程程序的性能下降。