多线程编程模式之Single Threaded Execution 模式

2023-05-16

一、Single Threaded Execution 模式介绍

简单的来说,Single threaded execution 模式描述了在一种多线程环境下各个线程对于公用资源的使用方式——任一时刻,只有一个线程可以使用该公用资源~

STE有三个关键部分:多线程公有资源唯一线程可使用;关于为什么使用多线程这个问题,答案是我们可以利用它来获得好处,这个好处就是我们系统的一部分性能将获得提高,虽然系统整体性能不一定提高,但是总是有可能的嘛。如果系统中,某一资源可以有很多,大家各自用各自的,相安无事,即没有产生公用~但是如果某些资源对系统来说负担过于沉重(比如涉及到IO、数据库连接等费时操作时,我们还是希望花一份时间比较好),或者这样的资源只能有一个(比如,一个网站的访问次数统计器,每个页面都需要使用到它,如果各自使用各自的,那么统计的就是网页访问次数了,还比如一些全局配置文件,当该文件发生变化后,系统响应部分需要得到同步更新,各自使用一个该文件肯定就不行了,还有就是唯一序列号的生成器等应用),那么就需要公用这里资源了。总体来说,STE这里的公用资源具有“不得不”只有一个或者“最好”只有一个以及”某一时刻,只能一个线程使用”的特点~

至于为什么某一时刻只能一个线程使用公用资源,这是因为某些时候多条线程同时访问公用资源(1)(想一想,什么是“同时访问”呢,如果只有一个CPU,那么某一时刻,一定只有一个线程使用公用资源,但这是STE吗?)会对公用资源造成破坏,使其失去使用价值。比如A打算把X(=10)加1后打印,理论上来说A输出X=11;但如果A把X加1后还没来得及打印就被置换出去了,B开始执行把X加1,然后输出,理论上B输出X=12,结果B的确输出X=12,这时A又被调度执行,输出的就不再是X=11,而是X=12;即B对X的访问,破坏了A对X的访问。嗯,我认为,同时访问就是指一个线程A对公用资源的一套处理流程没有全部执行完,另一个线程B就开始了对公用资源的处理。(这里再问个问题,就是在(1)处某些时候的对立面的情况下,我们还有必要使用STE吗?即是不是只要有一个公用资源,我们就必须使用STE模式使用多线程呢?其实,第一段中的定义还是比较准确的,因为STE只描述了一种方式哦~哈哈哈,算是小提示啦,同时提醒自己!);

二、Single Threaded Execution的使用场景

  1. 多线程编程环境
  2. 多个线程同时访问共享资源;
  3. 共享资源的状态会因线程的访问而改变;(换言之,如果共享资源的状态不会因为多线程访问而改变,那么就不适用STE模式啦);

三、Single Threaded Execution的实例代码及分析

// 多线程类,功能及时让来自address的那么通过gate类
public class WorkerThread extends Thread {
    private final Gate gate;
    private final String name;
    private final String address;
    public WorkerThread(Gate g,String n,String a){
        this.gate=g;
        this.name=n;
        this.address=a;
    }
    public void run(){
        System.out.println(name+" Begin");
        while(true){
            gate.pass(name,address);
        }
    }
}
//Gate 抽象类,我们将派生出线程安全的Gate和非线程安全的Gate
public abstract class Gate {
    int counter=0;
    String name="Nobody";
    String address="Nowhere";
    public abstract void pass(String name,String address);
}
//安全的Gate,嗯,不防盗,但是防多线程不安全访问~
public class SafeGate extends Gate {
    public synchronized String toString(){//这是一个同步方法哦
        return "No."+counter+": "+name+","+address;
    }
    void check(){//这里不用同步,因为该函数的调用者已经同步过啦
        if(name.charAt(0)!=address.charAt(0)){
            System.out.println("******BROKEN****** "+toString());
        }
    }
    @Override
    public synchronized void pass(String name, String address) {//安全的同步门
        super.counter++;
        super.name=name;
        super.address=address;
        check();
    }
}
//非线程安全的Gate
public class UnSafeGate extends Gate {
    public void pass(String name,String address){
        super.counter++;
        super.name=name;
        super.address=address;
        check();
    }//该函数的执行可能被打断,而造成公用数据被修改
    public String toString(){
        System.out.println("Father toString");
        return "No."+counter+": "+name+","+address;
    }
    private void check(){
        if(name.charAt(0)!=address.charAt(0)){
            System.out.println("******BROKEN****** "+toString());
        }
    }
}

四、对Single Threaded Execution的理解

在面向对象程序设计领域中,大师们总结出著名的23种设计模式,江湖上自然还有若干非著名(但不一定不实用哦)的设计模式,其中单例模式就位于著名的23种当中;

当我看到STE时,感觉和设计模式中单例模式非常像,嗯,其实他们的偏重点不同,理念也不同!相同的是涉及的资源都只有一个,然而,这不是重点啊~

两者的不同之处就在于:

  1. 使用环境不同:如果在单线程环境下,我们仍然可以使用单例模式以保证系统各个部分使用的是同一个对象。而STE的大环境条件就是多线程啊~
  2. 侧重点不同:单例模式更偏向如何创建唯一一个对象~而对该对象的使用环境设定也多为单线程,即没有考虑多线程环境下访问该对象时面临的安全性问题;STE模式更偏向如何在多线程环境下安全地使用一个共享对象,至于该类的对象是否唯一并不关注。

总体来说,STE指出了多线程环境下对可变共享资源的一种访问方式,是一种多线程环境下利用互斥访问以实现线程安全的策略。

当然,具体的应用中还需要灵活地结合实际的功能需求,不过,同单例模式搭配使用的STE,味道应该很不错哦~(单例模式保证该对象全局唯一,STE保证对该对象的访问线程安全~);

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

多线程编程模式之Single Threaded Execution 模式 的相关文章

  • 华为CE12808更换主控板

    在更换主控板的过程中 xff0c 务必缓慢 平稳地插拔单板 xff0c 避免左右晃动而导致触碰相邻单板 xff0c 造成正在运行中的单板发生故障 在主控板拔插的过程中严禁用手接触单板上的元器件 xff0c 以免损坏单板 新的主控板在出厂时已
  • 迪普防火墙FW1000普通双击热备配置

    一 组网图 二 端口聚合配置 三 配置三层接口地址 四 配置普通双机热备 五 配置安全域 六 配置地址对象 七 配置服务对象 八 配置静态路由 九 配置VRRP 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十三 配置包过
  • 迪普防火墙F1000静默双击热备配置

    一 组网图 二 创建端口聚合 三 配置心跳接口IP地址 四 配置静默双击热备 五 配置三层接口IP地址 六 配置安全域 七 配置地址对象 八 配置服务对象 九 配置静态路由 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十
  • Zabbix用户及用户组权限概述

    本文简单介绍用户及用户组权限 xff0c 参考官方文档 xff1a https www zabbix com documentation 5 2 manual config users and usergroups 一 概述 Zabbix
  • 使用nginx反向代理MRCP SERVER

    MRCP V2 的消息组成 MRCP xff08 V2 xff09 的交互过程可以分为三部分 1 SIP交互 xff1a Session Initiation Protocol xff0c 缩写SIP 正如协议的名称所言 xff0c 用于初
  • 一文搞懂如何使用STM32驱动直流电机(普通PWM输出和L298N、高级定时器输出带死区双通道互补PWM和IR2110S及自举电路、H桥电路和电机正反转)

    本文将用最通俗易懂的语言讲解怎么使用STM32驱动直流电机 xff0c 以及在使用过程中容易遇到的问题和解决办法 本文将介绍两种驱动方式 xff1a 普通PWM驱动L298N驱动直流电机 xff1b 互补PWM驱动IR2110S驱动直流电机
  • Linux —— 线程池

    目录 一 什么是线程池 二 线程池的优点 三 线程池的应用 四 实现一个简单的线程池 五 单例模式 1 饿汉实现方式 2 懒汉实现方式 3 单例模式实现线程池 xff08 懒汉方式 xff09 六 其他常见的各种锁 一 什么是线程池 线程池
  • 跟我一起写Shell脚本之二十二--常用命令(xargs)

    1 介绍 xargs 是一个强有力的命令 xff0c 它能够捕获一个命令的输出 xff0c 然后传递给另外一个命令 命令格式 xff1a xargs options command 选项 xff1a a file 从文件中读入作为 stdi
  • 解决Win10笔记本电脑Wifi频繁断线的问题

    Win10无线总是掉线怎么回事 经常有网友抱怨 xff0c 电脑升级Win10之后 xff0c 无线网络经常容易掉线或者不稳定的情况 有时候即便是勾选了自动连接Wifi xff0c 断线后也不会自动连接 Win10笔记本Wifi总是断线解决
  • 国内各个界面库比较,告诉你怎么选择界面库?

    目前网络上的界面库多彩多样 这里以个人的观点 xff0c 来评价一下界面库 如果有不当的地方望批评指出 1 Skin 43 43 www uipower com 该界面库是基于WIN32的界面库 xff0c 以上海勇进公司的形式来运作 xf
  • Docker端口映射

    为什么要端口映射 xff1f 在启动容器时 xff0c 如果不配置宿主机器与虚拟机的端口映射 xff0c 外部程序是无法访问虚拟机的 xff0c 因为没有端口 端口映射的指令是什么 xff1f docker指令 xff1a docker r
  • pyqt QStatusBar显示提示信息

    span class token keyword from span PyQt5 span class token keyword import span QtCore span class token keyword from span
  • 打jar包出现错误: The packaging for this project did not assign a file to the build artifact

    转载 xff1a 打jar包出现错误 xff1a The packaging for this project did not assign a file to the build artifact 曼彻斯特的天空是红色的的博客 CSDN博
  • 常见错误——使用CP命令复制目录出现 omitting directory 错误

    错误名称 omitting directory 使用命令 cp 描述 在Linux下使用cp命令拷贝对象时 xff0c 若出现了 omitting directory 错误 xff0c 确认CP命令复制的对象是否为非空目 录 在复制非空目录
  • 个人简历

    大家好 xff1a 本人系重庆大学2003级硕士研究生 xff0c 将于2006年7月毕业 相关技能 xff1a 1 计算机 xff1a 熟悉计算机软 硬件体系结构 xff0c 了解计算机接口技术 xff1b 熟悉C 43 43 汇编等语言
  • Adversarial Robustness - Theory and Practice

    文章目录 第一章 Introduction to adversarial robustness第二章 linear models第三章 Adversarial examples solving the inner maximization1
  • 筋斗云移动应用框架

    筋斗云框架是用于移动产品开发的一揽子解决方案 筋斗云的设计思想是做优雅的全平台应用 xff0c 可以制作各类移动端 xff08 如安卓 苹果平台 xff09 或桌面端 xff08 如Windows等桌面系统 xff09 的Web应用和原生应
  • 筋斗云接口编程 / 虚拟表和视图

    虚拟表和视图 表ApiLog中有一个字段叫app xff0c 表示前端应用名 xff1a 64 ApiLog id tm addr app userId userId 如果app 61 user xff0c 则关联到User表 xff1b
  • 用zt-zip Java库进行zip文件处理

    Java 标准库本身自带java util zip包 xff0c 利用该包可以解决zip文件的处理问题 但是该包提供的功能相对底层 xff0c 想要实现zip文件的处理 xff0c 需要写一 些代码 xff0c 该包并没有封装API到调用一
  • Linux临时目录/tmp与/var/tmp

    Linux有两个公知的临时目录 xff1a tmp与 var tmp xff0c 这两个目录被用户用于存储临时性的文件 xff0c 亦经常被程读写用户存储临时性数据 两个目录没有本质上的区别 xff0c 最根本的区别仅仅是系统对其中文件清理

随机推荐

  • Python 日志打印

    核心概念 Python标准库自带日志模块logging xff0c logging中涉及到4个核心组件 xff0c 这些组件构建了logging体系 Logger xff1a 应用程序直接使用的接口对象 xff0c 通过logger操作完成
  • Docker指定网桥和指定网桥IP

    docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host Bridge
  • Python Hash操作-MD5-SHA-HMAC

    Python标准库提供了计算数据Hash的功能 xff0c 支持许多不同的算法 xff0c 常见的MD5 SHA1 SHA256 HMAC均在其中 MD5 SHA1 SHA256在hashlib模块中 xff0c HMAC在hmac模块中
  • 离线环境下火狐浏览器Firefox完全信息迁移

    火狐浏览器Firefox是一个历史比较久的网页浏览器 xff0c 当前的火狐采用顺序数字命名的版本号演进 xff0c 迭代速度较快 xff0c Windows上可以自动升级 xff0c 升级带来了安全更新和功能特性上的变化 火狐浏览器具书签
  • 用SLF4J输出log的正确姿势

    slf4j是Java的一种Log Api xff0c 类似Apache Commons Logging 最直接的log方式 logger debug 34 Entry number 34 43 i 43 34 is 34 43 String
  • Thymeleaf消息表达式

    消息表达式用于从消息源中提取消息内容实现国际化 表达式的语法 xff1a span class token tag span class token tag span class token punctuation lt span p sp
  • Thymeleaf URL表达式

    URL在Thymleaf中是第一类公民 xff0c 有其专有的表达式语法 64 共存在2大类URL xff1a 绝对URL http www your domain相对URL xff0c 分为四类相对于页面 user login html相
  • Maven resources的include和exclude

    Maven resources plugin支持明确声明 lt directory gt 指定的资源目录中哪些资源需要处理 xff0c 哪些资源可以不被处理 lt include gt 指明需要包括的资源 xff0c 位于src my re
  • Thymeleaf条件判断

    th if th if属性求Bool值 xff0c 只有true的时候其所在的标签及该标签中的内容才会被渲染到输出结果中 lt a href 61 34 comments html 34 th href 61 34 64 product c
  • 2019 蓝桥杯省赛 A 组模拟赛(一)C. 结果填空:马的管辖 (暴力搜索)

    题目 xff1a 在中国象棋中 xff0c 马是走日字的 一个马的管辖范围指的是当前位置以及一步之内能走到的位置 xff0c 下图的绿色旗子表示马能走到的位置 如果一匹马的某个方向被蹩马脚 xff0c 它就不能往这个方向跳了 xff0c 如
  • Ubuntu下安装使用Xfce4

    安装 xff1a 代码 sudo apt get install xfce4 xfce4 taskbar plugin xfce4 taskbar plugin是我需要 xff0c 你可不用 xff0c 完整安装xfce4 的桌面环境 su
  • isdigit()函数如何判断负数

    在使用字符序列isdigt函数时 xff0c 我们会发现它无法判断负数 xff0c 如 xff1a a 61 39 2 39 39 3 39 4 5 print a 0 isdigit print a 1 isdigit 输出 xff1a
  • 用python操作浏览器的三种方式

    第一种 xff1a selenium导入浏览器驱动 xff0c 用get方法打开浏览器 xff0c 例如 xff1a import time from selenium import webdriver def mac driver 61
  • Linux-虚拟网络设备-veth pair

    基本概念 Virtual Ethernet CableBidirectional FIFOOften used to cross namespaces Linux container 中用到一个叫做veth的东西 xff0c 这是一种新的设
  • openstack-neutron-OVS agent(持续更新)

    概述 ML2Plugin的主要工作是管理虚拟网络资源 xff0c 保证数据正确无误 xff0c 具体物理设备的设置则由Agent完成 L2Agent通常运行在Hypervisor xff0c 与neutron server通过RPC通信 x
  • VUE中使用EventSource接收服务器推送事件

    Vue项目中 xff0c EventSource触发的事件中this指向变了 使用const that 61 this xff0c 然后在EventSource触发的事件中使用that if typeof EventSource 61 61
  • VNC

    一 安装tigervnc server 二 配置登录帐号 三 生成xstartup与log日志 注意 xff1a 如果没有使用vncserver来 设置密码 xff0c 则service vncserver restart 是不会成功的 这
  • DirectUI框架GUIFW

    前言 guifw是一款基于GDI 43 的DirectUI皮肤引擎 xff0c 借鉴了DuiLib和Qt的思想 效果预览 xff1a http download csdn net detail sllins 7707771 代码已开源 xf
  • keil 提示internal command error和no sw device

    1 使用keil烧录软件的时候 xff0c jlink stlink无法识别到芯片 需要排查的问题 1 xff09 换条线 2 xff09 是不是有程序禁用了Seral Wire xff1a 使用cubeide cubeMX xff0c 容
  • 多线程编程模式之Single Threaded Execution 模式

    一 Single Threaded Execution 模式介绍 简单的来说 xff0c Single threaded execution 模式描述了在一种多线程环境下各个线程对于公用资源的使用方式 任一时刻 xff0c 只有一个线程可以