线程同步模式的设计思路

news2025/1/11 12:56:08

👳我亲爱的各位大佬们好😘😘😘
♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。
♨️如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛
👨‍🔧 个人主页 : 阿千弟

同步模式之保护性暂停

何为保护性暂停

保护性暂停是一种同步模式,用于保护共享资源的完整性。在多线程或多进程环境中,如果多个线程或进程同时访问共享资源,可能会导致数据不一致或者竞态条件等问题。为了避免这种情况,可以使用保护性暂停来保护共享资源。

实现方式:

在访问共享资源之前,先获取一个锁,然后再访问共享资源。如果锁已经被其他线程或进程占用,则当前线程或进程会被阻塞,直到锁被释放为止。在访问完共享资源之后,需要释放锁,以便其他线程或进程可以继续访问共享资源。

作用:

保护性暂停可以保证共享资源的完整性,但是也会带来一定的性能开销。因为每个线程或进程在访问共享资源之前都需要获取锁,如果锁的竞争比较激烈,就会导致线程或进程的等待时间增加,从而影响系统的性能。因此,在使用保护性暂停时,需要权衡保证数据完整性和系统性能之间的关系,选择合适的锁机制和并发控制策略。

  1. 具体定义:

Guarded Suspension(被监视的挂起),用在一个线程等待另一个线程的执行结果
在这里插入图片描述

要点

  • 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject
  • 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
  • JDK 中,join 的实现、Future 的实现,采用的就是此模式
  • 因为要等待另一方的结果,因此归类到同步模式

代码实现

GuardedObject

@Slf4j
public class GuardedObject {

    private Object response;
    private final Object lock = new Object();
	
	//直到收到返回结果会被唤醒, 死等
    public Object get(){
        synchronized (lock){
            while (response==null){
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return response;
    }

	//接受结果的等待时间为mills, 如果该期间仍然没有接受到返回结果, 则
    public Object get(long mills){
    	// 1) 记录最初时间
        long beginTime = System.currentTimeMillis();
        // 2) 已经经历的时间
        long passTime = 0;
        synchronized (lock){
            while (response==null){
                // 4) 假设 millis 是 1000,结果在 400 时唤醒了,那么还有 600 要等
                long waitTime = mills - passTime;
                if (waitTime <= 0){
                    break;
                }
                try {
                    lock.wait(waitTime);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 3) 如果提前被唤醒,这时已经经历的时间假设为 400
                passTime = System.currentTimeMillis() - beginTime;
                log.debug("timePassed: {}, object is null {}",passTime, response == null);
            }
        return response;
        }
    }

    public void complete(Object response){
        synchronized (lock){
            // 条件满足,通知等待线程
            this.response = response;
            lock.notifyAll();
        }
    }

    public static void main(String[] args) {
        GuardedObject guardedObject = new GuardedObject();

        new Thread(()->{
            try {
                List<String> response = Downloader.download();
                log.info("下载完成");
                guardedObject.complete(response);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }).start();

        log.info("正在下载");

        Object response = guardedObject.get(500);
        if(response!=null){
            log.debug("get response: [{}] lines", ((List<String>) response).size());
        } else {
            log.debug("can't get response");
        }

    }
}

下载案例demo

public class Downloader {
    public static List<String> download() throws IOException {
        HttpURLConnection conn = (HttpURLConnection) new URL("https://www.baidu.com/").openConnection();
        List<String> lines = new ArrayList<>();
        try (BufferedReader reader =
                     new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
            String line;
            while ((line = reader.readLine()) != null) {
                lines.add(line);
            }
        }
        return lines;
    }
}

测试,超时

17:41:21.194 [main] INFO com.jrm.juc.GuardedObject - 正在下载
17:41:21.700 [main] DEBUG com.jrm.juc.GuardedObject - timePassed: 503, object is null true
17:41:21.701 [main] DEBUG com.jrm.juc.GuardedObject - can't get response
17:41:25.560 [Thread-0] INFO com.jrm.juc.GuardedObject - 下载完成

Process finished with exit code 0

在这里插入图片描述

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对Java后端或者对spring, 分布式, 云原生感兴趣的朋友,请多多关注💖💖💖
👨‍🔧 个人主页 : 阿千弟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/580521.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISCC2023 擂台misc wp

刚想起来发 文章目录 雪豹哦&#xff1f;摩斯密码&#xff1f;ඞG9的钢琴曲BNG听你心跳里的狂Brain Games user-id&#xff1a;芝士雪豹 雪豹 这道题没啥意思&#xff0c;存粹为了套拿450分。知识点属于重复知识点&#xff0c;见谅&#xff1a; 拿到附件&#xff0c;用360解…

分布式网络通信框架(十)——Mprpc框架使用示例

发布一个服务提供远程调用方法的流程 若想要发布一个服务提供一些远程调用方法&#xff0c;步骤如下&#xff1a; 先在protobuf文件中添加参数和返回值的message 类型&#xff0c;然后再添加希望提供的服务 service 类型&#xff08;如UserServiceRpc&#xff09;和 其中的方…

傅里叶级数和傅里叶变换之间的关系推理及应用

傅里叶级数和傅立叶变换是傅里叶分析的两个主要工具&#xff0c;它们之间有密切的关系。 什么是傅里叶级数 傅里叶级数是将一个周期函数分解为一系列正弦和余弦函数的和。它适用于周期性信号&#xff0c;可以将周期函数表示为一组振幅和相位不同的谐波分量的和。傅里叶级数展…

【ChatGPT】ChatGPT快速生成短视频

1.chatGPT剪映 chatGPT生成文本后通过剪映图文成片 这次用了new bing&#xff1a;Chatbot AI 在线网页版 (atmob.cn) 打开剪映-图文成片 把new bing生成的文本粘贴过来&#xff0c;点击生成视频。 生成好了&#xff0c;是这样 剪映自动生成的&#xff0c;最后还是得手工改改&…

ChatGPT生成Excel统计公式

&#x1f34f;&#x1f350;&#x1f34a;&#x1f351;&#x1f352;&#x1f353;&#x1fad0;&#x1f951;&#x1f34b;&#x1f349; ChatGPT生成Excel统计公式 文章目录 &#x1f350;问题引入&#x1f350;具体操作&#x1f433;结语 &#x1f350;问题引入…

如何使用 service account 获取 keycloak 的用户信息

Keycloak 是一个开源的权限管理和认证系统。使用 Keycloak 可以让开发者专注于解决业务的核心问题。获取用户信息是权限管理和认证系统需要的基本功能。Service Account 是OAuth 2.0推荐的系统服务使用的账户&#xff0c;开发者可以通过 Keycloak 的 Service Account 来让自己的…

【嵌入式烧录/刷写文件】-3.2-S19/Hex文件转换为Bin文件

案例背景(共6页精讲)&#xff1a; 该篇将告诉您&#xff1a;如何使用Vector HexView工具&#xff0c;对一个Intel Hex或Motorola S-record(S19/SREC/mot/SX)文件转换为bin文件。 目录 1 Intel Hex&#xff0c;Motorola S-record(S19/SREC/mot/SX)&#xff0c;Bin文件之间的差…

基于SpringBoot养老院管理系统

目录 一、项目介绍 二. 运行环境 三、项目技术 四、部署项目 五、项目运行 六、项目展示 五、项目下载 一、项目介绍 基于springboot的养老院管理系统拥有多种角色账号&#xff1a;管理员和用户 管理员&#xff1a;管理员管理、用户管理、健康管理、病例方案管理、药品…

计算机网络面试八股文

网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。最全面的Java面试网站&#xff1a;最全面的Java面试网站 五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&a…

文生视频综述

文字生成视频当前挑战 和发展现状_哔哩哔哩_bilibili今天我们聊了什么是 text to video&#xff0c;它的原理和目前的研究进展。text to video 是一种将文本转换为视频的技术&#xff0c;它可以通过图像处理、语音识别和自然语言处理等技术来实现。目前&#xff0c;text to vid…

【C语言】刷题训练营 —— 每日一练(十三)

文章目录 前言 BC123 小乐乐找最大数BC124 小乐乐是否被叫家长BC125 小乐乐转换成绩BC126 小乐乐算多少人被请家长BC127 小乐乐算最高分BC128 小乐乐计算求和BC129 小乐乐计算函数BC130 小乐乐查找数字BC131 KiKi学程序设计基础BC132 KiKi算期末成绩完结 前言 大家好&#xff…

计算机体系结构标量处理机

先行控制技术 缓冲深度的设计方法 以先行指令缓冲栈为例。 假设缓冲深度为 D 1 D_1 D1​&#xff0c;考虑以下两种极端情况。 &#xff08;1&#xff09;先行指令缓冲栈已经充满&#xff0c;此时指令流出速度最快&#xff0c;例如连续分析RR型指令 &#xff0c;设这种指令序…

[元带你学: eMMC协议详解 12] Speed Mode 选择

依JEDEC eMMC 5.1及经验辛苦整理&#xff0c;付费内容&#xff0c;禁止转载。 所在专栏 《元带你学: eMMC协议详解》 内容摘要 全文 2000字&#xff0c; 介绍了各种Speed Mode 选择的方法&#xff0c; 需要按照一定的步骤&#xff0c; 重点需要掌握HS400, High Speed 和 HS20…

python中的流程控制语句

文章目录 if-else语句代码演示&#xff1a; if-elif-else语句代码演示1&#xff1a;代码演示2&#xff1a; while 循环语句循环语句练习1.求100以内所有的奇数之和2.求100以内所有7的倍数之和&#xff0c;以及个数3.求1000内的水仙花数4.获取用户输入的任意数&#xff0c;判断是…

《Reinforcement Learning: An Introduction》第2章笔记

2. Multi-armed Bandits 评估性反馈&#xff08;evaluative feedback&#xff09; 完全取决于采取的动作&#xff0c;这是强化学习采用的方式。纯粹的评估性反馈表明要执行的动作有多好&#xff0c;但是不关注它是否是可能的最好或最坏的动作。指导性反馈&#xff08;instruct…

迭代器Iterator和生成器funcion *

迭代器Iterator 迭代器 为各种不同的数据结果提供统一的访问机制&#xff0c;任何数据结构只要部署Iterator接口&#xff0c;就可以完成便利操作&#xff0c;主要提供for of 工作原理&#xff1a; 创建一个指针对象&#xff0c;指向当前数组的起始位置 第一次调用对象的next方…

JAVA之数组2

添加元素 从后往前进行迭代&#xff0c;最后在末尾插入元素 tip&#xff1a;为避免数字在覆盖过程中丢失&#xff0c;故从后往前覆盖 删除元素 从前往后迭代&#xff0c;最后将末尾赋值为0 tip: 以覆盖的数arr【i】为基准&#xff0c;构造循环 共同处Tip: 范围均为【index1&…

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做&#xff0c; 翻转的是21&#xff0c;因为2>1; 翻转的是210&#xff0c;因为2>0; 翻转的是2101&#xff0c;因为2>1&#xff1b; 翻转的是21010&#xff0c;因为2>0&#xff1b; 翻转的是210102&#xff0c;因为22且1&…

JavaScript 进阶 (二)

目录 深入对象 创建对象三种方式 构造函数 实例成员&静态成员 内置构造函数 Object Array String Number 深入对象 创建对象三种方式 1. 利用对象字面量创建对象 const obj { name : abc} 2. 利用 new Object 创建对象 const obj new Object({ uname: 123 }…

如何评估一个好的物业系统开发方案?

在当前不断变化的物业管理市场中&#xff0c;物业系统已成为物业管理公司提高管理效率和降低成本的必然选择。因此&#xff0c;如何评估一个好的物业系统开发方案成为了每个物业管理决策者必须面对的重要问题。在本文中&#xff0c;我们将介绍如何从以下几个方面来评估一个好的…