工具类 | 工具类作用 | 工具类加锁方法 | 工具类释放锁方法 | Sync覆盖的方法 | Sync非覆盖的重要方法 | state的作用 | 锁类型 | 锁维护 |
Semaphore | 控制同时访问某个特定资源的操作数量 | acquire:每次请求一个许可都会导致计数器减少1,,一旦达到了0,新的许可请求线程将被挂起 | release:每调用 添加一个许可,释放一个正在阻塞的获取者 | tryAcquireShared tryReleaseShared |
|
表示初始化的许可数 | 共享锁 | 每一次请求acquire()一个许可都会导致计数器减少1,同样每次释放一个许可release()都会导致计数器增加1,一旦达到了0,新的许可请求线程将被挂起。 |
CountDownLatch | 把一组线程全部关在外面,在某个状态时候放开。一种同步机制来保证一个或多个线程等待其他线程完成。 | await:在计数器不为0时候阻塞调用线程,为0时候立即返回 | countDown :计数递减 | tryAcquireShared tryReleaseShared |
|
维护一个计数器 | 共享锁 | 初始化一个计数,每次调用countDown方法计数递减,在计数递减到0之前,调用await的线程都会阻塞 |
ReentrantLock | 标准的互斥操作,也就是一次只能有一个线程持有锁 | lock:如果没有线程使用则立即返回,并设置state为1;如果当前线程已经占有锁,则state加1;如果其他线程占有锁,则当前线程不可用,等待 tryLock:如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false | unlock:尝试释放锁,如果当前线程占有锁则count减一,如果count为0则释放锁。如果占有线程不是当前线程,则抛异常 | tryAcquire tryRelease |
nonfair TryAcquire |
state表示获得锁的线程对锁的重入次数。 | 排他锁。 | 获取锁时,如果没有线程使用则立即返回,并设置state为1;如果当前线程已经占有锁,则state加1;如果其他线程占有锁,则当前线程不可用。释放锁时,在该方法中主要作用是state状态位减少release个,表示释放锁,如果更新后的state为0,表示当前线程释放锁,如果不为0,表示持有锁的当前线程重入数减少 |
ReentrantReadWriteLock | 读写锁。允许多个读线程同时持有锁,但是只有一个写线程可以持有锁。写线程获取写入锁后可以再次获取读取锁,但是读线程获取读取锁后却不能获取写入锁 | ReadLock#lock :获取读锁 ReadLock#tryLock:尝试当前没有其他线程当前持有写锁时获取读锁 WriteLock#lock:获取写锁 WriteLock#tryLock:尝试当前没有其他线程持有写锁时,呼气写锁。 | ReadLock#unlock:释放读锁 WriteLock#unlock:释放写锁 | acquireShared releaseShared tryAcquire tryRelease |
tryReadLock tryWriteLock |
高16位表示共享锁的数量,低16位表示独占锁的重入次数 | 读锁:共享 写锁:排他 | 对于共享锁,state是计数器的概念。一个共享锁就相对于一次计数器操作,一次获取共享锁相当于计数器加1,释放一个共享锁就相当于计数器减1;排他锁维护类似于可重入锁。 |
FutureTask | 封装一个执行任务交给其他线程去执行,开始执行后可以被取消,可以查看执行结果,如果执行结果未完成则阻塞。 | V get() | run() set(V) cancel(boolean) | tryAcquireShared tryReleaseShared |
innerGet innerRun() innerSet innerIsCancelled | state状态位来存储执行状态RUNNING、RUN、CANCELLED | 共享锁 | 获取执行结果的线程(可以有多个)一直阻塞,直到执行任务的线程执行完毕,或者执行任务被取消。 |
- 浏览: 138178 次
最新评论
-
jinmh716:
学习学习
Git 版本控制工具介绍(一) -
MCLoginandPwd:
分享一款代码生成器,拖拽式组件结合流式处理,很容易的访问数据库 ...
git文件存储原理解析(八) -
cheleiyan:
请教楼主,maven-aggregate是如何用eclipse ...
maven的聚合模块和pom继承使用(六) -
carlosfu:
赞1!!
mysql学习整理 -
liushuiwuyan:
好东西,不错,学习了
maven的生命周期,插件介绍(二)
相关推荐
- **概述**:`Semaphore` 是一种用于控制同时访问特定资源的线程数量的同步工具类。 - **常用方法**: - `acquire()`:获取许可,如果没有足够的许可,则等待。 - `release()`:释放一个许可。 - **应用场景**:...
- **使用更高效的同步工具**:选择合适的数据结构和算法,比如使用`StampedLock`代替`ReentrantReadWriteLock`等。 #### 6. 错误处理 - **异常安全**:确保并发程序在出现异常时能够正确处理资源释放等问题。 - **...
Java中的ReentrantLock...总的来说,ReentrantLock提供了一种灵活且高效的线程同步机制,既满足了公平性需求,又允许优化性能,是Java并发编程中的重要工具。理解其工作原理和源码细节,对于提升并发编程能力大有裨益。
LockSupport是Java中用于多线程同步的一个工具类,它提供了一组基础的线程阻塞和解除阻塞的方法。这个类位于java.util.concurrent.locks包下,是实现并发编程中AQS(AbstractQueuedSynchronizer)框架的重要基础之一...
71. AQS是一个抽象的同步队列,实现独占锁、读写锁等,通过维护一个状态和双端队列实现。 72. AQS的资源共享方式包括独占(如ReentrantLock)和共享(如Semaphore)。 73. 让Java线程同步可以使用synchronized、...
AbstractQueuedSynchronizer(AQS)是JDK中的一个用于构建锁和同步器的框架,它利用一个int成员变量来表示同步状态,并通过内置的FIFO队列来管理线程的排队工作。AQS为实现依赖于先进先出(FIFO)等待队列的阻塞锁和...
- **AbstractQueuedSynchronizer (AQS)**:抽象类,作为许多同步组件的基础,如 ReentrantLock、Semaphore 等。 - **同步状态**:AQS 通过维护一个整型的同步状态来实现同步操作。 #### JDK工具篇 **12. 线程池...
- **AQS简介**:AQS是实现锁和同步器的抽象基础类,它通过维护一个FIFO等待队列和一个整型状态字段state来管理锁的获取和释放。很多并发工具类,如ReentrantLock、Semaphore等,都是基于AQS构建的。 - **等待队列...
1. **JDK常用类**:深入理解JDK提供的各种工具类,如并发工具类、日期时间API等。 2. **设计模式**:掌握几种常见的设计模式,如单例、动态代理、模板方法、责任链等。 3. **数据结构**:理解数组、链表、栈、队列、...
本文将深入探讨`synchronized`的工作原理、实现机制以及与其他并发工具的对比。 **synchronized线程安全** 线程安全是多线程编程中的一个核心概念,它指的是当多个线程同时访问一个对象时,该对象的状态不会被破坏...
- **CountDownLatch 和 CyclicBarrier**:两者都是并发工具类,CountDownLatch用于一次性释放多个线程,CyclicBarrier则允许一组线程等待彼此到达某个点再继续执行。 2. **数据库(MySQL)**: - **索引**:包括...
4. AQS(AbstractQueuedSynchronizer)是JDK提供的一个用于构建锁和其他同步组件的基础框架。 对比Synchronized和ReentrantLock: - Synchronized是内置的,ReentrantLock是API级别的,后者提供了更丰富的控制。 -...