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接口的更多相关文章

  1. 【JDK】JDK源码分析-AbstractQueuedSynchronizer(1)

    概述 前文「JDK源码分析-Lock&Condition」简要分析了 Lock 接口,它在 JDK 中的实现类主要是 ReentrantLock (可译为“重入锁”).ReentrantLoc ...

  2. 【JDK】JDK源码分析-AbstractQueuedSynchronizer(2)

    概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模 ...

  3. 【JDK】JDK源码分析-ReentrantLock

    概述 在 JDK 1.5 以前,锁的实现只能用 synchronized 关键字:1.5 开始提供了 ReentrantLock,它是 API 层面的锁.先看下 ReentrantLock 的类签名以 ...

  4. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  5. Timer的故事----Jdk源码解读

    咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...

  6. JDK源码分析之concurrent包(二) -- 线程池ThreadPoolExecutor

    上一篇我们简单描述了Executor框架的结构,本篇正式开始并发包中部分源码的解读. 我们知道,目前主流的商用虚拟机在线程的实现上可能会有所差别.但不管如何实现,在开启和关闭线程时一定会耗费很多CPU ...

  7. JDK源码那些事儿之并发ConcurrentHashMap上篇

    前面已经说明了HashMap以及红黑树的一些基本知识,对JDK8的HashMap也有了一定的了解,本篇就开始看看并发包下的ConcurrentHashMap,说实话,还是比较复杂的,笔者在这里也不会过 ...

  8. JDK源码系列总索引

    一 目标 记录学习jdk源码的一些笔记和心得,jdk版本使用11.0.1,工具idea Class后面序号为优先级1-4,优先级递减 目录转载自博客: https://blog.csdn.net/qq ...

  9. JDK源码包结构分类

    最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*.sun.*.org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正!   Jre库包含的jar文件(jdk1.6) ...

随机推荐

  1. eclipse回退到上个版本

    在  team->show in history 中 选择版本,执行Revert Commit,然后push 到master,这样就可以了

  2. Python处理Excel和PDF文档

    一.使用Python操作Excel Python来操作Excel文档以及如何利用Python语言的函数和表达式操纵Excel文档中的数据. 虽然微软公司本身提供了一些函数,我们可以使用这些函数操作Ex ...

  3. 【UML】NO.48.EBook.5.UML.1.008-【UML 大战需求分析】- 组件图(Component Diagram)

    1.0.0 Summary Tittle:[UML]NO.48.EBook.1.UML.1.008-[UML 大战需求分析]- 组件图(Component Diagram) Style:DesignP ...

  4. 【设计模式】用追MM来解释23种设计模式,转

    创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基 ...

  5. Entity Framework Code First(概要)

    EF开源项目地址:https://github.com/aspnet/EntityFramework6 MSDN :https://msdn.microsoft.com/en-us/library/a ...

  6. python中参数传递之位置传递、关键字传递、包裹传递与解包裹

    原文地址https://blog.csdn.net/love666666shen/article/details/77131487 1.位置与关键字传递 (1)位置传递:先用形式参数定义,然后在调用时 ...

  7. java生成随机六位数的验证码&随机生成十位数ValidCode码,用于邮件的验证&检查是不是符合为合法的中国的手机号码

    package com.demo.test1; import java.security.NoSuchAlgorithmException; import java.security.SecureRa ...

  8. EL语言表达式 (三)【EL中的算术运算以及判断EL对象是否为空】

    一.EL中的算术运算 EL和其他语言一样,同样也提供了基本的算术运算(加.减.乘.除和取余),如下图. 运算符 功能 示例 结果 + 加 ${19+1} 20 - 减 ${66-30} 36 * 乘 ...

  9. Apache Storm Installation

    安装的过程参照此处的过程介绍(https://www.tutorialspoint.com/apache_storm/apache_storm_installation.htm) 安装的过程要安装3个 ...

  10. Rpgmakermv(31)MOG插件与YEP的结合

    问题简述: 因为我在开发时使用了gamequestsystem(任务插件),所以必须使用YEP_mainmenumanager; 此时,我又想加个MOG_Picture插件(图片收集插件): 当他们在 ...