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) ...
随机推荐
- 【LeetCode每天一题】Median of Two Sorted Arrays(两数组中的中位数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the tw ...
- 【LeetCode每天一题】Reverse Linked List(链表反转)
Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL ...
- Centos7搭建Postfix发送邮件 Connection timed out
telent mx1.qq.com 25 25这个端口是不加密的,不安全,qq邮箱和网易的邮箱早就不用了.采用加密的方式
- pyCharm编辑器激活使用
1.打开激活窗口 2.选择 Activate new license with License server (用license server 激活) 3.在 License sever addres ...
- Windows服务器时间不同步问题
一台域内的服务器时间不停地被修改,我先向用户收集了一些信息 只有这一台出现此问题,其他服务器均为正常(补充一下,问题快解决完的时候用户告诉我一个重要的消息,就是时间被修改了一段时间后自动会被修改回去) ...
- vue-lazyload的使用
1.下载依赖 npm install vue-lazyload --save 2.引入 import Vue from 'vue' import App from '@/App' import Vue ...
- python爬取12306及各参数的使用。完整代码
import requestsfrom retrying import retryreuquests和retrying的下载及安装可以通过命令行pip install 口令实现 # 调用重连装饰器固定 ...
- 二 js表达式与运算符
/** * Created by Administrator on 2017/12/14. * 表达式与运算符 */ //1.基本表达式 加减乘除 var a = 4; a = 7/6; var b ...
- lua学习之循环打印九九乘法表
--第4题 输出99乘法表 function PrintMulitiplyTable() , do local res = {} local str = "" , i do res ...
- Applegate 方法使用
1. - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotif ...