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. 【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 ...

  2. 【LeetCode每天一题】Reverse Linked List(链表反转)

    Reverse a singly linked list. Example:           Input: 1->2->3->4->5->NULL          ...

  3. Centos7搭建Postfix发送邮件 Connection timed out

    telent  mx1.qq.com 25 25这个端口是不加密的,不安全,qq邮箱和网易的邮箱早就不用了.采用加密的方式

  4. pyCharm编辑器激活使用

    1.打开激活窗口 2.选择 Activate new license with License server (用license server 激活) 3.在 License sever addres ...

  5. Windows服务器时间不同步问题

    一台域内的服务器时间不停地被修改,我先向用户收集了一些信息 只有这一台出现此问题,其他服务器均为正常(补充一下,问题快解决完的时候用户告诉我一个重要的消息,就是时间被修改了一段时间后自动会被修改回去) ...

  6. vue-lazyload的使用

    1.下载依赖 npm install vue-lazyload --save 2.引入 import Vue from 'vue' import App from '@/App' import Vue ...

  7. python爬取12306及各参数的使用。完整代码

    import requestsfrom retrying import retryreuquests和retrying的下载及安装可以通过命令行pip install 口令实现 # 调用重连装饰器固定 ...

  8. 二 js表达式与运算符

    /** * Created by Administrator on 2017/12/14. * 表达式与运算符 */ //1.基本表达式 加减乘除 var a = 4; a = 7/6; var b ...

  9. lua学习之循环打印九九乘法表

    --第4题 输出99乘法表 function PrintMulitiplyTable() , do local res = {} local str = "" , i do res ...

  10. Applegate 方法使用

    1. - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotif ...