相关文章:
【多线程】一、线程状态切换
【多线程】二、线程优先级&守护线程
【多线程】三、线程访问变量
【多线程】四、线程异常抓捕
【多线程】五、线程池
【多线程】六、锁与同步
【多线程】七、阻塞队列
【多线程】八、异步计算结果获取
【多线程】九、Android异步任务
原子性保障
Java内存模型只保证基本数据类型的读取和常量赋值是原子操作;
volatile修饰符
建立一个内存栅栏,指令重排序不可通过有volatile
变量的语句;
volatile
变量在写入操作后立即刷新主缓存并标记其他缓存无效;
final修饰符
final
变量只有初始化指令完成以后才对线程可见并且不可修改,以保证数据正确性;
原子包
java.util.concurrent.atomic
包通过高级机器指令保证可见性和原子性;
J.U.C原子包的CAS分析具体可参见: https://blog.csdn.net/Fantastic_/article/details/86658468
ThreadLocal<T>
每个线程中该变量是独享的,不同线程互不干扰;
- Key是虚引用ThreadLocal,该对象销毁后JVM会在
get()
、set()
、remove()
时清理Null Key
;
但仍可能造成内存泄露;
ThreadLocal<SimpleDateFormat> format = ThreadLocal
.withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));
// 第一次使用会初始化并保存在ThreadLocalMap中
// 之后使用本线程不再初始化,直到线程被销毁
format.get();