JUC学习系列九(同步点 Exchanger)

2023-10-27

可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法管道设计)中很有用。

内存一致性效果:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。

public class ExchangerTest {
    private static  String steve=null;
    private static String tao=null;

    public void  a(Exchanger<String> exchanger){
        steve="steve";
        try {
            //把交换来的数据替换本身的数据
            System.out.println("steve ="+steve);
           steve= exchanger.exchange(steve);
            System.out.println("a 交换数据完成!时间:"+System.currentTimeMillis());
            //等待模拟延迟和处理耗费的时间
            TimeUnit.SECONDS.sleep(1);
        } catch ( Exception e) {
            e.printStackTrace();
        }
    }
    public void  b(Exchanger<String> exchanger){
        tao="tao";
        try {
            //把交换来的数据替换本身的数据
            System.out.println("tao ="+tao);
           tao=exchanger.exchange(tao);
            System.out.println("b 交换数据完成!时间:"+System.currentTimeMillis());
            TimeUnit.SECONDS.sleep(4);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        final Exchanger<String> exchanger=new Exchanger<>();
        final ExchangerTest test=new ExchangerTest();
       Thread t1= new Thread(new Runnable() {
            @Override
            public void run() {
                test.a(exchanger);
            }
        });
       Thread t2= new Thread(new Runnable() {
            @Override
            public void run() {
                test.b(exchanger);
            }
        });
       t1.start();
       t2.start();
       //等t1 t2线程执行结束,不然数据没有交换完毕
       while (t1.isAlive() || t2.isAlive() ){}

        System.out.println("steve :"+steve);
        System.out.println("tao :"+tao);
    }

}

 

这个工具类使用起来很简单,理解也不难。可以理解为两个人要进行交易,只能等大家都到了交易点,才能发生交易。所以上面的输出时间一定是一致的。下面是其API的方法,只有一个构造和两个方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JUC学习系列九(同步点 Exchanger) 的相关文章

  • 【Java并发编程的艺术】Java并发容器和框架:Java中的阻塞队列

    1 什么是阻塞队列 阻塞队列常用于生产者和消费者的场景 生产者是向队列里添加元素的线程 消费者是 从队列里取元素的线程 阻塞队列就是生产者用来存放元素 消费者用来获取元素的容器 阻塞队列 BlockingQueue 是一个支持两个附加操作的
  • java并发总结

    一 并发基础 1 进程与线程 进程 程序由指令和数据组成 但这些指令要运行 数据要读写 就必须将指令加载至 CPU 数据加载至内存 在指令运行过程中还需要用到磁盘 网络等设备 进程就是用来加载指令 管理内存 管理 IO 的 当一个程序被运行
  • 并发编程系列之Exchanger

    前言 上面我们介绍了信号量 再来说说交换者 这个东西用的不是很多 所以一般也不被经常关注 但是我们还是最好了解下 下面我将从什么是Exchanger以及如何使用Exchanger两个方面谈谈这个用于线程间协调的工具类 什么是Exchange
  • 浅析多线程中的各种锁

    高并发的场景下 如果选对了合适的锁 则会大大提高系统的性能 否则性能会降低 所以 知道各种锁的开销 以及应用场景是很有必要的 文章目录 常用的各种锁 互斥锁与自旋锁 互斥锁 自旋锁 读写锁 乐观锁与悲观锁 本文小结 常用的各种锁 多线程访问
  • Java多线程中常见错误梳理,新手程序员必看

    很多Java新手在刚接触线程时都会被其复杂的知识点搞晕 在实际应用中同样错误不断 如何才能快速掌握多线程呢 常见的Java多线程错误有哪些 接下来就给大家分享Java新手学习入门中多线程失误梳理 无论是客户端还是服务器端多线程Java程序
  • Java中的Semaphore信号量机制

    目录 什么是信号量机制 Semaphore工作流程 Semaphore使用方式 什么是信号量机制 信号量机制是一种通过使用计数器来控制共享资源访问的机制 计数器计数的是共享资源的访问许可 如果计数器大于0则允许访问 如果为0 则拒绝访问 J
  • Java并发编程系列 - Java内存模型

    Java并发编程 可见性 原子性 有序性 Java内存模型如何解决可见性 有序性 并发问题产生的根源 可见性 原子性 有序性 可见性 Java内存模型的主要目标是定义程序中变量的访问规则 即在虚拟机中将变量存储到主内存或者将变量从主内存取出
  • java晋级赛 深入并发编程

    根据黑马java并发编程学习做的笔记 传送门 https www bilibili com video BV16J411h7Rd p 15 java晋级赛 深入并发编程 一 多线程基础 进程与线程 创建线程的方式及运行原理 创建线程的方式
  • 并发编程系列之volatile内存语义

