广告
返回顶部
首页 > 资讯 > 精选 >如何深入理解Java多线程与并发框中的并发辅助工具类
  • 324
分享到

如何深入理解Java多线程与并发框中的并发辅助工具类

2023-06-05 03:06:41 324人浏览 八月长安
摘要

如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线

如何深入理解Java多线程并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、Exchanger 交换器(两线程间的通信)

使用场景:用于 有且仅有两个线程 间的 数据传输,就就是线程间的 通信 。它是 生产者/消费者 d的 wait() / notify() 的最佳替代工具。 核心原理:方法 exchange()阻塞特性:此方法被调用后等待其他线程来取数据,如果没有其他线程取得数据,则一直 阻塞。

示例:交替打印奇偶数:

public class Print {    public static void main(String[] args) {    // 交换器    Exchanger<Integer> exchanger = new Exchanger<>();    // 起始打印数值    Integer startNumber = 1;    // 终止的数值    Integer endNumber= 100;    // 线程1    Thread t1 = new Thread(new Thread1(exchanger, startNumber, endNumber));    Thread t2 = new Thread(new Thread2(exchanger, startNumber, endNumber));    // 设置线程名称    t1.setName("thread-no-1");    t2.setName("thread-no-2");    // 启动线程    t1.start();    t2.start();}}class Thread1 implements Runnable {private Exchanger<Integer> exchanger;private Integer number;private final Integer endNumber;public Thread1(Exchanger<Integer> exchanger, Integer startNumber, Integer endNumber) {    this.exchanger = exchanger;    this.number = startNumber;    this.endNumber = endNumber;}@Override    public void run() {    while (number <= endNumber) {        if (number % 2 == 1) {            System.out.println("线程:" + Thread.currentThread().getName() + " : " + number);        }        try {            exchanger.exchange(number++);        }        catch (InterruptedException e) {            e.printStackTrace();        }    }}}class Thread2 implements Runnable {private Exchanger<Integer> exchanger;private Integer number;private final Integer endNumber;public Thread2(Exchanger<Integer> exchanger, Integer startNumber, Integer endNumber) {    this.exchanger = exchanger;    this.number = startNumber;    this.endNumber = endNumber;}@Override    public void run() {    while (number <= endNumber) {        if (number % 2 == 0) {            System.out.println("线程:" + Thread.currentThread().getName() + " : " + number);        }        try {            exchanger.exchange(number++);        }        catch (InterruptedException e) {            e.printStackTrace();        }    }}}

二、Semaphore 信号灯

核心原理: 通过发放设置最大 许可数,来限制线程的并发数。 默认是 非公平,效率高。

public Semaphore(int permits) {    sync = new NonfairSync(permits);}Semaphore semaphore = new Semaphore(5);try {    semaphore.acquire();    // 获取许可    // 逻辑}catch (InterruptedException e) {    e.printStackTrace();}finally {    semaphore.release();    // 释放许可}

三、CountDownLatch 倒计时闩(锁)

核心原理:线程以 组团 的方式进行任务。 count 作为 stat 状态。await() 方式将 阻塞当前线程,直到 count 为 0。

CountDownLatch countDownLatch = new CountDownLatch(5);countDownLatch.countDown();// count - 1// 预处理try {    countDownLatch.await();    // 阻塞当前线程    // 大家一起处理的时候,我才处理}catch (InterruptedException e) {    e.printStackTrace();}

Sync同步器

private static final class Sync extends AbstractQueuedSynchronizer {    private static final long serialVersionUID = 4982264981922014374L;    Sync(int count) {        setState(count);    }    int getCount() {        return getState();    }    protected int tryAcquireShared(int acquires) {        return (getState() == 0) ? 1 : -1;    }    protected Boolean tryReleaseShared(int releases) {        // 递减 count; 转换为零时发出信号        for (;;) {            int c = getState();            if (c == 0)                            return false;            int nextc = c-1;            if (compareAndSetState(c, nextc))                            return nextc == 0;        }    }}

四、CyclicBarrier 循环栅栏(循环锁)

核心原理: 基于 ReentrantLock 和 Condition。 CyclicBarrier 不仅具有 CountDownLatch 的功能,还有实现屏障等待的功能,也就是阶段性同步。

CyclicBarrier与CountDownLatch比较

  • CountDownLatch:一个线程(或者多个),等待另外N个线程完成某个事情之后才能执行;CyclicBarrier:N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。

  • CountDownLatch:一次性的;CyclicBarrier:可以重复使用。

  • CountDownLatch基于AQS;CyclicBarrier基于锁和Condition。本质上都是依赖于volatile和CAS实现的。

看完上述内容,你们掌握如何深入理解Java多线程与并发框中的并发辅助工具类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 如何深入理解Java多线程与并发框中的并发辅助工具类

本文链接: https://www.lsjlt.com/news/241078.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何深入理解Java多线程与并发框中的并发辅助工具类
    如何深入理解Java多线程与并发框中的并发辅助工具类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Exchanger 交换器(两线程间的通信)使用场景:用于 有且仅有两个线...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的CAS
    如何深入理解Java多线程与并发框中的CAS,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。CAS实现原理CAS 是 CompareAndSwap 的缩写,意思是...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的volatile关键字
    本篇文章为大家展示了如何深入理解Java多线程与并发框中的volatile关键字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。概念把对 volatile变量的单个读/写,看成是使用 同一个监视器锁 ...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中线程和进程的区别
    如何深入理解Java多线程与并发框中线程和进程的区别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程和进程的区别1. 资源调度单位在计算机中,进程是程序运行所...
    99+
    2023-06-05
  • 深入理解Java多线程与并发框(第⑪篇)——线程池参数
    ThreadPoolExecutor线程池线程的创建和销毁都会消耗大量资源,就好像公司每天上午9点工作时就招进一批员工,晚上6点干完活就辞退一批员工,这都会销毁公司大量资源。所以合理利用 “池” 中固定、稳定的线程是非常有必要的。扩展关系T...
    99+
    2023-06-05
  • 怎样深入理解Java多线程与并发框中的synchronized 关键字
    怎样深入理解Java多线程与并发框中的synchronized 关键字,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、Class文件与对象对象头 32位JVM的对象头二、sy...
    99+
    2023-06-05
  • 如何深入理解Java多线程与并发框中的队列同步器AQS
    如何深入理解Java多线程与并发框中的队列同步器AQS,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、 AbstractOwnableSynchronizer 抽象的、可...
    99+
    2023-06-05
  • Java线程的并发工具类实现原理解析
    目录一、fork/join1.Fork-Join原理2.工作窃取3.代码实现二、CountDownLatch三、CyclicBarrier四、Semaphore五、Exchange六...
    99+
    2022-11-12
  • 怎么深入理解Java多线程与并发框中的顺序一致性模型
    怎么深入理解Java多线程与并发框中的顺序一致性模型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、竞态条件(Race Condition)计算的正确性取决于 多个线程 执行...
    99+
    2023-06-05
  • java多线程中的并发工具类CountDownLatch,CyclicBarrier和Semaphore该怎么理解
    本篇文章给大家分享的是有关java多线程中的并发工具类CountDownLatch,CyclicBarrier和Semaphore该怎么理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起...
    99+
    2023-06-22
  • 如何深入理解Java多线程与并发框中重排序、屏障指令、as-if-serial规则
    这篇文章将为大家详细讲解有关如何深入理解Java多线程与并发框中重排序、屏障指令、as-if-serial规则,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、重排序前篇文章已经讲了Java...
    99+
    2023-06-05
  • 深入理解Java多线程与并发框(第③篇)——Java内存模型与原子性、可见性、有序性
    一、Java内存模型Java Memory Modle,简称 JMM,中文名称 Java内存模型,它是一个抽象的概念,用来描述或者规范访问内存变量的方式。因为各中计算机的操作系统和硬件不同,方式机制也可能不同,Java内存模型用于屏蔽(适配...
    99+
    2023-06-05
  • 如何理解Java 并发编程中的ForkJoin框架
    如何理解Java 并发编程中的ForkJoin框架,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、什么是ForkJoin框架ForkJoin框架是java的JU...
    99+
    2023-06-25
  • 如何解读Java多线程与并发模型中的共享对象
    本篇文章为大家展示了如何解读Java多线程与并发模型中的共享对象,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以下内容如无特殊说明均指代Java环境。共享对象使用Java编写线程安全的程序关键在于正...
    99+
    2023-06-02
  • Java多线程高并发中如何解决ArrayList与HashSet和HashMap不安全的问题
    这篇文章主要为大家展示了“Java多线程高并发中如何解决ArrayList与HashSet和HashMap不安全的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程高并发中如何解决...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作