• java锁 AQS 线程池 ThreadLocal


    JUC

    java锁

    关键信息

    • LockSupport LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程

    • Condition 需要和Lock联合使用,它的作用是代替Object监视器方法,可以通过await(),signal()来休眠/唤醒线程

    ReentrantLock

    • 可重入的互斥锁

    • 公平锁 FIFO等待队列

    • 非公平锁 不管在不在队列开头都能获取锁

    • 有一个成员变量sync,sync是Sync类型;Sync是一个抽象类,而且它继承于AQS

      函数列表

    // 创建一个 ReentrantLock ,默认是“非公平锁”。
    ReentrantLock()
    // 创建策略是fair的 ReentrantLock。fair为true表示是公平锁,fair为false表示是非公平锁。
    ReentrantLock(boolean fair)
    
    // 查询当前线程保持此锁的次数。
    int getHoldCount()
    // 返回目前拥有此锁的线程,如果此锁不被任何线程拥有,则返回 null。
    protected Thread getOwner()
    // 返回一个 collection,它包含可能正等待获取此锁的线程。
    protected Collection<Thread> getQueuedThreads()
    // 返回正等待获取此锁的线程估计数。
    int getQueueLength()
    // 返回一个 collection,它包含可能正在等待与此锁相关给定条件的那些线程。
    protected Collection<Thread> getWaitingThreads(Condition condition)
    // 返回等待与此锁相关的给定条件的线程估计数。
    int getWaitQueueLength(Condition condition)
    // 查询给定线程是否正在等待获取此锁。
    boolean hasQueuedThread(Thread thread)
    // 查询是否有些线程正在等待获取此锁。
    boolean hasQueuedThreads()
    // 查询是否有些线程正在等待与此锁有关的给定条件。
    boolean hasWaiters(Condition condition)
    // 如果是“公平锁”返回true,否则返回false。
    boolean isFair()
    // 查询当前线程是否保持此锁。
    boolean isHeldByCurrentThread()
    // 查询此锁是否由任意线程保持。
    boolean isLocked()
    // 获取锁。
    void lock()
    // 如果当前线程未被中断,则获取锁。
    void lockInterruptibly()
    // 返回用来与此 Lock 实例一起使用的 Condition 实例。
    Condition newCondition()
    // 仅在调用时锁未被另一个线程保持的情况下,才获取该锁。
    boolean tryLock()
    // 如果锁在给定等待时间内没有被另一个线程保持,且当前线程未被中断,则获取该锁。
    boolean tryLock(long timeout, TimeUnit unit)
    // 试图释放此锁。
    void unlock()
    

    ReadWriteLock

    • 唯一实现类ReentrantReadWriteLock

    CountDownLatch

    • 包含sync对象

    CyclicBarrier

    • 包含"ReentrantLock对象lock"和"Condition对象trip",它是通过独占锁实现的

    • CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。

    • CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

    Semaphore

    • Semaphore包含sync对象
    • 本质是一个共享锁
    • acquire()来获取信号量
    • release()来释放信号量

    AQS

    AQS AbstractQueuedSynchronizer

    • AQS是独占锁(例如,ReentrantLock)和共享锁(例如,Semaphore)的公共父类
    • 独占锁 ReentrantLock,ReentrantReadWriteLock.WriteLock
    • 共享锁 ReentrantReadWriteLock.ReadLock,CyclicBarrier, CountDownLatch和Semaphore都是共享锁

    CLH

    • CLH队列是AQS中“等待锁”的线程队列 FIFO
    • 并发条件下不会阻塞,而是通过自旋锁和 CAS 保证节点插入和移除的原子性

    CAS Compare And Swap

    • 通过CAS操作的数据都是以原子方式进行的
  • 相关阅读:
    seata原理
    activemq 启动时出现错误 Address already in use: JVM_Bind
    高并发第五弹:安全发布对象及单例模式
    高并发第三弹:线程安全原子性
    高并发第一弹:准备阶段 了解高并发
    CentOS7安装PostgreSQL9.4
    高并发第二弹:并发概念及内存模型(JMM)
    高并发第四弹:线程安全性可见性有序性
    设计模式模板方法模式
    设计模式建造者模式(图解,使用场景)
  • 原文地址:https://www.cnblogs.com/albertXe/p/16231093.html
Copyright © 2020-2023  润新知