引用类型导致的线程安全问题
一、问题
多线程操作共享变量,共享变量为引用类型,出现引用类型值出现改变的问题。
二、基本数据类型和引用数据类型在内存中的对比
对比 |
基本数据类型 | 引用数据类型 |
---|---|---|
存储地址 | 在栈中进行分配 | 在堆中进行分配,堆的读写速度远不及栈 |
指针指向 | 变量名指向具体的数值 | 变量名指向存数据对象的内存地址,即变量名指向hash值 |
初始化 | 变量在声明之后java就会立刻分配给他内存空间 | 它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址 |
复制 | 基本类型之间的赋值是创建新的拷贝 | 对象之间的赋值只是传递引用 |
判断相等 | ==是在比较值 | ==是在比较两个引用是否相同,需要自己实现equals()方法 |
销毁 | 基本类型变量创建和销毁很快 | 类对象需要JVM去销毁 |
三、 解决思路
1、引用类型保证线程安全的常用方法
- 尽量不要跨线程访问共享变量,因为多线程操作同一个变量,可能因为线程不可见出现线程安全问题,或者出现共享变量的改变导致业务逻辑出现问题。
- 将共享变量定为final类型的,如果对于多个线程需要保证共享变量不会随着某个线程的改变导致其他线程接收参数出现改变可以添加final。
- 将共享变量的操作加上同步。
- 引用类型的某个值可以使用CAS进行判断。
2、基本类型保证线程安全的常用方法
查看 CAS机制以及AtomicXXX和Unsafe的实现。
3、容器保证线程安全的常用方法
查看 java安全性容器。
引用类型导致的线程安全问题相关推荐
- java常见错误示例——JUC并发工具类库导致的线程安全问题
摘要 通常提到线程安全问题等就有可能听到关线程安全和并发工具的一些片面的观点和结论.比如"把 HashMap 改为 ConcurrentHashMap,就可以解决并发问题了呀"&q ...
- Java多线程学习五:哪些场景需要额外注意线程安全问题及多线程也可能引起性能问题
访问共享变量或资源 第一种场景是访问共享变量或共享资源的时候,典型的场景有访问共享对象的属性,访问 static 静态变量,访问共享的缓存,等等.因为这些信息不仅会被一个线程访问到,还有可能被多个线程 ...
- Java多线程学习四:共有哪 3 类线程安全问题
我们在实际开发中经常会遇到线程不安全的情况,那么一共有哪 3 种典型的线程安全问题呢? 运行结果错误: 发布和初始化导致线程安全问题: 活跃性问题. 运行结果错误 来看多线程同时操作一个变量导致的运行 ...
- struts2学习笔记--线程安全问题小结
在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样 ...
- 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题
一.实现多线程 1.1 了解多线程 多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,从而提升性能. 1.2 并发与并行 并行是指同 ...
- servlet单实例多线程 ---线程安全问题是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的。(所有建议不要在servlet中定义成员变
Servlet 单例多线程 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...
- 线程安全问题产生的原因
//前提 1:多个线程操作同一个数据 2:操作共享数据的线程代码有多条 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算 就会导致线程安全问题的产生. 解决思路: 就是将多线程操作共享 ...
- java dateformat 线程安全_SimpleDateFormat线程安全问题深入解析
背景 众所周知,Java中的SimpleDateFormat不是线程安全的,在多线程下会出现意想不到的问题.本文将解析SimpleDateFormat线程不安全的具体原因,从而加深对线程安全的理解. ...
- Java非线程安全问题的解决方法
非线程安全.非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改.值不同步的情况,进而影响程序的执行流程.下面用一个示例来学习一下如何解决非线程安全问题. 本案例模拟了多线 ...
最新文章
- linux 系统 安装 nginx 服务
- 新款苹果手机_苹果宣布新系统 性能依旧“压制quot;安卓
- 命令行刷新Magento索引管理
- 神经网络与深度学习——TensorFlow2.0实战(笔记)(三)(python运算符和表达式)
- LeetCode 第 23 场双周赛(970/2044,前47.5%)
- css-四种css导入方式
- python手机端给电脑端发送数据_期货交易软件有哪些比较好用?分手机端和电脑端...
- ps制作20种特效文字_如何使用AE制作文字破碎动画?制作ae破碎文字特效教程分享...
- hpux 11.11 连接HDS 存储,采用HDLM管理带来的麻烦,需重启。
- Jquery实现轮播图效果(fadeIn()和fadeOut()方法的应用)
- 全国二级c语言公共基础知识,全国计算机二级C语言及公共基础知识复习资料
- B2B跨境电子商务平台综合服务解决方案
- 半导体物理学习札记1
- 百度地图根据缩放级别显示不同的marker点和窗口内容
- 面试题:Redis 40 道
- 还在为满意的渐变色发愁吗?10+个网站帮你解决烦恼
- sl4a最新版下载_SL4A Script Launcherapp
- 第三章:绘制统计图形
- 人的一生要疯狂一次,无论是为一个人,一段情,或一个梦想
- 自玩树莓派记录-关于树莓派LCD3.5英寸屏幕使用及raspios(raspbian)-lite简单GUI服务搭建记录