栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java多线程会造成线程安全问题的原因总结

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java多线程会造成线程安全问题的原因总结

众所周知,多线程会造成线程安全问题,那么多线程为什么会导致线程安全问题呢?

一:首先了解jvm内存的运行时数据区

        1.堆区:存储对象实例(和实例变量),数组等

        2.java虚拟机栈(方法·栈),存放方法声明,局部变量,对象的引用变量,基本数据类型变量等

        3.本地方法栈:存储一些本地方法(native关键字修饰的方法,如hashCode()方法,clone方法,Thread类的star0()方法)

        4.方法区:存储类元数据,常量,静态变量等

        5.程序计数器:记录程序执行的位置,保证cpu切换上下文时,可以从上一次执行的位置开始执行

 二:内存空间的共享情况

        堆区与方法区都是线程共享的,而栈区如方法栈则是线程私有的

三:一个线程的大致组成结构

        1.每一个线程都有自己的线程栈,因此线程与线程之间是相互独立的

        2.一个线程栈里面有自己的程序计数器,方法栈等

        3.方法栈里面又是通过栈帧的形式存储局部变量表,操作数栈,方法出口等

        4.方法中的局部变量则是存储在局部变量表中,数据操作则是在操作数栈中进行

四:多线程引起线程安全原因(实质是造成了读写不一致)

        1.当多个线程操作共享空间中的变量时,就有可能造成线程安全问题(如一个线程更新变量之前,另一个线程读到了旧值并已经更新了,导致该线程再去更新时,更新的值相对来说就不正确了)

        2.结合内存空间的共享性,也就是说,当多个线程同时操作堆区中对象的成员变量,或者方法区中的静态变量时,就会造成线程安全问题

五·:解决线程安全问题的思路

        1.避免线程修改共享空间中变量的值

        2.使用无状态对象,即不共享状态(数据)给多个线程

        3.使用不可变对象,不可修改,就不会存在读写不一致的问题

        4.使用线程特有对象,如TheadLocal

        5.装饰者模式,即使用原子类,原子操作

        6.使用锁,保证线程同步,如Syconized,RetranceLock等

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/282263.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号