JavaSE---多线程---显式锁

1、概述

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

          jdk5之后,提供了  显示锁LockReentrantLock...;

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

    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提供了 ReadWriteLockReentrantReadWriteLock

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

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

            公平锁

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

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

            非公平锁

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

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

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

                  

    

posted on   anpeiyong  阅读(105)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示