多线程面试必备知识点(三)

  1. 线程通讯
    1.1. 为什么要线程通信
    多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信。

1.2. 线程通讯方式
线程间通信常用方式如下:

休眠唤醒方式:
Object的wait、notify、notifyAll
Condition的await、signal、signalAll
CountDownLatch:用于某个线程A等待若干个其他线程执行完之后,它才执行
CyclicBarrier:一组线程等待至某个状态之后再全部同时执行
Semaphore:用于控制对某组资源的访问权限

1.2.1. 休眠唤醒方式
Object的wait、notify、notifyAll

Condition的await、signal、signalAll

Object和Condition休眠唤醒区别

object wait()必须在synchronized(同步锁)下使用,
object wait()必须要通过Nodify()方法进行唤醒
condition await() 必须和Lock(互斥锁/共享锁)配合使用
condition await() 必须通过 signal() 方法进行唤醒

1.2.2. CountDownLatch方式
CountDownLatch是在java1.5被引入的,存在于java.util.concurrent包下。

CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。

每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

示例代码:

1.2.3. CyclicBarrier方式
CyclicBarrier是在java1.5被引入的,存在于java.util.concurrent包下。

CyclicBarrier实现让一组线程等待至某个状态之后再全部同时执行。

CyclicBarrier底层是三个线程同时启动,示例代码如下:

执行效果如下:三个线程同时启动

1.2.4. Semaphore方式
Semaphore是在java1.5被引入的,存在于java.util.concurrent包下。

Semaphore用于控制对某组资源的访问权限。

工人使用机器工作,示例代码如下:

执行效果如下:

1.3 小结
1.3.1. sleep和wait区别

1.3.2. wait和notify区别
wait和notify都是Object中的方法

wait和notify执行前线程都必须获得对象锁

wait的作用是使当前线程进行等待

notify的作用是通知其他等待当前线程的对象锁的线程

--------------人生充满着期待,梦想连接着未来--------------
订阅【Java直通车】获取免费Java书籍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值