安全问题
进程内线程共享内存——堆,类成员变量存在堆内存中 堆内存中的数据可以被任意线程访问,因此数据存在被意外修改的风险。
方案
位置隔离
单一线程共享内存——栈,局部变量存在栈内存中
数据隔离
ThreadLocal:把堆内存的数据复制成N份,每个线程各复制一份,每个线程只能操作自己复制的那份数据;—— 线程本地 数据依旧还是保存在堆内存中,类比共享单车,位于公共区域,但是使用时人手一辆
只读
final修饰
悲观锁
在堆内存数据上加锁,操作时必须先获取锁,操作完后释放锁 适用于线程数量较多的场景:因为获取锁和释放锁也是需要花费一定代价的,当线程数量少的时候,频繁获取锁也是一种浪费
乐观锁
在并发很小的情况下,数据被修改的概率较小,此时适用 乐观锁 CAS:假设数据不会被修改,如果数据被修改了则重新开始 ABA:给数据加版本号,只要数据修改,版本号+1 —— 用于判断数据是否被修改过