JUC——包下每个类的作用

目录

1 锁(Locks):

1.1 ReentrantLock:

AQS的核心组成:

1.2 ReentrantReadWriteLock:

1.3 StampedLock:

1.4 LockSupport:

2 线程池(ThreadPools):

线程池参数介绍:

3 原子类(Atomics):

4 同步器(Synchronizers):

5 并发容器(Concurrent Collections):

6 其他工具类:


在Java的juc(即java.util.concurrent)包中,包含了许多用于并发编程的类和接口。这些类和接口提供了各种并发控制和线程管理的功能。以下是一些主要类及其作用:

1 锁(Locks)

1.1 ReentrantLock

这是一个可重入的互斥锁,它提供了与内置同步锁(synchronized)相同的基本行为和语义,但功能更强大。与synchronized相比,ReentrantLock提供了更灵活的锁定策略,如公平锁、非公平锁、可中断的获取锁以及尝试获取锁等。

问题一:跟 Synchronized 相比,可重入锁 ReentrantLock 其实现 原理有什么不同?

其实,锁的实现原理基本是为了达到一个目的: 让所有的线程都能看到某种标记。

Synchronized 通过在对象头中设置标记实现了这一目的,是一种 JVM 原生的锁实现方式,

而 ReentrantLock 以及所有的基于 Lock 接口的 实现类,都是通过用一个 volitile 修饰的 int 型变量,并保证每个线 程都能拥有对该 int 的可见性和原子修改,其本质是基于所谓的 AQS 框架。

AQS的核心组成:

  1. 状态(State):一个volatile修饰的int类型的变量,表示同步状态。
  2. FIFO队列:一个双向链表,用于保存等待获取资源的线程。
  3. 独占模式(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 其他工具类

  • FutureFutureTask:这些类表示异步计算的结果。Future用于检查计算是否完成、等待其完成以及获取结果。FutureTask是Future接口的一个实现类,它实现了Runnable接口,因此可以作为任务提交给Executor执行。
  • ExecutorCompletionService:这是一个服务类,它包装了一个Executor并使其易于编写需要处理Future的程序。ExecutorCompletionService可以方便地处理一组异步任务的结果。
  • 10
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的JUCjava.util.concurrent)提供了一些并发编程中常用的,这些可以帮助我们更方便地实现多线程编程。以下是一些常用的JUC及其解析: 1. CountDownLatch(倒计时器) CountDownLatch是一个计数器,它允许一个或多个线程等待一组事件发生后再继续执行。它最基本的方法是await()和countDown()。await()方法会阻塞当前线程,直到计数器的值为0;countDown()方法会将计数器的值减1。 2. CyclicBarrier(循环屏障) CyclicBarrier是一个同步工具,它允许一组线程等待彼此达到一个公共屏障点。当所有线程都到达这个屏障点时,它们才能继续执行。CyclicBarrier可以被重复使用,当所有线程都执行完后,它会自动重置。 3. Semaphore(信号量) Semaphore是一种计数器,它维护了一组许可证。当调用acquire()方法时,线程会阻塞,直到许可证可用;而当调用release()方法时,许可证的数量会增加。Semaphore可以用于限制同时访问某些资源的线程数量。 4. ReentrantLock(重入锁) ReentrantLock是一个可重入的互斥锁。它和synchronized关键字似,但是提供了更多的灵活性和功能。ReentrantLock中最常用的方法是lock()和unlock(),它们分别用于获取锁和释放锁。 5. ConcurrentHashMap(并发哈希表) ConcurrentHashMap是一个线程安全的哈希表实现。它和HashMap似,但是支持并发访问。ConcurrentHashMap中的所有方法都是线程安全的,而且它的性能比Hashtable和同步的HashMap要好。 6. Executors(线程池) Executors是一个工厂,用于创建各种型的线程池。它提供了一些静态方法,例如newFixedThreadPool()、newCachedThreadPool()、newSingleThreadExecutor()等,可以方便地创建各种型的线程池。 7. Future(异步计算) Future是一个接口,它表示一个异步计算的结果。Future可以通过get()方法获取计算结果,或者通过cancel()方法取消计算。Future还可以用于实现一些高级的并发操作,例如等待一组异步计算全部完成后再继续执行。 总的来说,JUC提供了很多有用的工具,可以帮助我们更方便地实现多线程编程,提高程序的并发性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值