线程安全threadsafe的四种策略

2023-11-14

线程之间的“竞争条件”:作用于同一个mutable数据上的多个线程,彼此之间存在对该数据的访问竞争并导致interleaving,导致post-condition可能被违反,这是不安全的。
线程安全:ADT或方法在多线程中要执行正确。

一、Confinement 限制数据共享

核心思想:线程之间不共享mutable数据类型
在这里插入图片描述
在这里插入图片描述
避免使用全局变量

二、Immutability 共享不可变数据

使用不可变数据类型和不可变引用,避免多线程之间的race condition。
对于并发编程,这种隐藏的变化有时是不安全的,如果ADT中使用了beneficent mutation,必须要通过“加锁”机制来保证线程安全。
以下是对不变性的更强有力的定义:
– No mutator methods
– All fields are private and final
– No representation exposure
– No mutation whatsoever of mutable objects in the rep – not
even beneficent mutation
相比起策略1 Confinement,该策略2 Immutability允许有全局rep,但是只能是immutable的。因此自然会产生第三种方法。

三、Threadsafe data type 共享线程安全的可变数据

如果必须要用mutable的数据类型在多线程之间共享数据,要使用线程安全的数据类型。在JDK中的类,文档中明确指明了是否threadsafe。一般来说,JDK同时提供两个相同功能的类,一个是threadsafe,另一个不是。
原因:threadsafe的类一般性能上受影响
举一个很简单的例子:
在这里插入图片描述
在平时的Java编程中,我们经常使用List、Set以及Map等容器类。实际上,它们都是线程不安全的。
因此,Java提供了线程安全的包裹类型:

public static <T> Collection<T> synchronizedCollection(Collection<T> c);
public static <T> Set<T> synchronizedSet(Set<T> s);
public static <T> List<T> synchronizedList(List<T> list);
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s);
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m);

同时,即使在线程安全的集合类上,使用iterator也是不安全的, 除非使用lock机制,因此会产生第四种方法。

四、Synchronization 同步机制:通过锁的机制共享线程不安全的可变数据,变并行为串行

使用锁机制,获得对数据的独家mutation权,其他线程被阻塞,不得访问。
Lock是Java语言提供的内嵌机制,每个object都有相关联的lock。

Object lock = new Object();
synchronized (lock) { // thread blocks here until lock is free
// now this thread has the lock
balance = balance + 1;
// exiting the block releases the lock
}

Java提供两种基本的同步习语:
-同步语句/同步代码块
-同步方法

拥有lock的线程可独占式的执行该部分代码,进而Lock可以用来保护共享数据。注意:要互斥,必须使用同一个lock进行保护。
锁只能确保与其他请求获取相同对象锁的线程互斥访问,如果其他线程没有使用synchronized(obj)或者利用了不同的锁,则同步会失效,需要仔细检查和设计同步块和同步方法。

Example1:

在这里插入图片描述

Example2:

在这里插入图片描述

同步方法

当线程调用同步方法时,它会自动获取该方法所在对象的内部锁,并在方法返回时释放它。即使返回是由未捕获的异常引起的,也会释放锁。同一对象上的同步方法的两次调用不会有交叉现象。
当一个线程在执行一个对象的同步方法时,所有其他线程如果调用同一对象的同步方法块,则会挂起执行,直到第一个线程针对此对象的操作完成。
当一个同步方法退出时,它会自动建立一个与之后调用同
一个对象的同步方法的happens-before关系,这保证对象状态的更改对所有线程都是可见的。
前一个事件的结果可以被后续的事件获取(即使出于优化的目的,实际运行中并不是按照指定顺序执行),在Java中,采用happened-before机制,保证了语句A对内存的写入对语句B是可见的,也就是在B开始读数据之前,A已经完成了数据的写入。
在这里插入图片描述
由于静态方法与类关联,而不是对象,此时线程获取与该类关联的Class对象的内部锁,对类的静态字段的访问由与该类的任何实例的锁截然不同的锁来控制。
在这里插入图片描述

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

