【多线程】三、线程访问变量

相关文章:
【多线程】一、线程状态切换
【多线程】二、线程优先级&守护线程
【多线程】三、线程访问变量
【多线程】四、线程异常抓捕
【多线程】五、线程池
【多线程】六、锁与同步
【多线程】七、阻塞队列
【多线程】八、异步计算结果获取
【多线程】九、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>
每个线程中该变量是独享的,不同线程互不干扰;
ThreadLocal原理

  • Key是虚引用ThreadLocal,该对象销毁后JVM会在get()set()remove()时清理Null Key;
    但仍可能造成内存泄露;
ThreadLocal<SimpleDateFormat> format = ThreadLocal
    .withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));

// 第一次使用会初始化并保存在ThreadLocalMap中
// 之后使用本线程不再初始化,直到线程被销毁
format.get();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章