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) ...
随机推荐
- express使用
1.安装express命令 cnpm install express --save 2.使用方法 var express = require('express'); var app = express ...
- 7个Java项目,或许你的大学老师就会布置
前言: 有天吃饭和朋友聊天,说到大学老师布置的开发项目,结果我们一干人说出来的都基本一样,入门级别的计算器啦,稍微大一点的记事本啦,然后到后面的图书管理系统啊,购物网站啊-- 发现这些项目都是大学老师 ...
- pip3 install pymysql
后续设置参考 “selenium python3” https://www.cnblogs.com/jpr-ok/p/10108231.html
- 《全栈性能Jmeter》-3JMeter体系结构
- WebAssembly 浏览器中运行c/c++模块
今天,要给前端造点儿福利 浏览器中能调用javascript,曾经我们以为够用了,够强大了,但是事实上是完全不够 还好,mozilla的工程师提出了webassembly,目前是利用emsctript ...
- C# 指定http请求使用Tls1.2
转载于 https://blog.csdn.net/yanghaitian/article/details/77498872 客户端语言 版本 类库 是否支持 兼容方案 Java 1.6.115之 ...
- React对比Vue(04 父子组件的通信 )
跟vue差不多 都是props,但是react里面不仅可以给子组件传值,还可以传方法,MD尽然还可以把自己传给子组件,(卧槽vue可没有这个啊 ) vue的传递值差不多,传方法就不用了,子组件可以掉 ...
- vue中点击复制粘贴功能
1.下载clipboard.js cnpm install clipboard --save 2.引入,可以在mian.js中全局引入也可以在单个vue中引入 import Clipboard fro ...
- js的基本包装类型
基本包装类型(包装对象): 先看下以下代码: var s1 = "helloworld"; var s2 = s1.substr(4); 上面我们说到字符串是基本数据类型,不应该有 ...
- hbase-java-api002(flush)
package api; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apa ...