线程安全问题解析

news2025/1/12 0:53:06

线程内存模型

 线程在工作的时候,如果涉及到需要访问对象的某个成员变量,比如下面的这个类里的amount 属性:

class Goods {

    private int amount;

    // balabala.....

}

线程在运行期间,首先把这个属性从主内存里load进自己的工作内存,然后对这个变量做修改,改完之后save 到主内存里,这个就是线程的线程模型。另一方面,我们所说的线程的原子性,也是这么一个过程,也就是说如果线程在从 load ——> save 到save 这个过程没有受到其他线程的影响,那么就可以认为这个是原子性的,假如在这个过程中有其他线程修改了 amount 的值,那么上一个线程的过程就被打破了,该线程的原子性就被破坏了,举个例子

如果把这个amount 设置为 volatile 的话,当一个线程修改了这个amount 之后,其他线程立即可见,就会有如下的场景:

线程1:load——>  修改 ————————>save

线程2:load——————> 修改————> save

这时候线程2 修改的数据在save到主内存之前,线程1是可见的,也就是说线程1的修改被线程2覆盖掉了,就破坏了线程1的原子性

线程安全性

要理解线程安全性,首先要搞明白几个东东:

1. 对象

2. 线程

3. 共享变量(或者叫类成员变量)

4. 同步或者锁

5. 线程执行方法的过程

线程是可以在任何地方创建的,它就是一个工具,用来执行代码的工具,创建线程和我们的类,对象等没有任何关系,理解的时候可以把线程和我们的代码隔离开来,如下:

线程虽然是由我们的代码创建出来的,但是线程本质上和我们代码没有关系,线程是操作系统层面的东西

多线程问题的根本原因是由于多个线程同时操作了同一个对象的成员变量,而且这个变量没有做同步处理,这就会有多线程问题,所以如果一个对象没有成员变量,那么就不会有多线程问题,因为如果一个对象只有方法的话,那么方法是在线程自己的内存空间执行的(线程内存里有栈帧,就是用来执行方法),所以在方法内所产生的对象都是存储在线程自己的内存空间的,不存在线程安全问题

所以总结下多线程问题的必要条件:

1. 多个线程同时操作一个对象(或者操作同一个静态方法),如果每个线程都操作的是不同的对象,则不存在线程安全问题,因为每个对象都有自己的内存空间,线程操作对象的数据都是存在各自对象的内存空间里,不存在数据共享

2. 多个线程所操作的方法里,必须有对成员变量的修改

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

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

相关文章

定义无向加权图,并使用Pytorch_geometric实现图卷积

