手写自己的ThreadLocal(线程局部变量)

ThreadLocal对象通常用于防止对可变的单实例变量或全局变量进行共享。

package com.lxc.tet;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class MyThreadLocal<T> {
    private Map<Thread,T> map = new ConcurrentHashMap<Thread, T>();

    protected T initialValue(){
        return null;
    }

    public void set(T value){
        map.put(Thread.currentThread(), value);
    }

    public T get(){
        T result = null;
        result = map.get(Thread.currentThread());
        if(result==null && !map.containsKey(Thread.currentThread())){
            result=initialValue();
            set(result);
        }
        return result;
    }

    public void remove(){
        map.remove(Thread.currentThread());
    }
}

原文地址:https://www.cnblogs.com/lxcmyf/p/8390655.html

时间: 2024-10-10 10:36:42

手写自己的ThreadLocal(线程局部变量)的相关文章

ThreadLocal线程局部变量

1.ThreadLocal说明 线程内的共享数据:方法,表达式或者是模块,当他们在同一线程上运行,他们访问同一变量,应该访问的是同一数据.将数据与线程绑定到一起.换句话说,我线程内的事在我的线程内完成,不受其他线程的影响.线程内共享同一数据对象.即在线程内共享,在线程外独立. public Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();threadData.put(Thread.currentthread,

Java中线程局部变量ThreadLocal使用教程及源码分析

在Java多线程编程中有时候会遇见线程本地局部变量ThreadLocal这个类,下面就来讲讲ThreadLocal的使用及源码分析. ThreadLocal 是Thread Local Varial(线程局部变量)的意思,每个线程在使用线程局部变量的时候都会为使用这个线程局部变量的线程提供一个线程局部变量的副本,使得每个线程都可以完全独立地操作这个线程局部变量,而不会与其他线程发生冲突,从线程的角度来看,每个线程都好像独立地拥有了这个线程局部变量.这样,看似每个线程都在并发访问同一个资源(线程局

ThreadLocal为什么称作线程局部变量

一.RTFSC java.lang.ThreadLocal<T>的具体实现 那么到底ThreadLocal类是如何实现这种"为每个线程提供不同的变量拷贝"的呢?先来看一下ThreadLocal的set()方法的源码是如何实现的: [java] view plaincopyprint? /** * Sets the current thread's copy of this thread-local variable * to the specified value.  Mo

图解线程池工作机制,手写线程池?

ThreadPoolExecutor构造函数的各个参数说明 public ThreadPoolExecutor(int corePoolSize,//线程池中核心线程数 int maximumPoolSize,//允许的最大线程数 long keepAliveTime,//线程空闲下来后,存活的时间,这个参数只在> corePoolSize才有用 TimeUnit unit,//存活时间的单位值 BlockingQueue<Runnable> workQueue,//保存任务的阻塞队列

手写线程池 (一)

前言准备 1.jdk线程池的使用:https://www.cnblogs.com/jtfr/p/10187419.html 2.线程池核心:线程的复用. 运行的线程是线程池的核心,被添加的任务需要实现过Runnable接口,主要是保证有run方法.运行时候 对象.run() . 一.手写线程池注意要点 1.线程池需要添加任务,任务是放置在一个队列(FIFO)当中,具体只要保证FIFO,或优先级保证(Map集合)先执行.2.线程池运行,需要一个容器存放创建的线程,可数组或集合,可以自己设计思考.3

透彻理解Spring事务设计思想之手写实现

前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),Durability(持久性).在实际开发中,我们对事务应用最多就是在数据库操作这一环,特别是Spring对数据库事务进行了封装管理.Spring对事务的支持,确实很强大,但是从本质上来讲:事务是否生效取决数据库底层是否支持(比如MySQL的MyISAM引擎就不支持事务,Spring能奈何!),同时一

JAVA并发编程之线程局部变量

共享数据是并发程序最核心的问题之一,对于继承Thread类或者实现Runnable接口的对象来说尤其重要. 如果创建的对象实现了Runnable接口的类的实例,用它作为传入参数,并创建多个线程对象并启动这些线程,那么所有的线程将共享相同的属性.如果在一个线程中改变一个属性,所有线程都会被这个改变影响. 在某种情况下,这个对象的属性不需要被所有线程共享.JAVA提供了一个比较好的机制,即线程局部变量(Thread-Local Variable). 我们写一个简单的DEMO,一是具有刚才提到的问题,

全面理解Handler第一步:理解消息队列,手写消息队列

前言 Handler机制这个话题,算是烂大街的内容.但是为什么偏偏重拿出来"炒一波冷饭"呢?因为自己发现这"冷饭"好像吃的不是很明白.最近在思考几个问题,发现以之前对Handler机制的了解是在过于浅显.什么问题? Handler机制存在的意义是什么?能否用其他方式替换? Looper.loop();是一个死循环,为什么没有阻塞主线程?用什么样的方式解决死循环的问题? 如果透彻的了解Handler,以及线程的知识.是肯定不会有这些疑问的,因为以上问题本身就存在问题.

手写Tomcat服务器

预备知识 编写服务器用到的知识点 1) Socket 编程2) HTML3) HTTP 协议4) 反射5) XML 解析6) 服务器编写 Socket编程 https://www.cnblogs.com/bfcs/p/10790130.html HTML知识 HTML:HyperText Markup Language 超文本标记语言用于描述网页文档的一种标记语言 表单(form):与用户之间进行交互 method:请求方式 get/post get 数据量小,安全性低,默认方式 post 数据