线程安全问题解析

线程内存模型

 线程在工作的时候,如果涉及到需要访问对象的某个成员变量,比如下面的这个类里的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. 多个线程所操作的方法里,必须有对成员变量的修改

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:160. 相交链表

一、题目 原题链接:160. 相交链表 - 力扣(LeetCode) 函数原型: struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) 二、思路 判断两个链表是否相交,只要判断两个链表是否有相同的…

图数据库Neo4j详解

文章目录 第一章 图和Neo4j1.1 图数据库概念1.1.1 图论起源1.1.2 节点-关系及图1.1.3 图数据库1.1.4 图数据库分类1.1.4 图数据库应用场景1.1.5 与关系型数据库对比1.1.6 图数据库优势 1.2 Neo4j介绍1.2.1 Neo4j是什么1.2.2 Neo4j特点1.2.3 Neo4j的优势1.2.4 Neo4j的限制1.2.5 …

揭秘系列: Goroutine调度器

现在不要担心理解上面的图片,因为我们将从非常基础的知识开始。 Goroutines分布在线程中,由Goroutine调度器在幕后处理。根据我们之前的讨论,我们知道一些关于Goroutines的事情: •从原始执行速度来看,Goroutines不一定…

Unity中全局光照GI的总结

文章目录 前言一、在编写Shader时,有一些隐蔽的Bug不会直接报错,我们需要编译一下让它显示出来,方便修改我们选择我们的Shader,点击编译并且展示编译后的Shader后的内容,隐蔽的Bug就会暴露出来了。 二、我们大概回顾一…

智慧畜牧小程序开发流程

本文将详细介绍智慧畜牧小程序的开发流程,包括需求分析、设计、开发、测试和上线等环节。同时,将深入思考智慧畜牧小程序的发展趋势和未来挑战,为读者提供有深度的思考和逻辑性的分析。 一、需求分析 1.明确目标用户:首先…

Bond配置文件配置

1、选择2个自己需要的网口,查看有哪些网口 [roothostname ~]# ifconfig -a [roothostname ~]#systemctl disable NetworkManager 开机不启动图形化网络服务 2、编辑网口的配置文件 [roothostname ~]# cd /etc/sysconfig/network-scripts [roothostname n…

实操创建属于自己的亚马逊云科技VPS服务:Amazon Lightsail

本文主要讲述如何独立创建自己的亚马逊云科技VPS服务,希望此文能帮助你对亚马逊云科技VPS服务也就是Amazon Lightsail,有个新的认识,对所使用的VPS有所帮助。 Amazon Lightsail是一款无论云计算的新手还是专家,都可通过其快速启动…

Sagemaker基础操作指南

简介 Amazon SageMaker是亚马逊AWS提供的一项托管式机器学习服务,旨在简化和加速机器学习开发的整个生命周期。它为机器学习工程师和数据科学家提供了一套完整的工具和功能,用于构建、训练、调优和部署机器学习模型。本文将会通过一个简单的例子&#x…

Conda executable is not found 三种问题解决

如果在PyCharm中配置Python解释器时显示“conda executable is not found”错误消息,这意味着PyCharm无法找到您的Conda可执行文件。您可以按照以下步骤解决此问题: 1.方法一 确认Conda已正确安装。请确保您已经正确安装了Anaconda或Miniconda&#xff…

演示文稿制作软件 Deckset mac中文版介绍

Deckset mac是一款Mac上的演示文稿制作软件,它可以让你使用Markdown语言快速地创建演示文稿。与传统的演示文稿制作软件相比,Deckset采用了全新的设计理念,旨在让用户更加专注于内容的创作,而不是花费过多的时间在排版和设计上。 …

vivo 数据库降本实践:探索成本效益最优的数据库解决方案

vivo 自 2022 年开始调研、测试 OceanBase 至今,现已上线 17 个业务系统,涵盖日志类、分析类、交易类业务,实现了总资源节省 80%,开发、运维工作大幅简化。vivo 体系与流程 IT 部门数据库高级工程师廖光明在本文中,详细…

Antd G6实现自定义工具栏

在使用g6实现知识图谱可视化中,产品经理提出了有关图谱操作的不少功能,需要放置在工具栏中,其中有些功能不在g6自带的功能里,且工具栏样式、交互效果也和官方自定义工具栏不同。那我们怎么去实现呢? g6官方的工具栏案例…

香港和美国节点服务器的测试IP哪里有?

在选择服务器时,我们通常需要进行一些测试来评估其性能和稳定性。当然,这其中一个重要的测试指标就是服务器的 IP 地址。通过测试 IP 地址,我们可以了解到服务器所在地区以及网络连接质量等信息。作为香港及亚太数据中心领先服务商恒创科技&a…

解决Python并发访问共享资源引起的竞态条件、死锁、饥饿问题的策略

目录 一、概述 二、竞态条件 三、死锁 四、饥饿 五、总结 一、概述 在Python中,多线程和多进程可以有效地提高程序的并发性能。然而,当多个线程或进程需要访问共享资源时,可能会引发竞态条件、死锁和饥饿等问题。这些问题可能会导致程序…

敏捷战略实施方法-资深组织发展专家实践秘笈

要怎样才能生成敏捷战略呢?作者基于多年的组织发展实践,总结出如下公式:敏捷战略 战略共创 迭代进化 即要得到一个好的敏捷战略,首先要做好战略共创,并在战略实施过程中对战略进行持续迭代,两者不可偏废…

机器学习——奇异值分解案例(图片压缩-代码简洁版)

本想大迈步进入前馈神经网络 但是…唉…瞅了几眼,头晕 然后想到之前梳理的奇异值分解、主成分分析、CBOW都没有实战 如果没有实际操作,会有一种浮在云端的虚无感 但是如果要实际操作,我又不想直接调用库包 可是…如果不直接调包,感…

一种优雅的调用第三方接口的思路及实现

之前的项目调用第三方接口时,往往用HttpUtils类似的静态方法调用。比较丑,不通用。如下,这是截取项目中某人调用的一段代码,非常不雅: 经改进后,采用了动态代理技术来实现,效果如下&#xff1a…

RabbitMQ的 五种工作模型

RabbitMQ 其实一共有六种工作模式: 简单模式(Simple)、工作队列模式(Work Queue)、 发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topi…

网络安全-黑客技术-小白学习

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

VScode + opencv(cmake编译) + c++ + win配置教程

1、下载opencv 2、下载CMake 3、下载MinGW 放到一个文件夹中 并解压另外两个文件 4、cmake编译opencv 新建文件夹mingw-build 双击cmake-gui 程序会开始自动生成Makefiles等文件配置,需要耐心等待一段时间。 简单总结下:finish->configuring …