首先定义无向边并定义边的权重 import torch import torch.nn as nn from torch_geometric.nn import GCNConv import torch.nn.functional as F from torch_geometric.data import Dataa torch.LongTensor([0, 0, 1, 1, 2, 2, 3, 4]) b torch.LongTensor([0, 1, 2, 3, 1, 5,…

QT项目|时间服务器架构

目录 一、 创建新UI界面的标题 二、 创建服务器运行图标 2.1 查找图标,并截图 2.2 加入QT资源库 三、编辑UI界面 3.1 根据要求,绘制UI界面 3.2 对控件进行命名 3.3 加入Group Box进行美化 四、 按钮操作设置 4.1 QT加入网络 4.2 转到槽&…

springboot定时服务

上一篇文章【修改定时时间,定时任务及时生效】 是定时任务与功能项目共用一个; 我目前所在公司的定时服务是专门有一个项目处理,然后定时查询库里面的定时信息配置。 话不多说,上程序 数据库设置 create table SCHEDULER_JOB…

mac-Yarn安装成功但提示 command not found 解决方案

文章目录 查看yarn配置卸载yarn删除注册表清除yarn缓存npm安装yarn安装完成后yarn -v提示command not found,故选择使用命令重新安装命令安装yarn然后打开.bash_profile文件:参考:https://www.python100.com/html/119013.html 最近遇到项目使…

软件测试下的AI之路(3)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

cmd打开idea

当我们用idea打开一个项目的时候,有时候这个项目目录是有的,但是用idea的open却找不到,有时候我要重新关闭窗口,再open好多次才有 于是我现在使用命令打开,先把idea安装路径的bin目录放在path里面 然后cd到项目路径&…

【ubuntu 快速熟悉】

ubuntu 快速熟悉 2.ubuntu桌面管理器3.ubuntu常见文件夹说明4.ubuntu任务管理器4.1 gnome桌面的任务管理器4.2 实时监控GPU4.3 top 命令 5.ubuntu必备命令5.1 .deb文件5.2 查找命令5.2.1 find文件搜索5.2.2 which查找可执行文件的路径5.2.3 which的进阶,whereis5.2.…

linux:使用nc(netcat)命令进行端口检测,并使用Docker管理容器

需求: 循环检测IP:端口是否能正常连接,能连接则关闭docker服务,不能连接则开启docker服务实现:  &esmp;通过创建linux可执行shell脚本文件,再设置crontab调度执行实现上述需求。详细步骤如下: 创建sh…

ChatGPT Plus的Vision升级是一个改变游戏规则的创举

内容来源:0xluffy_eth ChatGPT Plus的Vision升级是一个改变游戏规则的创举! 现在每个用户都可以以每月20美元的价格雇用自己的个人数字助理实习生,具备VISION! 以下是10个惊人的例子() 1, 我…

Java时间工具类:ZTDateTimeUtil

目录 1.返回指定格式的当前时间,Date-->FormatString,Date类型转Strig 2.返回固定格式的Date类型时间Date---》ToString---》ToDate,Date类型格式化成Date 3.字符串转日期 String格式化成String 4.两时间关系判断构件 5.Date转换为字符串:Date格式化成String 6.String类…

创建第一个Go的程序Hello Kitty

上一篇,我们已经搭建好了开发要用的基础环境:Go开发基础环境搭建, 今天我们要开始用GoLand实操关于Go的代码开发。 创建工程 File > New > Project 其中 game为项目名称 在项目目录下会自动生成一个文件:go.mod ,模块是相关Go包的集合。modules是源代码交换…

Exploration by random network distillation论文笔记

Exploration by Random Network Distillation (2018) 随机网络蒸馏探索 0、问题 这篇文章提出的随机网络蒸馏方法与Curiosity-driven Exploration by Self-supervised Prediction中提出的好奇心机制的区别? 猜想:本文是基于随机网络蒸馏提出的intrin…

在GORM中使用并发

一个全面的指南,如何安全地使用GORM和Goroutines进行并发数据处理 效率是现代应用程序开发的基石,而并发在实现效率方面发挥着重要作用。GORM,这个强大的Go对象关系映射库,使开发人员能够通过Goroutines embrace并行性。在本指南…

Docker进阶——再次认识docker的概念 Docker的结构 Docker镜像结构 镜像的构建方式

前言 在微服务大量应用的互联网时代,经常能看到docker的身影。作为docker的爱好者(在服务器安装MySQL,Redis。。。我用的都是docker),我也会持续深入学习和认识docker。 本篇博客再次介绍docker的基本概念&#xff0…

在ubuntu sudo apt-get update 更新报错

sudo apt-get update 更新报错 解决办法: 用你自己的key 根据上图自己找 sudo gpg --keyserver keyserver.ubuntu.com --recv-keys **********运行完成有一个ok 见下图 运行命令,中间的还是上面的key复制下来即可 sudo gpg --export --armor **********…

DAY50 309.最佳买卖股票时机含冷冻期 + 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目要求:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不…

补偿 FIR 滤波器引入的延迟

补偿 FIR 滤波器引入的延迟 对信号进行滤波会引入延迟。这意味着相对于输入,输出信号在时间上有所偏移。此示例向您说明如何抵消这种影响。 有限冲激响应滤波器经常将所有频率分量延迟相同的时间量。这样,我们就很容易通过对信号进行时移处理来针对延迟…

动态规划学习——多状态dp(打家劫舍问题)

一,打家劫舍I 题目: 一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自…

【科研绘图】MacOS上的LaTeX公式插入工具——LaTeXiT

在Mac上经常用OmniGraffle绘图,但是有个致命缺点是没办法插入LaTeX公式,很头疼。之前有尝试用Pages文稿插入公式,但是调字体和颜色很麻烦。并且,PPT中的公式插入感觉也不太好看。 偶然机会了解到了LaTeXiT这个工具,可…

11月份 四川汽车托运报价已经上线

中国人不骗中国人!! 国庆小长假的高峰期过后 放假综合症的你还没痊愈吧 今天给大家整理了9条最新线路 广州到四川的托运单价便宜到💥 核算下来不过几毛钱💰 相比起自驾的漫长和疲惫🚗 托运不得不说真的很省事 - 赠送保险 很多客户第一次运车 …