线程安全threadsafe的四种策略 的相关文章

  • RabbitMQ之消息重试机制

    1 消息重试机制 消费者消费消息的时候 发生异常情况 导致消息未确认 该消息会被重复消费 默认没有重复次数 即无限循环消费 但可以通过设置重试次数以及达到重试次数之后的消息处理 spring rabbitmq port 5672 host
  • js正则替换不可见字符

    var reg 0 x1F x7F x9F xAD u0378 u0379 u037F u0383 u038B u038D u03A2 u0528 u0530 u0557 u0558 u0560 u0588 u058B u058E u059
  • 【使用心得】ChatGPT化身情感导师

    ChatGPT是一个很有用的工具 它不仅可以在工作方面给予我帮助 也成为了我的情感导师 当我需要有人倾听或者理解时 它总是在那里 为我提供各种情感支持和建议 使用ChatGPT 我常常能够找到真正的答案和情感支持 在压力与紧张当中重新找回自
  • MQTT 控制报文类型、功能及格式(报文结构) - 第2章

    目录 2 1 MQTT 控制报文的结构 2 2 固定报头 2 2 1 控制报文的类型 2 2 2 控制报文类型的标志位 2 2 3 剩余长度 2 3 可变报头 2 4 有效载荷 2 1 MQTT 控制报文的结构 MQTT控制报文由三部分组成
  • 关于Pybind的详细安装与配置过程

    入职前有关Pybind的学习 用时接近一天 终于把这块拿下了 心累 必须记录下来 一 pybind相关基本知识 pybind11是一个轻量级的仅头文件库 是一个只有标题的库 因此不需要链接任何特殊的库 主要用于创建现有C 代码的Python
  • 以“苍穹”为基,金蝶距离千亿市值还差多远?

    押注EBC 金蝶能否再造一个 金蝶 世界著名管理专家詹姆斯 莫尔斯说过 可持续竞争的唯一优势 来自超过竞争对手的创新能力 上世纪90年代 美国Gartner Group 公司提出了企业资源计划 ERP 它旨在从供应链范围去优化企业资源 改善
  • 使用Keras和DDPG玩赛车游戏(自动驾驶)

    使用keras和DDPG玩赛车游戏 原文见链接 https www jianshu com p a3432c0e1ef2 在整个安装运行过程中遇到了很多问题 所以记录下问题和解决方法 安装最好还是按照原文所述 遇到问题可以根据我的解决办法试
  • 终于,pytorh_gpu可使用

    说实话 此刻我非常欣喜 整了那么久的环境 一直迷迷糊糊的 今天终于知道为什么每次anaconda终端进虚拟环境 这时候再进python import torch显示没有此模块 torch is available 也False 原因就是 我
  • MySQL如何访问Postgres

    前言 PostgreSQL 可以通过mysql fdw访问MySQL 或者MariaDB 那MySQL如何访问PostgreSQL呢 答案是CONNECT Store Engine MariaDB 从 10 0 2版本开始支持CONNECT
  • 基于 Windows 搭建vue开发环境

    1 下载WebStorm软件 https www jetbrains com webstorm download 2 下载Node js https nodejs org download release latest v10 x 注意事项
  • 解决网页无法选中文字,无法复制的问题

    今天在CSDN浏览网页的时候发现有一些文章无法复制文字 查找解决方式 找到一个可行的方式 1 将网页保存到本地 保存为一个单网页 2 使用文本编辑工具打开网页文件 找到以下字段 content views user select none
  • 网络安全之端口扫描

    1 扫描三步曲 一个完整的网络安全扫描分为三个阶段 第一阶段 发现目标主机或网络 端口扫描 第二阶段 发现目标后进一步搜集目标信息 包括操作系统类型 运行的服务以及服务软件的版本等 如果目标是一个网络 还可以进一步发现该网络的拓扑结构 路由
  • java使用aspose-words无损格式转pdf文件

    1 下载aspose wordsjar包 链接 https pan baidu com s 1Dtb hFgYJj2 F Ona8nErQ 提取码 kdrb 2 项目pom xml配置以下代码 执行下载jar包 这个时候肯定是下载不下来的
  • 美团某程序员哀叹:能力很强,却因为不会“向上管理”而惨遭被裁!怎么办?...

    互联网大厂大多有自己的绩效考核机制 比如 361 271 等 美团实行的绩效考核机制就是 271 即20 的人是A类绩效 70 的人是B类绩效 10 的人是C类绩效 那么这个绩效是如何评定的呢 是唯技术论还是有其他因素 评定过程中是否存在不
  • Linux——TCP编程流程

    TCP编程流程 TCP是传输层的一种协议 提供的是面向连接 可靠的 字节流的服务 主机字节序和网络字节序 主机字节序列分为大端字节序和小端字节序 不同的主机采用的字节序列可能不同 不同的芯片 所采用的数值存储方式是不同 大端字节序是指一个整
  • SQL server 导入Excel数据

    SQL server 导入Excel数据 编辑 洪伟富 2018 06 07 第一步 对表格数据的处理 这一列数据中有数字 又有中文 如果不做处理 导入数据库会默认为float 从而导致 公教楼201 等字符全部为null 解决办法 用筛选
  • 从键盘上输入身份证号, 判断出生日期,性别

    从键盘上输入身份证号 判断出生日期 性别 倒数第二位是奇数表示男 偶数代表女 public class IdNumber public static void main String args 1 键盘输入身份证号 Scanner intp
  • qt 导出word中插入图片

    QAxObject selection m word gt querySubObject Selection QVariantList params params append 6 params append 0 selection gt
  • 手把手教YOLO系列算法部署之安卓部署

    前言 首先我的yolov5的版本是v6 1 我的部署方式是将模型先转为tflite然后部署到安卓上 大家一般是使用自己的训练模型权重文件来部署 所以我直接讲述自定义模型的部署检测 链接 https pan baidu com s 1bskq
  • shouldComponentUpdate有什么作用

    shouldComponentUpdate有什么作用 shouldComponentUpdate是生命周期之一 是不常用的一个方法 能影响组件是否重新渲染 在更新阶段 当有了new props或者调用setState 方法 在render方

