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 的相关文章

  • Java多线程通信-Semaphore(信号量)

    一 semaphone 信号量 Semaphone 信号量 是一个同步工具类 用来控制同时访问某个资源的线程数量 还可以用来实现某些资源池 或者给容器添加边界 Semaphone管理着一组 虚拟 的许可 permit 许可的初始数量可通过构
  • Semaphore 源码分析

    需要提前了解的知识点 AbstractQueuedSynchronizer 实现原理 类介绍 Semaphore 信号量 是用来控制同时访问特定资源的线程数量 它通过协调各个线程 以保证合理的使用公共资源 比如控制用户的访问量 同一时刻只允
  • Java中有互斥体吗?

    java中有互斥对象或者创建互斥对象的方法吗 我这样问是因为用 1 个许可证初始化的信号量对象对我没有帮助 想想这个案例 try semaphore acquire do stuff semaphore release catch Exce
  • 尝试捕获信号量的正确方法

    将信号量操作包装在 try catch 块中的正确方法是什么 如果获取操作在获取一定数量 但不是全部 请求的许可后被中断 会发生什么情况 你怎么知道要再次释放多少个 发布是否应该在 最终 块中进行 但是如果操作被中断 您是否可能会发布未获得
  • Ada 中的信号量

    我得到了以下代码并要求实现一个信号量 with Ada Text IO use Ada Text IO with Id Dispenser with Semaphores use Semaphores procedure Philos is
  • 如何在 C++14 中实现读取器/写入器锁

    我有一个哈希表数据结构 我希望通过使用读取器 写入器锁来使其线程安全 我的读取 写入比率可能在 100 1 左右 我一直在寻找如何使用 C 11 实现这个锁 比如这里的方法 但我注意到应该可以使用 C 14shared lock完成同样的事
  • 该解决方案中信号量的使用是否正确?

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

    背景 我的 WCF 应用程序必须调用一个没有任何并发 检查的服务 它是由第三方创建的服务 让他们添加并发检查可能是不可能的 我可以确保调用第三方服务的唯一方法是通过我的 WCF 应用程序 所以我正在考虑在我的代码中添加并发检查 为此 我将使
  • 为什么 sem_open 与 fork() 一起使用而不使用共享内存?

    即使信号量不在共享内存中 该程序也可以工作 我测试过 请注意我如何在 fork 之前创建一次变量 另一方面 用创建的信号量sem init 需要在共享内存中才能工作 但这仍然是一个sem t结构 那么为什么它不需要共享内存呢 的内容是sem
  • 正确实施乒乓球比赛

    我在一项作业中被要求实现正确调用 ping 和 pong 意思是在 ping 之前没有 pong 10 次的乒乓球游戏 意思是 控制台中的最终输出应该是 ping 1 pong 1 ping 2 pong 2 等 需求是用信号量 可重入锁和
  • 我是否“不想”使用读/写锁而不是普通互斥锁?

    同步对共享资源的访问时 是否有原因not使用读 写锁而不是普通互斥锁 这基本上只是一个写锁 besides它具有比我可能需要的更多功能的哲学原因 换句话说 如果我只是默认将读 写锁作为我首选的同步结构 我是否会搬起石头砸自己的脚 在我看来
  • 计数信号量和二进制信号量之间的区别

    计数和二进制信号量有什么区别 我在某处看到的是 两者都可以控制 N 个请求资源的进程 两者都拥有自由邦 二进制信号量和计数信号量可以保护的资源数量是否有限制 两者都只允许一个进程一次使用一种资源 还有其他区别吗 上述属性是否正确 实际上 这
  • 如何在异步加载的 HTML 元素之间创建信号量

    我在 HTML 页面中有一个出现多次的元素 并且运行相同的 JS 问题是 我希望它只有在第一个运行它时才执行特定功能 他的兄弟姐妹从未运行过它 我需要信号量在它们之间同步 我无法知道如何在 JS 中声明变量并以这种方式执行信号量 有很多方法
  • 具有 beginwait 函数的信号量

    我正在使用 begin end 编写一个异步库 并且需要锁定对象 目前 我正在使用信号量执行此操作 但调用semaphore WaitOne 在调用该线程的地方挂起该线程 我宁愿使用像 BeginWait 这样的东西 这样它会立即返回并在信
  • 我需要处置 SemaphoreSlim 吗?

    根据文档 a SemaphoreSlim不使用 Windows 内核信号量 是否有任何特殊资源被使用SemaphoreSlim这使得打电话很重要Dispose当 的时候SemaphoreSlim将不再使用 如果您访问AvailableWai
  • 使用易失性变量和信号量 - Java

    我从线程 信号量 易失变量等开始 我想知道当我使用信号量时是否有必要将变量定义为易失性 我的意思是 有 2 个线程 一个增加变量 另一个减少变量 例如 显然 在每次访问之前 我有一个互斥体 它随时控制只有一个线程正在 玩 变量 有必要定义为
  • Java无限信号量

    想知道如何not使用信号量限制连接 或任何东西 所以你可能会想 这听起来很愚蠢 但是 它稍微简化了我的代码 因为它让我可以统一处理有限和无限的情况 请注意 我并不是在寻找有关如何编写类似内容的建议 if limited semaphore
  • 如何在iOS应用程序中实现信号量?

    是否可以在ios应用程序中实现计数信号量 对的 这是可能的 有很多可用的同步工具 同步 NSLock NS条件 NS条件锁 GCD 信号量 并行线程锁 我建议阅读 线程编程指南 http developer apple com librar
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没

随机推荐

  • 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