    前言 前面介绍顺序一致性模型时 我们提到了程序如果正确的同步就会具备顺序一致性 这里所说的同步泛指广义上的同步 其中包括就包括同步原语volatile 那么volatile声明的变量为什么就能保证同步呢 这又是如何实现的呢 今天就让我们一起
  • C++ std::thread多线程详解

    c 多线程详解 一 std thread线程创建 1 函数指针 2 Lambda函数 3 functor Funciton Object 4 非静态成员函数 5 静态成员函数 二 std thread线程停止 1 join函数 2 deta
  • 上下文切换理解以及减少方法

    并发编程面临着上下文切换 死锁等问题 尤其在少量数据的情况下 并发可能因为线程的创建和上下文切换的开销等问题 甚至比串行执行的速度更慢 文章目录 上下文切换定义 例子理解 减少上下文切换的方法 无锁并发编程 CAS算法 使用最少线程 协程
  • Callable接口详解

    Callable接口详解 Callable 返回结果并且可能抛出异常的任务 优点 可以获得任务执行返回值 通过与Future的结合 可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别 1 Callable
  • ReentrantLock实现PV操作-模拟多线程竞争数据库连接池资源场景

    使用ReentrantLock Condition模拟PV操作 实现多线程竞争数据库连接池资源 资源耗尽后阻塞等待 归还资源后唤醒阻塞线程的场景 代码中为10个线程竞争5个数据库连接资源 ConnectionPool class 连接池 C
  • 高并发,你真的理解透彻了吗?

    高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 在过往的面试中 如果候选人做过高并
  • Sentinel客户端调用并发控制

    前言 当链路中某个应用出现不稳定 导致整个链路调用变慢 如果不加控制可能导致雪崩 这种情况如何处理呢 一 慢调用现象分析 在分布式链路中调用中 调用关系如下 methodA1与methodA2在同一个应用中 链路标号 调用链 链路1 met
  • CUDA编程问题记录:能否用CPU多线程调用CUDA核函数

    问题 能否在主机端创建CPU多线程 在每个线程里调用设备端核函数的caller函数 进而实现进一步的并行运行 例如有5张图片 对于每张图片都有N个GPU线程对其进行像素操作 但是此时是逐一对这5张图片处理的 想在主机端创建5个CPU线程 每
  • 13张图,带大家深入理解Synchronized

    目录 前言 内容大纲 Synchronized使用方式 普通函数 静态函数 代码块 Synchronized原理 Synchronized优化 锁粗化 锁消除 锁升级 偏向锁 轻量级锁 重量级锁 前言 Java并发编程系列第二篇Synchr
  • Lock锁

    Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作 它们允许更灵活的结构化 可能具有完全不同的属性 并且可以支持多个相关联的对象Condition 1 传统的synchronized package cn d
  • ThreadPoolExecutor源码解析

    ThreadPoolExecutor源码解析 一 新建线程池的是构造方法 public ThreadPoolExecutor int corePoolSize int maximumPoolSize long keepAliveTime T
  • 进程、线程、管程、纤程、协程概念以及区别

    进程 进程是指在操作系统中能独立运行并作为资源分配的基本单位 由一组机器指令 数据和堆栈等组成的能独立运行的活动实体 进程在运行是需要一定的资源 如CPU 存储空间和I O设备等 进程是资源分配的基本单位 进程的调度涉及到的内容比较多 存储

随机推荐

  • IE8兼容

    X UA Compatible是针对ie8新加的一个设置 对于ie8之外的浏览器是不识别的 这个区别与 content IE 7 在无论页面是否包含指令 都像是使用了 Windows Internet Explorer 7的标准模式 而co
  • 大话赛宁云

    如今 随着数字时代的飞速发展 安全漏洞存在于网络空间中 对系统造成极大的安全隐患 为网络攻击者的恶意入侵提供了捷径 对此 解决这一困境 要秉承 快速 自动 安全 的解决标准 首先需要高技术手段的支持 实施常态化演练 及时发现安全漏洞 测评危
  • 【计算机视觉

    文章目录 一 检测相关 8篇 1 1 Attending Generalizability in Course of Deep Fake Detection by Exploring Multi task Learning 1 2 Harv
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • MVC控制器(Controller)与策略模式(Strategy)

    MVC控制器 Controller 与策略模式 Strategy 转载时请注明出处和作者联系方式 http blog csdn net absurd 作者联系方式 Li XianJing
  • Hashpump实现哈希长度扩展攻击

