4.1 概念

内置锁 vs 显示锁

synchronize是java语言层面实现的锁,称为内置锁。使用方便代码简洁,而且在jdk新版本优化后,性能也得到了很大的提高。synchronize是一个可重入锁。而Lock是jdk提供开发者是用的一个显式锁。通过lock()和unlock()方法加锁和释放锁。

可重入锁 vs 不可重入锁

可重入的意思是指持有锁的线程在某种情况下,例如递归方式调用自身,此时不需要重新获得所,而是给内部维护的一个state值加1,每次方法出栈后state值减1,直到state值为0,锁被释放。

公平锁 vs 非公平锁

公平锁的含义是在并发环境,每个线程获取锁的时候,会先检查锁维护的线程等待队列,如果等待队列为空或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照FIFO的规则从队列中取到自己;非公平锁含义是在并发环境中,不理会等待队列中是否有等待的线程获取锁,允许插队,只要当前线程是available就可以占有锁,如果尝试失败,就再采用类似公平锁那种方式。ReentrantLock在创建的时候可以指定是公平锁还是非公平锁。不指定默认是非公平锁。而且一般认为非公平锁效率更好。

读锁 vs 写锁

读写锁一般是指ReentrantReadWriteLock类,通过该类的内置类变量:readerLock和writeLock可以分别获取读锁和写锁。其实ReadLock和WriteLock,从继承关系可以看出,也是实现了Lock接口,也是显示锁的一种。在什么情况下使用读写锁呢?答案是读多写少的情况。

		/** Inner class providing readlock */
private final ReentrantReadWriteLock.ReadLock readerLock;
/** Inner class providing writelock */
private final ReentrantReadWriteLock.WriteLock writerLock;

4.2 ReentrantLock源码解读

  • ReentrantLock实现了Lock接口,本身就是一个显式锁。
  • ReentrantLock内含一个Syn类,该类实现了AbstractQueuedSynchronizer.ReentrantLock是基于AQS实现的。

4.显式锁 Lock的更多相关文章

  1. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. java线程基础巩固---如何实现一个自己的显式锁Lock

    拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...

  3. Java 实现一个自己的显式锁Lock(有超时功能)

    Lock接口 package concurency.chapter9; import java.util.Collection; public interface Lock { static clas ...

  4. java并发多线程显式锁Condition条件简介分析与监视器 多线程下篇(四)

    Lock接口提供了方法Condition newCondition();用于获取对应锁的条件,可以在这个条件对象上调用监视器方法 可以理解为,原本借助于synchronized关键字以及锁对象,配备了 ...

  5. “全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  6. 显式锁(三)读写锁ReadWriteLock

    前言:   上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock.    ...

  7. 六、显式锁和AQS

    显式锁和AQS 一.显式锁 ​ Synchronized 关键字结合对象的监视器,JVM 为我们提供了一种『内置锁』的语义,这种锁很简便,不需要我们关心加锁和释放锁的过程,我们只需要告诉虚拟机哪些代码 ...

  8. java之AQS和显式锁

    本次内容主要介绍AQS.AQS的设计及使用.ReentrantLock.ReentrantReadWriteLock以及手写一个可重入独占锁 1.什么是AQS? AQS,队列同步器AbstractQu ...

  9. Java并发-显式锁篇【可重入锁+读写锁】

    作者:汤圆 个人博客:javalover.cc 前言 在前面并发的开篇,我们介绍过内置锁synchronized: 这节我们再介绍下显式锁Lock 显式锁包括:可重入锁ReentrantLock.读写 ...

随机推荐

  1. 【转】SSH指南

    OpenSSH OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现.它用安全.加密的网络连接工具代替了 telnet.ftp. rlogin.rsh 和 rcp 工具.Ope ...

  2. OkHttp3的简单使用(一)

    一.导入 1)gradle方式: compile 'com.squareup.okhttp3:okhttp:3.8.0'(okhttp 最新版) compile 'com.squareup.okio: ...

  3. .net Reflection(反射)- 二

    反射 Reflection 中访问方法 新建一个ClassLibrary类库: public class Student { public string Name { get; set; } publ ...

  4. HackTwo

    使用延迟加载以及避免代码重复 ​一.概要:     <include />标签是整理布局的有效工具,提供了合理组织XML布局文件的有效方法.     ViewStub是实现延迟加载视图的优 ...

  5. 申请免费通配符证书(Let's Encrypt)并绑定IIS(转载)

    本文转载自https://blog.csdn.net/qq_41608008/article/details/80491447 什么是 Let's Encrypt? 部署 HTTPS 网站的时候需要证 ...

  6. 使用 typescript ,提升 vue 项目的开发体验(1)

    此文已由作者张汉锐授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言:对于我们而言,typescript 更像一个工具 官方指南 从 vue2.5 之后,vue 对 ts ...

  7. PHP7 - MongoDB Driver 使用心得

    php7 只能使用Mongodb driver来驱动mongodb. 使用Mongodb Driver连接数据库 刚开始使用Mongodb Driver的时候我是拒绝的.查看官方文档只看到一排的类和不 ...

  8. 【guava】字符串操作

    一,Strings类 public void testStrings(){ Strings.isNullOrEmpty("");//返回true Strings.nullToEmp ...

  9. Tomcat8.5安装教程

    如果第一次安装的用户请耐心阅读哈安装方法1.下载完成后开始安装,第一次安装的用户建议直接点击“next”不选择插件2.可以自行设置账户名以及密码3.非常重要的一步!!!!!!!!!设置jdk安装目录, ...

  10. CKEditor编辑器的使用方法

    CKEditor  网页中实现所见即所得的编辑器. 使用步骤: 1.下载CKEditor  下载地址:http://ckeditor.com/download 2.添加CKEditor的文件夹到项目中 ...