zoukankan      html  css  js  c++  java
  • 018 ThreadLocal实现线程安全

    一 .概述

    在之前我们讨论过线程安全性的问题,我们通过加锁或者使用无锁来保证线程安全.

      当然无锁的性能会变得更好.但是他们的实质的核心都是保证对访问的资源的原子性.

      那我们回忆一下线程安全性问题的发生的条件:

      [1]多线程并发

      [2]共享资源

      [3]对共享资源的非原子性操作

    我们如果将共享资源打破掉,那么我们是否也能保证线程安全呢?

      答案是肯定的,ThreadLoacl就能帮助我们实现线程级别的局部变量.


    二 .ThreadLocal的定义

      [1] get() : 获取值

      [2]set() : 设置值

      [3]remove() : 移除值

      现在我们演示一下ThreadLocal的用法,它定义了线程级别的局部变量.

    public class ThreadLocalTest {
        private final ThreadLocal<Integer> local = new ThreadLocal<Integer>();
    
        public ThreadLocalTest() {
            local.set(0);
        }
    
        public static void main(String[] args) {
            ThreadLocalTest test = new ThreadLocalTest();
            test.local.set(0);
            
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("子线程的值为:" + test.local.get());
                }
    
            }).start();
    
            // 主线程的线程栈中有了local,现在为0
            System.out.println("主线程的local的值为:" + test.local.get());
        }
    
    }

    我们创建了一个含有ThreadLocal的成员变量的对象,然后修改它的值为0.然后从主线程和子线程之中分别打印这个变量,我们发现结果如下:  

    主线程的local的值为:0
    子线程的值为:null

      子线程的值为null,说明子线程中发生了拷贝.子线程和主线程之中的变量并不是共享的.


    三 . 解析

      我们在前面看见了ThreadLocal的基本使用,ThreadLocal可以帮助我们实现线程的变量的存储.

        比如在我们的Servlet之中,本身模型就是多线程模型.

        现在我们可以使用ThreadLocal帮助我们存储数据.

  • 相关阅读:
    贾庆山老师对研究生做学术的几点建议
    normalization flow
    PP: Robust Anomaly Detection for Multivariate Time Series through Stochastic Recurrent Neural Network
    PP: Multi-Horizon Time Series Forecasting with Temporal Attention Learning
    Attention machenism
    PP: Modeling extreme events in time series prediction
    Learn from Niu 2020.1.28
    Big research problems (1)
    PP: UMAP: uniform manifold approximation and projection for dimension reduction
    Dimension reduction
  • 原文地址:https://www.cnblogs.com/trekxu/p/9004728.html
Copyright © 2011-2022 走看看