CountDownLatch 、ReentryLock、CyclicBarrier 、ReadWriteLock 、Semaphore、Exchanger、LockSupport

2023-05-16

CountDownLatch

又叫门栓,初始化设置一个值,当这个值等于0时,是否锁

 private void countDownLatch(){
        CountDownLatch countDownLatch = new CountDownLatch(1);
       try {
           countDownLatch.await();//加锁
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       countDownLatch.countDown();//数量减一,数据为0时,释放锁
   }

ReentryLock/Condition

condition本质就是等待队列
这个条件可以帮忙调用await和signal方法

public class MyContainer2<T> {
    private LinkedList<T> lists = new LinkedList<>();
    private Integer MAX = 10;
    private Integer count = 0;

    private Lock lock = new ReentrantLock();
    private Condition producer = lock.newCondition();
    private Condition consumer = lock.newCondition();


    private  void put(T t){
        try{
            lock.lock();
            while (lists.size()== MAX){
                try {
                    producer.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            lists.add(t);
            System.out.println("put:" +t);
            count++;
            consumer.signalAll();
        }finally {
            lock.unlock();
        }

    }

    private  T get(){
        T t = null;
        try{
            lock.lock();
            while (lists.size()==0) {
                try {
                    consumer.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            t = lists.removeFirst();
            System.out.println("get: "+ t);
            count --;
            producer.signalAll();
        }finally {
            lock.unlock();
        }
        return t;
    }

    private Integer getCount(){
        return count;
    }

    public static void main(String[] args) {
        MyContainer2 container1 = new MyContainer2();
        for(int j =0 ; j <2;j ++){
            Thread thread = new Thread(()->{
                for(int i =0; i< 25; i ++){
                    container1.put(Thread.currentThread().getName() + i);
                }
            });
            thread.start();
        }

        for(int j =0 ; j <10;j ++){
            Thread thread = new Thread(()->{
                for(int i =0; i< 5; i ++){
                    container1.get();
                }
            });
            thread.start();
        }
    }
}

CyclicBarrier

栅栏,满员发车,超过多少线程,才会释放锁

private void cyclicBarrier(){
        CyclicBarrier cyclicBarrier = new CyclicBarrier(20, new Runnable() {
            @Override
            public void run() {
                System.out.println("满人发车");
            }
        });

        for(int i = 0; i< 21; i++){
            Thread thread = new Thread(()->{
                try {
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });
            thread.start();
        }
    }

CyclicBarrier场景一:
复杂操作
1.数据库
2.网络
3.文件

Phaser:分阶段锁定

ReadWriteLock

共享锁: readLock
排他锁:writeLock

private void readWriteLock(){
        ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        Lock readLock = readWriteLock.readLock();
        Lock writeLock = readWriteLock.writeLock();
    }
    private void read(Lock lock){
        try {
            lock.wait();
            System.out.println("read ...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
    private void write(Lock lock){
        try {
            lock.wait();
            System.out.println("write ...");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

Semaphore

作用:限流
实例: 车道、收费站、买票
信号量,允许多少个线程同时执行;有公平和非公平锁

  private void semaphore(){
        Semaphore semaphore = new Semaphore(1);//同时允许1个线程
        try {
            semaphore.acquire();// 获取一个许可,减1
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            semaphore.release(); //释放,加1
        }
        
    }

Exchanger

用于两个线程间交互数据
场景:以物易物;交换装备

    private void exchanger(){
        Exchanger exchanger = new Exchanger();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                String str = "s1";
                try {
                    str = (String) exchanger.exchange(str);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " str="+ str);
            }
        },"t1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                String str = "s2";
                try {
                    str=(String)exchanger.exchange(str);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " str="+ str);
            }
        },"t2");

        thread1.start();
        thread2.start();
    }

LockSupport

暂停一个线程,不用锁

LockSupport.park();//暂停线程
LockSupport.unpark();//取消暂停

   private void lockSupport(){
       Thread thread = new Thread(()->{
          for(int i=0; i< 10; i++){
              if(i == 5){
                  LockSupport.park();
              }
              System.out.println(i);
          }
       });
       thread.start();

        try {
            TimeUnit.SECONDS.sleep(8);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockSupport.unpark(thread);
        System.out.println("unpark the thread");
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CountDownLatch 、ReentryLock、CyclicBarrier 、ReadWriteLock 、Semaphore、Exchanger、LockSupport 的相关文章

  • MATLAB 中的信号量和锁

    我正在开发一个 MATLAB 项目 希望有两个 MATLAB 实例并行运行并共享数据 我将调用这些实例MAT 1 and MAT 2 更具体地说 该系统的架构是 MAT 1按顺序处理图像 使用以下命令一一读取它们imread 并使用输出每个
  • 如何在 Delphi 中实现线程安全列表包装器?

    我有一个列表包装器 它维护两个 Tstringlists 和一个 TClassList 我需要它是线程安全的 这样 不允许并发写入 应进入某种等待状态 不允许边写边读 反之亦然 应该进入某种等待状态 并发读取are allowed 关于我如
  • MPI 创建的进程的共享内存访问控制机制

    我有一个由多个进程使用的共享内存 这些进程是使用创建的MPI 现在我需要一种机制来控制这个共享内存的访问 我知道named semaphore and flock可以使用机制来做到这一点 但只是想知道 MPI 是否为共享内存使用提供任何特殊
  • 该解决方案中信号量的使用是否正确?

    Problem 我必须增加 x1 和 x2 变量 这应该由单独的线程完成 并且在两个变量的上一个增量未完成之前不应调用两个变量的下一个增量 建议的解决方案 初始化 4 个信号量并调用单独的线程来单独递增变量 2 个信号量用于将消息传递到线程
  • 跨进程(和机器)同步(信号量)

    背景 我的 WCF 应用程序必须调用一个没有任何并发 检查的服务 它是由第三方创建的服务 让他们添加并发检查可能是不可能的 我可以确保调用第三方服务的唯一方法是通过我的 WCF 应用程序 所以我正在考虑在我的代码中添加并发检查 为此 我将使
  • 红宝石信号量?

    我正在研究用 Ruby 实现 Fair Barbershop 问题 这是课堂作业 但我不是在寻找任何讲义 我一直在疯狂地搜索 但我似乎无法找到反映 C 中信号量的 Ruby 实现 我知道有 Mutex 这很棒 单一实现 完全完成了那种信号量
  • 信号量如何以及为什么可以发出比初始化时更多的许可?

    我正在阅读 Java 并发实践 一书 在一个关于java util concurrent Semaphore 以下几行出现在书中 这是对其实施 虚拟许可 对象的评论 该实施没有实际的许可对象 并且Semaphore做 不将分配的许可与线程关
  • Java 并发:倒数锁存器与循环屏障

    我正在阅读java util concurrent API http download oracle com javase 6 docs api java util concurrent package summary html 并发现 C
  • ubuntu:sem_timedwait 未唤醒 (C)

    我有3个进程需要同步 进程一执行某项操作 然后唤醒进程二并休眠 进程二执行某项操作 然后唤醒进程三并休眠 进程三执行某项操作 唤醒进程一并休眠 整个循环定时运行在 25hz 左右 由于在我的 真实 应用程序中触发进程二之前 外部同步到进程一
  • fork(),多个孩子的问题

    我编辑了一点 for ii 0 ii lt nbEnfants ii switch fork case 1 printf n nSoucis avec fork n n exit 0 case 0 EEcrireMp ii break de
  • 当将信号量递减至零的进程崩溃时,如何恢复信号量?

    我有多个使用 g 编译的应用程序 在 Ubuntu 中运行 我使用命名信号量来协调不同的进程 一切正常except在以下情况下 如果其中一个进程调用sem wait or sem timedwait 减少信号量 然后在有机会调用之前崩溃或被
  • RedHat Enterprise Linux 5.3 及以上版本不正确支持 sem_timedwait?

    我们在使用 pthreadsem timedwait 的 RedHat Enterprise Linux 系统上看到了奇怪的行为 仅 5 3 及以上版本才会出现此情况 当我们使用 sem init 在后台线程上创建信号量时 不会返回错误 当
  • 计数信号量和二进制信号量之间的区别

    计数和二进制信号量有什么区别 我在某处看到的是 两者都可以控制 N 个请求资源的进程 两者都拥有自由邦 二进制信号量和计数信号量可以保护的资源数量是否有限制 两者都只允许一个进程一次使用一种资源 还有其他区别吗 上述属性是否正确 实际上 这
  • 在等待挂起操作取消时处置 SemaphoreSlim 是否安全?

    我必须使用 SemaphoreSlim 来确保对代码某些部分的单线程访问 并且希望确保我正确处理所有内容 假设我有以下课程 public class Foo private readonly CancellationTokenSource
  • 使用信号量实现 N 进程屏障

    我目前正在为之前迭代的操作系统考试进行培训 我遇到了这个 实施 N 进程屏障 即 是 确保每个流程都完成 他们中的一群人在某个时刻等待着 点在其各自的执行中 对于 其他进程达到他们的 给定点 您有以下内容 可用操作 init sem val
  • 信号量和互斥量在实现上有什么区别?

    我读到互斥锁和二进制信号量仅在一方面不同 在互斥锁的情况下 锁定线程必须解锁 但在信号量中 锁定和解锁线程可以不同吗 哪一种效率更高 假设您知道信号量和互斥体之间的基本区别 为了快速 简单的同步 请使用临界区 要跨进程边界同步线程 请使用互
  • Java 中最快的循环同步是什么(ExecutorService、CyclicBarrier、X)?

    哪种 Java 同步结构可能提供最好的 并发 迭代处理场景的性能 像下面概述的那样固定数量的线程 实验后 我自己呆了一段时间 使用 ExecutorService 和 CyclicBarrier 并且 对结果有些惊讶 我会感激一些 专家建议
  • 我需要处置 SemaphoreSlim 吗?

    根据文档 a SemaphoreSlim不使用 Windows 内核信号量 是否有任何特殊资源被使用SemaphoreSlim这使得打电话很重要Dispose当 的时候SemaphoreSlim将不再使用 如果您访问AvailableWai
  • shell脚本中是否有互斥/信号量机制?

    我正在 shell 脚本中寻找互斥 信号量 并发机制 考虑以下情况 除非 a 用户不关闭共享文件 否则 b 用户应该无法打开 更新它 我只是想知道如何在 shell 脚本中实现互斥量 信号量 临界区等 在 shell 脚本中实现锁定机制 文
  • 向父进程发出信号,表明子进程已完全初始化

    我正在启动一个公开 WCF 端点的子进程 如何从子进程向父进程发出信号 表明子进程已完全初始化并且现在可以访问端点 我曾考虑过使用信号量来实现此目的 但不太清楚如何实现所需的信号 string pipeUri net pipe localh

随机推荐

  • anaconda中使用pip无法安装库到指定环境下的问题(已解决)

    参考文章 xff1a https blog 51cto com u 15060549 4662570 login 61 from csdn 大致意思就是通过修改site py文件中的 这段代码 xff0c 将这两个变量修改为环境自身的路径即
  • 使用Java实现HDFS文件读写

    1 HDFS读文件 2 HDFS写文件 3 实例操作 3 1新建Mawen工程 3 2在pom xml中将标签中内容替换为以下代码 xff0c 静待依赖包下载完毕 lt dependencies gt lt dependency gt lt
  • GD32F303移植FreeRTOS多任务调度只能执行一个任务解决办法

    1 问题描述 GD32F303移植完FreeRTOS后创建多个任务 xff0c 运行的时候只有一个任务在运行 xff0c 其余任务处于卡死不运行状态 xff0c void start task void pvParameters taskE
  • npm显示升级到最新版本仍然显示npm为原版本的问题解决

    文章目录 前言一 问题描述二 问题原因三 解决方法1 查看npm安装路径2 修改npm全局安装路径命令3 npm更新命令 总结 前言 在升级npm版本时遇到了显示版本升级成功 xff0c 但是在继续执行npm v命令查看npm版本时仍然显示
  • 教你做一个属于自己的平衡小车,用STM32F103单片机实现(代码篇)

    平衡小车软件篇 平衡小车硬件篇 目录 一 定时器相关代码 1 TIM2 2 TIM3和TIM4 二 中断相关代码 三 电机相关代码 四 OLED屏幕和MUP6050相关代码 五 PID函数 1 直立环 2 速度环 3 转向环 六 控制函数
  • MySQL报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column whic

    报错信息 报错信息及语句如下 span class token keyword SELECT span i span class token punctuation span sku id sku id span class token p
  • Ros2 Foxy:apt-get update过程中密钥问题

    本人在Ubuntu20 04中根据官方文档Foxy安装Rox2出现 The following signatures couldn t be verified because the public key is not available
  • CSS解决高度塌陷的几种方式

    浮动元素对兄弟元素的影响 当设置元素浮动时 xff0c 会脱离文档流 xff0c 飘在不设置浮动兄弟元素的上面 xff0c 不占据底下的屏幕位置 注意文字是不会被浮动元素覆盖掉 清除浮动的方式 两个元素同时设置浮动 clear both 清
  • Integer值比较

    包装类与基本数据类型 包装类是将基本数据类型封装成一个类 xff0c 包含属性和名称 使用 xff1a 在使用过程中 xff0c 会涉及到自动装箱和自动拆箱 装箱 xff1a 将基本数据类型转换成包装类 span class token c
  • java理解向上转型和向下转型

    在讲述向上转型和向下转型之前 我们先简单讲解下多态 如果后续看了有关多态的讲解还是不弄 只能自己上网去查阅和理解 多态概念 多态是面向对象程序设计 xff08 OOP xff09 的一个重要特征 xff0c 指同一个实体同时具有多种形式 x
  • LCD1602和12864简单的介绍

    实验室培训总结1 这个寒假有幸参与到了学校的实验室培训 xff0c 真的是受益良多 xff0c 也学习到了芯片的使用 先讲以下首先学习到了1602的液晶屏的使用 xff0c 驱动一个模块无非就是通过根据所给的时序图进行一系列的编写 xff0
  • msOs

    对ms0S的总结 由于msOS对比51比较难学 xff0c 这里也不太好总结 xff0c 第一印象是就是功能太强大 xff0c 很多寄存器都封装在一个结构体里面 xff0c 方便调用 xff0c 因为这个msOs基于STM32进行改变等待
  • MySQL学习-体系架构

    连接层 最上层 xff08 客户端连接器到连接池这一部分 xff09 是一些客户端和链接服务 xff0c 主要完成一些类似于连接处理 授权认证 及相关的安全方案 服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构 x
  • 有关显示器的缩放比例和分辨率的设置问题

    今天我们来讨论桌面 显示设置中的这两个功能 缩放比例 xff1a 首先我们要知道计算机的显示器图像的显示是靠底层的发光片来实现的 xff08 每个发光片都是一个像素点 xff09 而大显示器和小显示器每个像素点的大小不同 xff0c 但是如
  • TS快速入门-函数

    在TS里 xff0c 虽然已经支持类 xff0c 命名空间和模块 xff0c 但函数仍然是主要的定义行为的地方 TS中的函数大部分和JS相同 不同之处在于ts会给函数返回值和参数加上类型声明 在TS中 xff0c 函数仍然是最基本 最重要的
  • SpringBoot整合shiro——简单的demo

    结构目录 前端页面代码部分 index html span class token doctype span class token punctuation lt span span class token doctype tag DOCT
  • Kali Linux的vi编辑器/vim编辑器使用方法

    转载声明 xff1a 本文为转载文章 原文地址 xff1a https www 52host cn blog kali linux vi editor Kali Linux系统的vi编辑器 vim编辑器的使用和CentOS有很多不同 基本使
  • 〖小狼毫〗小狼毫使用教程『完善版本』

    一 声明 因为我这里只有win10电脑 xff0c 就以win10系统电脑五笔86输入方案为例 xff0c 其他系统的可以这此为基础进行参考 xff1b 个人建议先在虚拟机里配置好 xff0c 再移到宿主机上 xff08 大佬除外 xff0
  • podman网络、常用命令、以及容器的开机自启

    目录 1 podman网络1 1 rootfull和rootless容器网络之间的差异1 2 防火墙1 3 容器间通信示例 xff1a 1 4 查看防火墙规则 2 podman常用命令3 容器的开机自启3 1 root用户3 2 普通用户
  • CountDownLatch 、ReentryLock、CyclicBarrier 、ReadWriteLock 、Semaphore、Exchanger、LockSupport

    CountDownLatch 又叫门栓 xff0c 初始化设置一个值 xff0c 当这个值等于0时 xff0c 是否锁 span class token keyword private span span class token keywo