【多线程】-- JUC的常见类

JUC的常见类

1. Callable接口

Callable接口是JUC包(java.util.concurrent)下的一个接口。

@FunctionalInterface:表示这是一个函数式接口,接口中有且只有一个未实现的方法,也就意味着可以使用lambda表达式简化创建写法。

V call() throws Exception;:该方法有返回值 ;并且可以向外抛出业务异常

Callable接口如何与Thread相联

Runnable可以与Thread相联。

对比Runnable接口

Runnable接口也是一个函数式接口;但是方法没有返回值;也不可以抛出异常,业务异常只能在run()方法的内部进行处理。

Runnable与Callable的区别?

  1. Callable要实现call()方法,且有返回值;Runnable实现的run()方法,但没有返回值。
  2. Callable的call()可以抛出异常;Runnable的run()不能抛出异常。
  3. Callable配合FutrueTask一起使用,通过futureTask.get()方法获取call()的结果。
  4. 两者都是描述线程任务的接口。

2. ReentrantLock

ReentrantLock 是一个Java类。是JUC下提供的加锁方式,ReentrantLock 是一个可重入互斥锁。

2.1 ReentrantLock常用方法

  1. lock():加锁,如果获取不到锁就一直死等。
  2. tryLock()/tryLock(long timeout, TimeUnit unit):加锁,如果获取不到锁,等待一定的时间之后就放弃加锁。
  3. unLock():释放锁。

2.2 ReentrantLock创建公平锁

在创建ReentrantLock类时设置该锁是否是一个公平锁,默认是非公平锁,传入true为公平锁。

实现公平锁时,会有一个队列来组织排队的进程,获取锁的顺序就按照线程先来后到的顺序。

2.3 ReentrantLock获取读/写锁

java 复制代码
//创建一个读写锁
ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

//获取读锁
ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();

//获取写锁
ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

ReentrantLock与 synchronized的区别?

  1. synchronized 是一个关键字,最终调用的是系统APl;ReentrantLock 纯Java实现的
  2. synchronized 使用时不需要手动释放锁.进入代码块即加锁,退出代码块即释放锁;
    ReentrantLock使用时需要手动加锁和释放锁.使用起来更灵活,但是也容易遗漏unlock.
  3. synchronized 在申请锁失败时,会死等.ReentrantLock 可以通过 trylock的方式等待一段时间就放弃获取不到锁还可以执行其他的代码逻辑。
  4. synchronized是非公平锁,ReentrantLock默认是非公平锁.可以通过构造方法传入一个 true开启公平锁模式。
  5. synchronized 是通过 Object 的 wait / notify/notifyAll 实现等待-唤醒.
    ReentrantLock搭配Condition类实现等待-唤醒,可以更精确控制唤醒符合某个条件的线程.

JUC中的工具类

信号量Semaphore

信号量是用来表示"可用资源的个数的",本质上是一个计数器。

通过信号量可以限制系统中并发执行的线程个数,对于计算机而言管理的是有效的资源数,如果在资源有限的场景下,都可以使用信号量去处理。

类比:停车场停车。

停车场外面会有一个显示牌显示当前停车场中车位的可用个数。进去一个车计数 + 1,出来一个车计数 - 1;如果停车场满了,就显示车位已满,停车场外面的车就需要阻塞等待。

CountDownLatch

CountDownLatch可以实现在某个事件结束之后,再去执行其他任务。

相关推荐
嘻哈∠※6 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
WWJA王文举7 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha13147 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2588 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅8 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
AI服务老曹9 小时前
边云协同视频分析性能优化指南:多站点部署下的资源瓶颈突破与调优实战
性能优化·音视频
汉字萌萌哒9 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter9 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具