    Hashpump实现哈希长度扩展攻击 RCEME 0x01 HASH长度拓展攻击 哈希长度拓展攻击的原理有点过于复杂了 这里直接copy其他大佬的描述了 长度扩展攻击 length extension attack 是指针对某些允许包含额外
  • C#

    System IO Pipelines 很酷的读写数据流方式 文章目录 System IO Pipelines 很酷的读写数据流方式 前言 System IO Pipelines 是啥 有什么优点 有哪些应用场景 网络编程 文件处理 怎么使
  • "防止同时出现多个应用程序实例"之改进

    防止同时出现多个应用程序实例 之改进字号 大 中 小 在 Delphi 5 开发人员指南 中第13章中有一篇 防止同时出现多个应用程序实例 代码中给出了一个MultInst pas单元 工程引用此单元就能防止同时出现多个实例 但实际应用中发
  • Linux中find命令-path -prune用法详解(find命令如何只查找当前目录,而不查找当前目录下的子目录find . ! -name "." -type d -prune -o -type f -name "*.txt" -print)

    在Windows中可以在某些路径中查找文件 也可以设定不在某些路径中查找文件 下面用Linux中的find的命令结合其 path prune参数来看看在Linux中怎么实现此功能 假如在当前目录下查找文件 且当前目录下有很多文件及目录 多层
  • python自动化赚钱-薅羊毛

    1 目 标 场 景 最近 有一个朋友告诉我 她在某平台上购买了一部手机 收到货之后发现商品质量挺好的 价格也不贵 临了随手给了个好评 商家最后还给她发一个 小红包 她把这个商品分享给了我 本篇文章的目的是利用Python 自动化完成商品购买
  • iOS16新特性:实时活动-在锁屏界面实时更新APP消息

    简介 之前在 iOS16新特性 灵动岛适配开发与到家业务场景结合的探索实践 里介绍了iOS16新的特性 实时更新 Live Activity 中灵动岛的适配流程 但其实除了灵动岛的展示样式 Live Activity还有一种非常实用的应用场
  • 王者荣耀助手动态服务器维护中,王者荣耀助手动态怎么发不了

    发布时间 2015 11 20 王者荣耀助手礼包怎么领取 助手礼包领取地址是什么 下面来看看王者荣耀助手礼包怎么领取 助手礼包领取地址一览吧 希望能对大家有所帮助 蚕豆网王者荣耀开黑群 439442380 点击加入 亲爱的召唤师 安卓版 l
  • MySQL之InnoDB存储结构

    1 InnoDB存储引擎 InnoDB存储引擎最早由Innobase Oy公司开发 属第三方存储引擎 从MySQL 5 5版本开始作为表的默认存储引擎 该存储引擎是第一个完整支持ACID事务的MySQL存储引擎 特点是行锁设计 支持MVCC
  • 并发编程-CompletableFuture解析

    1 CompletableFuture介绍 CompletableFuture对象是JDK1 8版本新引入的类 这个类实现了两个接口 一个是Future接口 一个是CompletionStage接口 CompletionStage接口是JD
  • 单片机怎么跳出循环_如何用单片机产生一个三角波?

    今天要学习的这个芯片叫做DAC0832技术流程我们不讲 就讲怎么用 学习单片机技术 我提倡如果看不懂 就先拿着用 看一下如何接线 wr低电平有效 输入寄存器写选通信号 cs低电平有效 输入寄存器选择信号 ILE 允许锁存信号 高电平有效 D
  • got-10k数据预处理

    got数据文件夹格式 GOT 10k train GOT 10k Train 000001 GOT 10k Train 009335 list txt val GOT 10k Val 000001 GOT 10k Val 000180 li
  • ogre每帧渲染在SceneManager::_renderScene()

    今天抄0 12版本ogre 在这里是每帧渲染的内容 以后可以再调试下高版本的 在这里设置个断点 void SceneManager renderScene Camera camera Viewport vp bool includeOver
  • Python报错:Low Memory,The IDE is running low on memory and this might affect performance.

    报错信息 使用pycharm过程中报如下错误 Low Memory The IDE is running low on memory and this might affect performance Please consider inc
  • DATAX 使用记录

    DATAX 使用记录 批量表迁移 准备表 准备datax json文件 准备执行脚本 sh 批量表迁移 准备表 vim mysqltables txt tb consultation type tb conversation record
  • JUC学习系列九(同步点 Exchanger)

    可以在对中对元素进行配对和交换的线程的同步点 每个线程将条目上的某个方法呈现给 exchange 方法 与伙伴线程进行匹配 并且在返回时接收其伙伴的对象 Exchanger 可能被视为 SynchronousQueue 的双向形式 Exch