JDK源码之Lock接口
public interface Lock { //阻塞的获取锁,如果获取到锁,从该方法返回
void lock(); //可中断的获取锁,该方法会响应中断,在锁的获取中可以中断当前线程
void lockInterruptibly() throws InterruptedException; //尝试非阻塞的获取锁,调用方法之后立马进行返回,如果能获取返回true,不能则返回false
boolean tryLock(); //可超时的获取锁,在给定时间没有获取锁,从方法中返回
boolean tryLock(long time, TimeUnit unit) throws InterruptedException; //释放锁
void unlock(); //获取等待通知组件,该组件和当前的锁绑定,当前线程只有获取锁,才能调用该组件的wait()方法,调用后,锁被释放。
Condition newCondition();
}
从Lock接口可以看出,Lock提供了许多synchronized关键字不具备的很多功能。
1.具备了获取锁和释放锁的可操作性,synchronized将锁的获取和释放固化了,一定是先获取再释放。假设存在场景需要先获取锁A,再获取锁B,再对A进行释放,最后再对B进行释放,那么synchronized就无法进行实现。
2.可以中断的获取锁,在锁的获取过程中可以响应中断。通过lockInterruptibly()方法进行实现。
3.可以超时的获取锁,在一定时间内没有获取锁,方法返回。通过tryLock(time,unit)方法实现。
4.可以尝试非阻塞的获取锁,如果锁没有被占用,获取锁;如果锁被占用,方法立马返回。通过tryLock()方法实现。
5.Lock可以有公平锁和非公平锁的两种实现,公平锁是按照线程请求锁时间的顺序对锁进行分配,而非公平锁则是哪一个线程先抢到锁,就将锁分配给哪个线程。非公平锁可以减小上下文切换的开销,但是可能会造成某些线程饥饿(某一个线程长时间的无法获取锁),synchronized是一种非公平锁。
6.ReentrantLock和synchronized都是可重入锁,可以对一个资源重复加锁。
总结:
在线程并发数量较少的情况下,使用synchronized是很好的选择,但是在高并发的场景下,需要灵活的运用锁,这个时候使用ReentrantLock比较好。
JDK源码之Lock接口的更多相关文章
- 【JDK】JDK源码分析-AbstractQueuedSynchronizer(1)
概述 前文「JDK源码分析-Lock&Condition」简要分析了 Lock 接口,它在 JDK 中的实现类主要是 ReentrantLock (可译为“重入锁”).ReentrantLoc ...
- 【JDK】JDK源码分析-AbstractQueuedSynchronizer(2)
概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模 ...
- 【JDK】JDK源码分析-ReentrantLock
概述 在 JDK 1.5 以前,锁的实现只能用 synchronized 关键字:1.5 开始提供了 ReentrantLock,它是 API 层面的锁.先看下 ReentrantLock 的类签名以 ...
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现
(一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...
- Timer的故事----Jdk源码解读
咱们今天也来说说定时器Timer Timer是什么? Timer n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...
- JDK源码分析之concurrent包(二) -- 线程池ThreadPoolExecutor
上一篇我们简单描述了Executor框架的结构,本篇正式开始并发包中部分源码的解读. 我们知道,目前主流的商用虚拟机在线程的实现上可能会有所差别.但不管如何实现,在开启和关闭线程时一定会耗费很多CPU ...
- JDK源码那些事儿之并发ConcurrentHashMap上篇
前面已经说明了HashMap以及红黑树的一些基本知识,对JDK8的HashMap也有了一定的了解,本篇就开始看看并发包下的ConcurrentHashMap,说实话,还是比较复杂的,笔者在这里也不会过 ...
- JDK源码系列总索引
一 目标 记录学习jdk源码的一些笔记和心得,jdk版本使用11.0.1,工具idea Class后面序号为优先级1-4,优先级递减 目录转载自博客: https://blog.csdn.net/qq ...
- JDK源码包结构分类
最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*.sun.*.org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正! Jre库包含的jar文件(jdk1.6) ...
随机推荐
- 10.110.20.16上的MQTT server
apollo 10.110.20.16 root XnlzeNP2 /var/lib/apache-apollo-1.7.1 1 创建broker 进入 bin 创建 broker ...
- 《Java程序设计》第一周学习记录(1)
目录 Windows安装JDK.Git Linux下安装JDK.Git.IDEA 参考资料 Windows安装JDK.Git 到官网直接下载JDK,双击安装程序就正常安装就行了. 下载完以后,可以看到 ...
- PHP处理大文件下载
<?php /** * Created by PhpStorm. * User: Kung * Date: 15-10-21 * Time: 下午8:00 */ set_time_limit(0 ...
- Linux学习笔记:常用100条命令(二)
linux常用命令 1.vi中复制快捷键 yy --复制 p --粘贴 2.vi中保存退出 ZZ 3.linux解压zip unzip 4.查看软件组包 yum grouplist 5.安装组包 yu ...
- css3--之HSL颜色
jQuery之家: CSS3中使用的HSL颜色指南:http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201503281590.html 要理解HSL ...
- iOS UI布局-回到顶部
回到顶部,是比较常用的一个效果 核心代码 在ViewDidLoad中,添加回到顶部按钮 计算偏移量,如果当前显示的内容全部向上隐藏掉,则显示“回到顶部”按钮 // // ViewController. ...
- shell基础:数值运算与运算符
linux的shell中,变量的类型默认都是字符串型. export将aa声明为环境变量.也可用declare声明.其实就是改变了-x属性 $(()) 最常用.
- java 基础功能
1.str.length();// 获取整个字符串的长度 public class Test { public static void main(String[] args) { String s = ...
- WinPE引导硬盘安装64位的Windows_Server_2008系统
用 U盘WinPE引导实现硬盘安装Windows Server 2008 R2系统的方法如果想不用光盘(光盘和光驱总是靠不住的),只用U盘或移动硬盘上的WinPE引导,在电脑硬盘安装一个64位的Win ...
- java 中多线程和锁的使用以及获取多线程执行结果
多线程一:原生的写法 关键词 implements 实现 Runnable 类 run() 方法 注意点 : 创建类的实例 InterfaceController inter=new Int ...