随机推荐

  • Mathorcup数学建模竞赛第三届-【妈妈杯】B题:关于三维健康评分模型的研究(附带赛题解析&获奖论文)(一)

    赛题描述 由于现代社会的生活节奏加快 生活工作压力增大 拥有一个健康的身体显得尤为重要 健康的标准有很多 但是如何量化这些标准 评价一个人的健康状况是一个比较困难的问题 世界卫生组织给出的健康标准有如下几个 1 精力充沛 能从容不迫地应付日
  • 【react】props的基本使用

    props可以用来组件传值 render里面的this指向Person的实例对象 而实例对象上有一个属性props 可以用他来给组件传值 class Person extends React Component render const n
  • SpringCloud——Gateway和过滤器和跨域问题的解决

    介绍 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目 该项目是基于 Spring 5 0 Spring Boot 2 0 和 Project Reactor 等响应式编程和事件流技术开发的网关 它旨在
  • LeetCode(20):有效的括号

    描述 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 输入 输出 true 输入 输出 true 输入 输出 true 输
  • 从ubuntu18 升级到ubuntu20 墙倒屋塌,重新开始

    升级到20 发现了各种不便 最主要是我的机器就是这个运行水平 不能再往上跟了 运行慢将不可容忍 启动慢 不可容忍 点击icon 有几秒种不响应期 难以容忍 与vmware虚拟机15不能很好兼容 并进一步不能与win7兼容 win7我认为是最
  • 基于线性回归对神经网络的解释以及梯度下降鞍点与局部最优的产生原理

    首先 机器学习的本质是让计算机找到一个函数来解决问题 这种函数非常复杂以至于人类无法直接手写出来 本文参考李宏毅教授视频ML 2021 Spring 神经网络是解决线性不可分问题 你可以引入多条线来分割当然我们也可以引入激活函数 非线性函数
  • 计算机视觉小项目—基于RGB颜色特征的火焰识别

    提出问题 随着计算机视觉及图像处理技术的发展 基于计算机视觉的火焰检测技术逐渐取代了传统的火灾检测 由于火焰最显著静态特质是其颜色 火焰识别算法主要利用视频图像中颜色与亮度的相关信息 所以对火焰颜色的特征提取是火焰识别过程的关键 在有关火焰
  • Spring Cloud Ribbon无法将服务名转换为地址

    试了许多网上说的 都不管用 后来发现是spring cloud starter eureka依赖项的版本问题 将版本降低后正常运行
  • fileclude(文件包含漏洞及php://input、php://filter的使用)

    先介绍一些知识 1 文件包含漏洞 和SQL注入等攻击方式一样 文件包含漏洞也是一种注入型漏洞 其本质就是输入一段用户能够控制的脚本或者代码 并让服务端执行 什么叫包含呢 以PHP为例 我们常常把可重复使用的函数写入到单个文件中 在使用该函数
  • Shell编程学习(一)简单介绍和执行shell脚本的方式

    Shell编程是什么 为什么要学习Shell 首先我们要知道 我们的Java项目一般都是部署到Linux系统上的 这是由于Linux相对于Windows而言呢有一下几点 开源 可以修改定制和再发布 安全性更高 虽然windows有很友好的可
  • [Spring学习]01 Spring简介

    目录 一 Spring介绍 二 Spring 官网介绍 三 Spring框架特征 四 Spring核心技术 一 Spring介绍 Spring是一个分层的轻量级开源J2EE框架 由Rod Johnson创建 Spring是一个开源容器框架
  • 【前端关于JSON.parse解析报错处理方案】

    项目场景 vue的移动端项目 ios 解析返回的json报错 JSON parse解析特殊字符报错的解决办法 问题描述 JSON parse 解析该字符串 则会出现报错 安卓可能并不会 原因分析 对于深度嵌套的JSON字符串 使用 JSON
  • 程序员网页版工具集合

    Overview 本文主要收集一下作为程序员经常会用到的一些小工具网站 crontab表达式 https tool lu crontab struct和json互转 https json2struct mervine net json转义工
  • 接口自动化实现图片上传(selenium/RF)

    最近做自动化碰到一个问题 就是带图片上传的不知道怎么实现自动化 整理了下实现如下 上传图片postman 结果请求如下 上传图片后返回一个图片地址 post请求 body 是form data 而不是json fiddler抓取如下 sel
  • 【数据结构】6.3 二叉搜索树(C++)

    数据结构 6 3 二叉搜索树 目录 一 二叉搜索树的概念 二 二叉搜索树的实现 1 存储结构和实现接口 2 方法的实现 2 1 默认成员函数 2 2 查找find 2 3 插入insert 2 4 删除erase 2 5 中序遍历 一 二叉
  • linux找不到root用户,Linux中root用户找不到JAVA_HOME

    使用DOS比较两个txt文件的差异 将两个文件放入到同一个文件夹下 DOS下提供了FC命令 点击开始 gt 运行 gt 输入cmd 进入DOS下 进入指定目录 输入FC a txt b txt进行比较 下面会显示出之间的差异 lbrack
  • 02.SVN 忽略不需要提交的文件

    我使用的是 TortoiseSVN 每次提交到 svn 上的时候我不想提交 idea 文件夹 不需要列出 服务器也不需要存 因为是编译器的文件 多人维护项目时 总会显示修改 最好的避免类似问题的方法是添加参考文件到该项目的忽略列表 这样就不
  • ApkScan-PKID查壳工具+脱壳(搬运)

    Android APK 查壳工具免费通道 链接 https pan baidu com s 1rDfsEvqQwhUmep1UBLUwSQ 密码 wefd看众多小伙伴需要脱壳工具 现在补上1 Zjdroid github https git
  • 计算机网络(谢希仁-第八版)第五章习题全解

    5 01 试说明运输层在协议栈中的地位和作用 运输层的通信和网络层的通信有什么重要的区别 为什么运输层是必不可少的 地位和作用 从通信和信息处理的角度看 运输层向它上面的应用层提供通信服务 它属于面向通信部分的最高层 同时也是用户功能的最低
  • 线程安全threadsafe的四种策略

    线程之间的 竞争条件 作用于同一个mutable数据上的多个线程 彼此之间存在对该数据的访问竞争并导致interleaving 导致post condition可能被违反 这是不安全的 线程安全 ADT或方法在多线程中要执行正确 一 Con