首先上一张图
是不是吓一跳,下面我们来一项一项说明各种锁的概念以及使用
1.乐观锁
乐观锁顾名思义就是一种乐观的思想,认为读数据时没有别的线程进行过修改,所以不会上锁,写数据时判断当前与期望的值是否相同,如果相同进行更新(更新期间是要枷锁的,为了保证原子性)
举例:java中的乐观锁---CAS
CAS的使用以及CAS原子操作面临的问题,以及解决方案
CAS的详细内容请参考
多线程常见面试题总结(简单版)_Mr.米斯特儿赵的博客-CSDN博客 第17个回答
2.悲观锁
悲观锁顾名思义就是一种悲观的思想,每次拿数据都会悲观的认为其他线程修改了数据,所以每次读写时都会上锁,其他线程想要读写这个数据时,就会被该线程阻塞 ,直到这个线程释放锁.
举例: java中的悲观锁 synchronized修饰的方法和方法块 比如我们尝试用的hashtable,以及StringBuffer他们的方法都被synchronized修饰,ReentrantLock不仅悲观还重入(也属于重入锁)
3.自旋锁
自旋锁就是在获取锁的时候,如果锁被其他线程获取,该线程就会一直循环等待,一直尝试着去获取锁,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞
自旋锁的优点: 避免了线程切换的开销,不会使线程进入阻塞的状态,减少了不必要的上下文的切换,执行速度块
自旋锁的缺点: 长时间占用处理器,会白白消耗 处理器资源,却没有干任何事情,性能浪费
所以自旋等待的时间必须有一定的限度 超过限度就挂起 线程
自旋默认的次数: 10次
4.可重入锁(递归锁)
可重入锁使一种技术,任意线程在获取到 锁之后能够再次 获取 该锁而不会被锁阻塞
原理 : 通过组合自定