Java 锁种类

一、概述

本文主要与大家分享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
 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值