众所周知,多线程会造成线程安全问题,那么多线程为什么会导致线程安全问题呢?
一:首先了解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等



