资讯专栏INFORMATION COLUMN

java.util.concurrent.locks包

XboxYan / 2672人阅读

摘要:在包中有很多的实现类,常用的有,其实现都依赖类,实现思路都大同小异。类调用,进而调用类让操作系统进行和,从而达到线程的阻塞和恢复。

在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReentrantReadWriteLock,其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异。

同时,Lock提供了Condition接口,类似与Object的wait/notify,但比后者要方便的多、灵活的多。

ReentrantLock的调用过程

ReentrantLock把所有Lock接口的操作都委派到一个Sync类上,该类继承了AbstractQueuedSynchronizer。

static abstract class Sync extends AbstractQueuedSynchronizer

Sync又有两个子类:

final static class NonfairSync extends Sync
final static class FairSync extends Sync

Reentrant.lock()方法的调用过程(默认非公平锁):

AbstractQueuedSynchronizer通过构造一个基于阻塞的CLH队列容纳所有的阻塞线程,而对该队列的操作均通过Lock-Free(CAS)操作,但对已经获得锁的线程而言,ReentrantLock实现了偏向锁的功能。

非公平锁的代码中总是优先尝试当前是否有线程持有锁,一旦没有任何线程持有锁,那么非公平锁就霸道的尝试将锁“占为己有”。如果在抢占锁的时候失败就和公平锁一样老老实实的去请求。也即是说公平锁和非公平锁只是在入AQS的CLH队列之前有所差别,一旦进入了队列,所有线程都是按照队列中先来后到的顺序请求锁。

Lock类调用LockSupport,LockSupport进而调用Unsafe类让操作系统进行park和unpack,从而达到线程的阻塞和恢复。

ReentrantReadWriteLock类

适用于有很多线程都从某个数据结构中读取数据而很少有线程对其进行修改的场景,允许读取器线程共享访问,但与写入器线程依然是互斥的。

private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();  
private Lock readLock = rwl.readLock(); //得到一个可被多个读操作共用的读锁,但它会排斥所有写操作  
private Lock writeLock = rwl.writeLock(); //得到一个写锁,它会排斥所有其他的读操作和写操作

public double getTotalBalance(){  
    readLock.lock();  
    try {
        ...
    } finally {
        readLock.unlock();
    }  
}

public void transfer(){  
    writeLock.lock();  
    try {
        ...
    } finally {
        writeLock.unlock();
    }  
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67031.html

相关文章

  • Java多线程进阶(一)—— J.U.C并发概述

    摘要:整个包,按照功能可以大致划分如下锁框架原子类框架同步器框架集合框架执行器框架本系列将按上述顺序分析,分析所基于的源码为。后,根据一系列常见的多线程设计模式,设计了并发包,其中包下提供了一系列基础的锁工具,用以对等进行补充增强。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首发于一世流云专栏:https...

    anonymoussf 评论0 收藏0
  • JVM调优前戏之JDK命令行工具---jstack

    摘要:用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的就是定位线程出现长时间停顿的原因,如线程死锁死循环请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。 在JDK的命令行中,一般开发人员最耳熟能详的肯定就是java,javac,javap等常用命令,不过在jdk/bin下还有许多其他的命令行工具,它们被用来监...

    Cristic 评论0 收藏0
  • Java™ 教程(Lock对象)

    Lock对象 同步代码依赖于简单的可重入锁,这种锁易于使用,但有许多限制,java.util.concurrent.locks包支持更复杂的锁定语法,我们不会详细检查这个包,而是将重点放在其最基本的接口Lock上。 Lock对象的工作方式与同步代码使用的隐式锁定非常相似,与隐式锁一样,一次只有一个线程可以拥有一个Lock对象,Lock对象还通过其关联的Condition对象支持wait/notif...

    RobinQu 评论0 收藏0

发表评论

0条评论

XboxYan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<