一、概述
本文主要与大家分享Java锁种类,从不同维度,可将锁分为乐观锁和悲观锁,独享锁和共享锁,互斥锁和读写锁,可重入锁,公平锁与非公平锁,偏向锁、轻量级锁和笨重锁,自旋锁,单体锁和分布式锁等。
若您对文中观点有不同看法或见解,欢迎博客下面留言,或一对一交流。
二 、锁种类
2.1 乐观锁和悲观锁
乐观锁:指在访问临界资源时,认为除自己外,没有其他对象修改该临界资源,因此不对该资源加锁,只有在更新完数据,回写该临界资源时,才会去判断该临界资源是否被其他对象更改,若版本号匹配,则更改成功,若版本号不匹配,则更改失败。判断的方式一般采用比对版本号方式。如在jdk中,java.util.concurrent.atomic下面的CAS(Compare and Swap)。
悲观锁:指在访问临界资源时,总是认为其他对象会修改该临界资源,因此每次在取临界资源时,总是加上锁,阻塞其他对象获取该资源。Jdk1.8中,synchronized,ReentrantLock等就是悲观锁。
2.2 独享锁/共享锁
独享锁:指在任何时刻,对于同一把锁,该锁只被一个线程持有。
共享锁:指在任何时刻,对于同一把锁,该锁可被多个线程所持有。
如在jdk1.8中,synchronized和ReentrantLock属于独享锁;ReentrantReadWriteLock,其读锁属于共享锁,而写锁属于独享锁。
2.3 互斥锁/读写锁
互斥锁:互斥锁本质与独享锁一直,这里不做论述
读写锁:指锁具备读锁和写锁功能,读锁是共享锁,写锁是排它锁。在jdk1.8中,ReentrantReadWriteLock就是读写锁。
2.4 可重入锁
可重入锁(也叫递归锁),指若一个线程在外层获取锁,则自动在内层获取锁。可重入锁的意义在于避免死锁。在jdk1.8中,synchronized和ReentrantLock都是可重入锁。
2.5 公平锁/非公平锁
公平锁:指多个线程同时申请锁时,获取锁的顺序与申请锁的顺序一致。
非公平锁:指多个线程同时申请锁时,获取锁的顺序与申请锁的顺序不一定一致,有可能后申请锁的线程优先获得锁(如该线程优先级最高时,一般会优先获取锁,即使是申请锁的顺序排在最后)。非公平锁,可能会造成线程饥饿,在项目实战中,一般采用非公平锁。
在jdk1.8中,ReetrantLock默认为非公平锁,可通过构造函数实现公平锁。
2.6 分段锁
分段锁:指按照锁锁定的粒度(或范围),锁定局部资源。
在jdk1.8中,ConcurrentHashMap就是采用分段锁实现的。
2.7 偏向锁/轻量级锁/重量级锁
偏向锁:指对于一段同步代码,若某个线程频繁访问或一直访问,那么该线程会自动获取该资源锁。
轻量级锁:指对某个资源,当线程持有的锁为偏向锁时,此时另一个线程访问该资源,则该线程偏向锁会自动升级为轻量级锁,此时其他线程通过自旋方式尝试获取锁。
重量级锁:指当锁为轻量级锁时,其他线程中,有一个或多个线程不停地自旋尝试获取锁,自旋到一定次数后,就会被阻塞,则该锁会升级为重量级锁。锁一旦升级为重量级锁,就具备排他锁能力,会让其他线程进入等待状态。
2.8 自旋锁
自旋锁:指当一个线程访问某个资源被阻塞时,不是直接终止该线程,而是让该线程不停地、间歇地轮询尝试获取锁,直到获取锁为止。
2.9 单体锁和分布式锁
单体锁:指单JVM锁,如synchronized,ReentrantLock,ReentrantReadWriteLock等
分布式锁:指分布式场景下的锁,如Redis的setnx,Redisson框架等
三、联系方式及版权
(一)作者介绍
1.曾任职于传音控股资深架构;原支付宝总部专家,业务中台架构师;
2.十多年多行业架构经验(如互联网电商,跨境电商,支付行业和物联网行业等),擅长高流量,高并发架构
3.擅长于业务中台架构
(二)版权
1.转载必须注明博客出处
2.博主网址:
(1)博客园:http://www.cnblogs.com/wangjiming/
(2)csdn: https://blog.csdn.net/u010228798
3.如您有新想法,欢迎提出,邮箱:2098469527@qq.com
4.专业化Java之家QQ群:924412846
5.架构师辅助群:2098469527
6.交流与学习:
(1)微信:13636595487
(2)QQ:2098469527