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操作的数据都是以原子方式进行的