java并发实战编程pdf_「原创」Java并发编程系列25 | 交换器Exchanger

09cffa63e50bd7b9424643b3093471d3.png 2ec5e29a4447743ebe0cd960249c99ae.png

2020年Java面试题库连载中

【000期】Java最全面试题库思维导图

【001期】JavaSE面试题(一):面向对象

【002期】JavaSE面试题(二):基本数据类型与访问修饰符

【003期】JavaSE面试题(三):JavaSE语法(1)

【004期】JavaSE面试题(四):JavaSE语法(3)

【005期】JavaSE面试题(五):String类

【006期】JavaSE面试题(六):泛型

【007期】JavaSE面试题(七):异常

最新连载到第10篇,更多面试题,点击上面蓝字查看

2ec5e29a4447743ebe0cd960249c99ae.png

正文

bfc0eb08c25ed3fa5003fc4cc5ff3a95.png

很尴尬,发了并发编程的26和27,漏了本篇25。这下子我是真的没存货了哈哈。那下面我们来补上25先,25比较短小...勿喷。

Exchanger是一个用于线程间协作的工具类,用于两个线程间交换。本篇只介绍Exchanger的使用,不讲解源码。(因Exchanger类的源码很是复杂,而且对平时开发设计借鉴意义也不是很大,所以本人至今没有彻底研究明白,也就不在这里误导大家了。)

Exchanger提供了一个交换的同步点,在这个同步点两个线程能够交换数据。

具体交换数据是通过exchange方法来实现的,如果一个线程先执行exchange方法,那么它会同步等待另一个线程也执行exchange方法,这个时候两个线程就都达到了同步点,两个线程就可以交换数据。

13ce29e74b17688132597d63c2844446.png

用一个简单的例子来看下Exchanger的具体使用。两方做交易,如果一方先到要等另一方也到了才能交易,交易就是执行exchange方法交换数据。

public class ExchangerTest {
private static Exchanger exchanger = new Exchanger;
static String goods = "电脑";
static String money = "$1000";
public static void main(String[] args) throws InterruptedException {
System.out.println("准备交易,一手交钱一手交货...");
// 卖家
new Thread {
public void run {
System.out.println(getName + " 卖家到了,已经准备好货:" + goods);
try {
String money = exchanger.exchange(goods);
System.out.println(getName + " 卖家收到钱:" + money);
} catch (Exception e) {
e.printStackTrace;
}
};
}.start;
Thread.sleep(3000);
// 买家
new Thread {
public void run {
try {
System.out.println(getName + " 买家到了,已经准备好钱:" + money);
String goods = exchanger.exchange(money);
System.out.println(getName + " 买家收到货:" + goods);
} catch (Exception e) {
e.printStackTrace;
}
};
}.start;
}
}

输出结果:

准备交易,一手交钱一手交货...
Thread-0 卖家到了,已经准备好货:电脑
Thread-1 买家到了,已经准备好钱:$1000
Thread-1 买家收到货:电脑
Thread-0 卖家收到钱:$1000

参考资料

  1. 《Java并发编程之美》

  2. 《Java并发编程实战》

  3. 《Java并发编程的艺术》

并发系列文章汇总

【原创】01|开篇获奖感言

【原创】02|并发编程三大核心问题

【原创】03|重排序-可见性和有序性问题根源

【原创】04|Java 内存模型详解

【原创】05|深入理解 volatile

【原创】06|你不知道的 final

【原创】07|synchronized 原理

【原创】08|synchronized 锁优化

【原创】09|基础干货

【原创】10|线程状态

【原创】11|线程调度

【原创】12|揭秘 CAS

【原创】13|LockSupport

【原创】14|AQS 源码分析

【原创】15|重入锁 ReentrantLock

【原创】16|公平锁与非公平锁

【原创】17|读写锁八讲(上)

【原创】18|读写锁八讲(下)

【原创】19|JDK8新增锁StampedLock

【原创】20|StampedLock源码解析

【原创】21|Condition-Lock的等待通知

【原创】22|倒计时器CountDownLatch

【原创】23|循环屏障CyclicBarrier【原创】24|信号量Semaphore

e4432407c9883a2b317b869540bc0c05.png

之前,给大家发过四份Java面试宝典,这次新增了更全面的资料,相信在跳槽前准备准备,基本没大问题。

java基础:设计模式等》(初中级)

JVM:整理BAT最新题库》《并发编程》(中高级)

《分布式微服务架构》《架构|软技能》(资深)

《一线互联网公司面试指南》(资深)

学习视频包含深入运行时数据区、垃圾回收、详解类装载过程及类加载机制、手写Spring-IOC容器、redis入门到高性能缓存组件等等

获取方式:点“”,在公众号后台打开,回复 666】即可领取,资料持续更新。

888597fc14c108f1fd69828a2b514c96.gif

看到这里,证明有所收获

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值