美文网首页
并发编程 ThreadLocal

并发编程 ThreadLocal

作者: 黄靠谱 | 来源:发表于2019-02-13 18:39 被阅读2次

概述

1个对象被多个线程同时引用且操作(比如作为线程的成员变量),会引发线程安全的问题。但是可以通过给该对象设置ThreadLocal属性,来实现一个对象在不同线程里面,同时操作ThreadLocal属性时,相互隔离的效果。

使用示范

为了解决公用变量不安全的情况,可以通过ThreadLocal来定义某些变量为线程独有的,从而实现线程隔离

例如下面的,对线程私有变量 number进行threadlocal处理,对于公用变量 sharedNumber不做处理,实现线程共享传递参数

public class SeqCount {
        private static ThreadLocal<Integer> number = new ThreadLocal<Integer>(){
            public Integer initialValue() {
                return 0;
            }
        };
        int sharedNumber=0;
        public int nextSeq(){
            number.set(number.get() + 1);

            return number.get();
        }

        public static void main(String[] args){
            SeqCount seqCount = new SeqCount();
            for(int i=0;i<4;i++){
                 new SeqThread(seqCount).start();
            }
        }

        private static class SeqThread extends Thread{
            private SeqCount seqCount;

            SeqThread(SeqCount seqCount){
                this.seqCount = seqCount;
            }

            public void run() {
                for(int i = 0 ; i < 3 ; i++){
                    System.out.println(Thread.currentThread().getName() + " seqCount :" + seqCount.nextSeq());
                    
                    seqCount.sharedNumber++;
                    System.out.println(Thread.currentThread().getName() + " shareNumber :" + seqCount.sharedNumber);
                }
            }
        }
}

ThreadLocal实现线程隔离原理:

每个Thread独立拥有一个ThreadLocalMap,实现线程之间变量的隔壁,然后set、get都是对这个ThreadLocalMap进行操作,其中的key就是申明的ThreadLocal,线性探测法实现的HashMap的数据结构

Thread :每个Thread只有一个独立绑定的ThreadLocalMap,线程独享
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);

ThreadLocalMap:每个ThreadLocalMap拥有一个线性探测的HashMap结构,每个Entry的key就是一个ThreadLocal
    private Entry getEntry(ThreadLocal key) {
            int i = key.threadLocalHashCode & (table.length - 1);
            Entry e = table[i];
            if (e != null && e.get() == key)
                return e;
            else
                return getEntryAfterMiss(key, i, e);
     }

ThreadLocal : 每个Thread可以定义多个ThreadLocal

        private static ThreadLocal<Integer> number = new ThreadLocal<Integer>(){
            public Integer initialValue() {
                return 0;
            }
        };
        
        private static ThreadLocal<Integer> number2 = new ThreadLocal<Integer>(){
            public Integer initialValue() {
                return 1;
            }
        };

相关文章

  • Synchronized与Lock的区别

    其他:并发编程之ThreadLocal、Volatile、Synchronized、Atomic关键字Java并发...

  • 并发编程----ThreadLocal

    一、ThreadLocal 1、作用:使用ThreadLocal来做线程级的缓存,因为各个线程使用ThreadLo...

  • 并发编程-Threadlocal

    上一篇 <<

  • 并发编程 ThreadLocal

    概述 1个对象被多个线程同时引用且操作(比如作为线程的成员变量),会引发线程安全的问题。但是可以通过给该对象设置T...

  • Java线程相关类

    A.ThreadLocal类(泛型支持)-代表线程局部变量 使用ThreadLocal类可以简化多线程编程时的并发...

  • ThreadLocal

    一、ThreadLocal简介 ThreadLocal是在并发编程的多线程环境下用来保证变量线程安全的工具类,其基...

  • Java并发编程 ThreadLocal

    1.ThreadLocal的用途 场景1:每个线程需要一个独享的对象(通常是工具类,典型需要使用的类有Simple...

  • Java并发编程:ThreadLocal

    我之前的一篇博客https://www.jianshu.com/p/423544285f84,介绍了Android...

  • Java并发编程 - ThreadLocal

    ThreadLocal是什么 简单的翻译一下就是 ThreadLocal提供了线程的局部变量,每个线程都可以通过s...

  • Java并发编程-ThreadLocal

    1.注意事项 使用ThreadLocaL时要注意:为每个线程分配一个对象的工作并不是由ThreadLocal来完成...

网友评论

      本文标题:并发编程 ThreadLocal

      本文链接:https://www.haomeiwen.com/subject/btzdeqtx.html