目录
5 并发容器(Concurrent Collections):
在Java的juc
(即java.util.concurrent
)包中,包含了许多用于并发编程的类和接口。这些类和接口提供了各种并发控制和线程管理的功能。以下是一些主要类及其作用:
1 锁(Locks):
1.1 ReentrantLock:
这是一个可重入的互斥锁,它提供了与内置同步锁(synchronized)相同的基本行为和语义,但功能更强大。与synchronized相比,ReentrantLock提供了更灵活的锁定策略,如公平锁、非公平锁、可中断的获取锁以及尝试获取锁等。
问题一:跟 Synchronized 相比,可重入锁 ReentrantLock 其实现 原理有什么不同?
其实,锁的实现原理基本是为了达到一个目的: 让所有的线程都能看到某种标记。
Synchronized 通过在对象头中设置标记实现了这一目的,是一种 JVM 原生的锁实现方式,
而 ReentrantLock 以及所有的基于 Lock 接口的 实现类,都是通过用一个 volitile 修饰的 int 型变量,并保证每个线 程都能拥有对该 int 的可见性和原子修改,其本质是基于所谓的 AQS 框架。
AQS的核心组成:
- 状态(State):一个volatile修饰的int类型的变量,表示同步状态。
- FIFO队列:一个双向链表,用于保存等待获取资源的线程。
- 独占模式(Exclusive Mode)和共享模式(Shared Mode):AQS支持两种同步模式。独占模式下,只有一个线程能够获取到资源;共享模式下,多个线程可以同时获取到资源。
1.2 ReentrantReadWriteLock:
这是一个可重入的读写锁,允许多个读线程同时访问共享资源,但只允许一个写线程独占访问。这有助于提高读操作的并发性能。
1.3 StampedLock:
这是JDK 1.8中新增的一个读写锁,它是ReentrantReadWriteLock的优化版本。StampedLock通过乐观读的方式提高读操作的性能,允许读操作在写操作进行时继续进行,只要写操作还没有修改被读的数据。
1.4 LockSupport:
这是一个用于线程阻塞和唤醒的低级工具类。它提供了两个核心方法:park()和unpark(),用于阻塞当前线程和唤醒指定线程。
2 线程池(ThreadPools):
2.1 ThreadPoolExecutor:
这是一个可扩展的线程池实现,它允许你配置各种参数(如核心线程数、最大线程数、线程空闲时间等)来控制线程池的行为。ThreadPoolExecutor是Java线程池的核心类,提供了丰富的功能和灵活性。
线程池参数介绍:
https://blog.csdn.net/qq_31129841/article/details/108217194
3 原子类(Atomics):
- Java原子类(如AtomicInteger、AtomicLong等)提供了线程安全的操作,可以避免在多线程环境下出现竞态条件和其他线程安全问题。原子类中的操作都是原子的,不会被其他线程中断,保证了操作的完整性。这些类通常使用CAS(Compare-and-Swap)算法来实现原子操作,提供了高性能的并发控制。
4 同步器(Synchronizers):
- CountDownLatch:这是一个同步工具类,它允许一个或多个线程等待其他线程完成一组操作。当所有线程都完成了自己的任务时,CountDownLatch会通知等待的线程继续执行。
- CyclicBarrier:这也是一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个公共屏障点。CyclicBarrier可以重复使用,因此被称为“循环”屏障。
- Semaphore:这是一个基于计数的信号量,用于控制对多个共享资源的访问。Semaphore可以用于实现各种复杂的同步策略,如限制并发访问的线程数、实现公平访问等。
5 并发容器(Concurrent Collections):
- ConcurrentHashMap:这是一个线程安全的哈希表实现,它提供了与Hashtable和synchronizedMap类似的语义,但性能更高。ConcurrentHashMap使用分段锁(Segmentation)的策略来提高并发性能。
- BlockingQueue:这是一个用于线程间通信的阻塞队列接口。BlockingQueue的实现类(如ArrayBlockingQueue、LinkedBlockingQueue等)提供了线程安全的队列操作,并允许线程在队列为空时等待元素,或者在队列满时等待空间。
6 其他工具类:
- Future和FutureTask:这些类表示异步计算的结果。Future用于检查计算是否完成、等待其完成以及获取结果。FutureTask是Future接口的一个实现类,它实现了Runnable接口,因此可以作为任务提交给Executor执行。
- ExecutorCompletionService:这是一个服务类,它包装了一个Executor并使其易于编写需要处理Future的程序。ExecutorCompletionService可以方便地处理一组异步任务的结果。