zoukankan      html  css  js  c++  java
  • 深入理解ThreadLocal

    1、什么是ThreadLocal 
    ThreadLocal 是一个用来为每一个线程保持一份公共变量的值(注意:这个值是和线程绑定的,每个线程持有的值不同)。
    2、ThreadLocal  有什么作用?
     
    主要用来实现多线程并发,一般同步和锁实现的多线程并发是通过时间换空间的形式实现,即多个线程排队等待获取使用某一种资源的权利,而ThreadLocal使用空间换时间的形式,相当于将资源拷贝为多分,每一个线程使用一份,这样多个线程就不会竞争共同的资源,也就解决了并发安全的问题。
     
    3、ThreadLocal  实现原理?
    ThreadLocal 中有一个ThreadLocalMap内部类,Thread类中也有一个ThreadLocalMap属性,实际上对ThreadLocal对象的set/get操作,都是获取当前线程ThreadLocalMap属性并对该属性进行以ThreadLocal对象为键的赋值操作。
     
    Thread类中的ThreadLocalMap属性:

    TreadLocal中的set方法,该方法实际操作的是当前线程的ThreadLocal对象:

     TreadLocal中的get方法,该方法实际操作的是当前线程的ThreadLocal对象:

     4、示例
    ThreadLocalDemo 启动类:
    package com.tspeking.thread;


    public class ThreadLocalDemo {
    public static void main(String[] args) {
    ThreadLocalApply threadLocalApply = new ThreadLocalApply();
    for (int i=0;i<3;i++) {
    new Thread(new ThreadDemo(threadLocalApply)).start();
    }
    }
    }

    ThreadDemo 线程类:
    package com.tspeking.thread;

    public class ThreadDemo implements Runnable{
    private ThreadLocalApply threadLocalApply;
    public ThreadDemo (ThreadLocalApply threadLocalApply) {
    this.threadLocalApply = threadLocalApply;
    }

    @Override
    public void run() {
    threadLocalApply.modifyThreadLocalData();
    }
    }

    ThreadLocalApply ThreadLocal应用类:
    package com.tspeking.thread;

    import java.util.Random;

    public class ThreadLocalApply {
    private ThreadLocal<Integer> demo = new ThreadLocal<Integer>();

    public void modifyThreadLocalData() {
    Random rand = new Random();
    int num = rand.nextInt(100) + 1;
    System.out.println("线程:" + Thread.currentThread().getName() + " rand:" + num);
    demo.set(num);
    System.out.println("线程:" + Thread.currentThread().getName() + " ThreadLocal:" + demo.get());
    }
    }

    运行结果:

    
    
  • 相关阅读:
    php无限极分类
    HDU 1176 免费馅饼 (类似数字三角形的题,很经典,值得仔细理解的dp思维)
    HDU 1158(非常好的锻炼DP思维的题目,非常经典)
    HDU 1165 公式推导题
    HDU 1069 Monkey and Banana(转换成LIS,做法很值得学习)
    HDU 1059(多重背包加二进制优化)
    HDU 1058(打表)
    oracle11g之管理oracle数据库笔记(理论基础知识)
    oracle11g之Oracle体系结构(理论基础知识)
    HDU 1025 LIS二分优化
  • 原文地址:https://www.cnblogs.com/tspeking/p/8656549.html
Copyright © 2011-2022 走看看