今天学习Lock与ReentrantLock。 Java中的锁有两种,synchronized与Lock。因为使用synchronized并不需要显示地加锁与解锁,所以往往称synchronized为隐式锁,而使用Loc…
分类:java并发
Java并发编程札记-(四)JUC锁-01概述
今天来学习JUC锁。JUC锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器。 参考JDK1.8的java.util.concurrent.locks包,…
Java并发编程札记-(四)JUC锁-03AQS
AQS,AbstractQueuedSynchronizer的缩写,是JUC中非常重要的一个类。javadoc中对其的介绍是: 为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一…
Java并发编程札记-(四)JUC锁-05ReentrantReadWriteLock简介
前面在Java并发编程札记-(四)JUC锁-02Lock与ReentrantLock一文中已经学习了ReentrantLock,其中提到了ReentrantLock是互斥锁。与互斥锁相对应的是共享锁。ReadWriteL…
Java并发编程札记-(四)JUC锁-04Condition简介
我们已经学习了如何通过使用锁来同步两个任务,但为了解决某个问题,任务之间只有互斥是不够的,还需要相互通信,相互协作。今天就来学习如何实现任务之间的协作。 初识Condition 在任务协作中,关键问题是任务之间的通信。握…
Java并发编程札记-(四)JUC锁-06LockSupport
LockSupport是JUC锁中比较基础的类,用来创建锁和其他同步类的基本线程阻塞原语。比如,在AQS中就使用LockSupport作为基本线程阻塞原语。它的park()和unpark()方法分别用于阻塞线程和解除阻塞…
Java并发编程札记-(四)JUC锁-07读写锁的升级—StampedLock
StampedLock是JDK1.8新增的一个锁,是对读写锁ReentrantReadWriteLock的改进。前面已经学习了ReentrantReadWriteLock,我们了解到,在共享数据很大,且读操作远多于写操作…
Java并发编程札记-(四)JUC锁-09CyclicBarrier
CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点。如果你希望一组并行的任务在下个步骤之前相互等待,直到所有的任务都完成了下个步骤前的所有操作,才继续向前执行,那么CyclicBarrier很合适。 …
Java并发编程札记-(四)JUC锁-08CountDownLatch
CountDownLatch是一个通用同步器,用于同步一个或多个任务。在完成一组正在其他线程中执行的任务之前,它允许一个或多个线程一直等待。 可以用一个初始计数值来初始化CountDownLatch对象,任何在这个对象上…
Java并发编程札记-(五)JUC容器-01概述
今天开始学习JUC容器。JUC提供了用于多线程上下文中的Collection实现与高效的、可伸缩的、线程安全的非阻塞FIFO队列。参考JDK1.8,画出下图。 List JUC容器中List的实现只有CopyOnWrit…
Java并发编程札记-(四)JUC锁-10Semaphore简介
一般的锁在任意时刻只允许一个线程访问一项资源,而计数信号量允许n个任务同时访问一项资源。我们可以将信号量看做一个许可集,可以向线程分发使用资源的许可证。获得资源前,线程调用acquire()从许可集中获取许可。该线程结束…
Java并发编程札记-(五)JUC容器-03ConcurrentHashMap
今天来学习ConcurrentHashMap在JDK1.8中的实现。相比JDK1.7,JDK1.8中ConcurrentHashMap的实现有很大的不同。 结构 先来看下JDK1.7与JDK1.8中ConcurrentH…