1、概述

    1.1、jdk5之前,用于  调节共享对象访问机制  只有 synchronized、volatile;

          jdk5之后,提供了  显示锁:Lock、ReentrantLock...;

        显式锁  并不是  内部锁机制  的替代,而是  当内部锁被证明受到局限时,提供可选择的高级特性;

    1.2、Lock接口

        1.2.1、Lock接口,定义了  一些  抽象的锁操作;

                  与内部锁机制不同,Lock   提供了  无条件的、可轮询、定时、可中断   的 锁获取操作;

                  所有的加锁、解锁都是  显式的;

        1.2.2、Lock的实现   提供了   与   内部锁  相同的内存可见性;

                  但   加锁的语义、调度算法、顺序保证、性能特征  与内部锁不同;

    1.3、ReentrantLock接口

        1.3.1、ReentrantLock  实现了 Lock 接口,提供了   与 synchronized  相同的互斥、内存可见性;

        1.3.2、为何要创建与内部锁如此相似的机制?

              内部锁  大部分情况下  能很好地工作,但是 有一些功能上的局限(不能中断   那些正在  等待获取锁的线程,且  请求锁失败的情况下,必须无限等待);

        1.3.3、注意事项

              a,锁  必须   在finally 块中释放;

              b,如果  锁守护的代码  在   try块之外抛出异常,它将  永远不会被释放了;

        1.3.4、可轮询、可定时的锁获取

              I、可定时、可轮询的锁获取,由  tryLock()实现;

                          与  无条件的  锁获取  相比,它具有更完善的错误恢复机制;

              II、可定时、可轮询的锁获取,可以避免 死锁  的发生(在内部锁中,死锁是致命的,唯一的恢复方法是重启应用程序,构建程序时不允许出错);

              III、对于实现那些  具有时间限制  的活动,定时锁同样非常有用;

        1.3.5、可中断的锁获取

              I、可中断的锁获取  允许  在可取消的活动中使用;

              II、当你 正在响应中断的时候,lockInterrupter()能够使你获取锁,且 它是内置于 Lock的,不需要再创建其他种类不可中断的阻塞机制;

        1.3.6、非块结构的锁

              I、???

2、锁的性能

    2.1、内部锁(synchronized) 与 显式锁(Lock)  的性能和可伸缩性 是基于平台的,比如:CPU、处理器数量、高速缓存大小、JVM特性...;

3、锁的公平性

    3.1、ReentrantLock  构造函数  提供了  2种公平性的选择:

            a,非公平锁(默认)

                I、线程的请求可以  在等待线程的队列中向前跳跃,获得该锁;

                II、线程只有当锁被占用时才会等待;

            b,公平锁

                I、如果锁已被线程占用,新的线程请求会加入到等待队列,线程必须  按顺序获取;

4、synchronized与ReentrantLock选择

    4.1、在内部锁不能满足使用时,ReentrantLock才被作为更高级的工具;

    4.2、当你需要以下高级特性时,才应该使用:

        a,可定时、可轮询的锁获取;

        b,可中断的锁获取;

        c,公平队列;

        d,非块结构的锁;    

5、读写锁

    5.1、ReentrantLock实现了标准的互斥锁(一次最多只有一个线程能够持有相同的lock);

    5.2、互斥锁  过分地限制了并发性,避免了"写/写"、"写/读"、"读/读"操作; 

        读写锁  :一个资源可  被多个读者访问(或  被一个写者访问  [2者不能同时进行]);   

    5.3、jdk提供了 ReadWriteLock、ReentrantReadWriteLock:

        a,ReentrantReadWriteLock  提供了  可重入的加锁语义;

        b,ReentrantReadWriteLock   可被  构造为  非公平、公平锁:

            公平锁

                选择权  交给  等待时间最长的线程;

              如果   锁由读者获得,而  另一个线程请求写入锁,那么   不允许读者获得读取锁,直到  写者被受理,且已释放写入锁;

            非公平锁

              线程运行访问的顺序不定;

              由  写者降级为读者   允许的,读者升级为写者不允许;

        c,ReentrantReadWriteLock  的  写入锁  有   唯一的所有者  ,  且  只能被  获得了该锁的线程释放;

                  

    

JavaSE---显式锁的更多相关文章

  1. 深入理解Java内置锁和显式锁

    synchronized and Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两 ...

  2. Java并发编程之显式锁机制

    我们之前介绍过synchronized关键字实现程序的原子性操作,它的内部也是一种加锁和解锁机制,是一种声明式的编程方式,我们只需要对方法或者代码块进行声明,Java内部帮我们在调用方法之前和结束时加 ...

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

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

  4. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

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

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

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

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

  7. Java编程的逻辑 (71) - 显式锁

    ​本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...

  8. 显式锁(二)Lock接口与显示锁介绍

    一.显式锁简介    显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...

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

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

  10. 显式锁(四)Lock的等待通知机制Condition

       任意一个Java对象,都拥有一组监视器方法(定义在根类Object上),主要包括:wait( ).wait(long timeout).notify().notifyAll()方法:这些方法与关 ...

随机推荐

  1. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_05.mybatis环境搭建-前期准备

    视频中右侧没有勾选 直接finish 用下面的sql里面的一些表来实现今天的功能 只需要用到里面的user表. 这是之前已经建好的数据库 把表都删除掉,用sql语句去创建表和表内的记录,最终的结果: ...

  2. 【漏洞学习】slowHTTPtest 慢速 DOS 攻击方法 修复方案

    日期:2018-05-28 21:41:59 更新:2019-07-05 23:15:21 作者:Bay0net 介绍:学习一下 slowHTTPtest 的攻击及防御. 0x01. 安装 下载链接 ...

  3. Intellij IDEA 常见问题

    右击项目时,没有 Java Class,只能创建其他文件 IDEA 还没有将这个项目识别为 Maven 项目时,会出现这种情况.此时右键无法创建类. 解决办法: 手动为 IDEA 指定项目类型:如果编 ...

  4. redis 锦集

    redis 锦集url:http://blog.csdn.net/lqadam/article/category/7479450 1. redis 排序 2.redis 慢查询.位数组和事务 3.re ...

  5. 【HANA系列】SAP HANA SQL获取当前月的第一天

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL获取当前 ...

  6. bzoj3028食物 关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明

    关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明对于第i项,假设为5x^5=x^0*x^5x^5=x^1*x^4x^5=x^2*x^3........也就是说 ...

  7. 可持久化并查集 by zky

    zz:https://www.cnblogs.com/cjoierljl/p/9567859.html https://www.cnblogs.com/peng-ym/p/9357220.html n ...

  8. 【Linux开发】Ubuntu图形界面切换与磁盘扩展分区

    Ubuntu14.04设置字符界面快捷键:ctrl-alt-f1 切换回图形界面:ctrl-alt-f7 为虚拟机拓展了30G的空间,挂在了/mnt/sda3这个目录下: 说明一下Ubuntu14.0 ...

  9. homestead修改php版本

    登录后 如果之前没有设置过root密码 sudo passwd root 以root 权限执行如下命令,选择对应php版本 # 查看所有 php 版本和当前版本 update-alternatives ...

  10. 使用JavaScript获取url中的参数值

    今天需要用到从url中获取参数,在网上找了几个JavaScript方法,mark下来.   一些可以使用的去获取url中指定的部分:如http://www.mystuff.com.cn/aboutus ...