ThreadLocal学习Demo

使用ThreadLocal就实现了多线程里的单线程。。ThreadLocal<MyThreadEntity2>  threadLocal = new ThreadLocal<>();  MyThreadEntity2 entity = threadLocal.get();  entity 中存放的是单个线程整个生命周期都可以共享的数据。实现了多个线程时单个线程的数据隔离,每个线程都会有自己的ThreadLocal<T>  对象,存放自己的数据。

package com.thc.utils;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 田海超
 * @E-mail  tianhaichao@sinosoft.com.cn
 * @date 2019年3月19日 上午10:32:37  
 * @Description 单个线程整个声明周期的共享参数
 */
public class ThreadLocalUtils2 {
    // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数)
    private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>();

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建)
     */
    public static MyThreadEntity2 getMyThreadEntity() {
        MyThreadEntity2 entity = threadLocal.get();
        if (entity == null) {
            entity = new MyThreadEntity2();
            threadLocal.set(entity);
        }
        return entity;
    }

    /**
     * @author 田海超
     * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】
     */
    public static void remove() {
        threadLocal.remove();
    }

    /**
     * <li>创建人:xiepan</li>
     * <li>创建时间:2018年5月3日</li>
     * <li>创建目的:【获取当前MyThreadEntity中的Map】</li>
     */
    public static Map<String, String> getThreadMap() {
        Map<String, String> map = getMyThreadEntity().getMap();
        if (map == null) {
            map = new HashMap<>();
            getMyThreadEntity().setMap(map);
        }
        return map;
    }

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @param key
     * @param value
     *            description :创建目的:【当前线程内添加key值】
     */
    public static void put(String key, String value) {
        getThreadMap().put(key, value);
    }

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @param key
     * @return description :创建目的:【当前线程内获取value值】
     */
    public static String get(String key) {
        return getThreadMap().get(key);
    }

    public static void main(String[] args) {
        // 使用时,先往线程实例中放值
        ThreadLocalUtils2.getMyThreadEntity().setPlanId("1033");
        ThreadLocalUtils2.getThreadMap().put("aa", "test");
        // 然后在需要用的时候取值
        ThreadLocalUtils2.getMyThreadEntity().getPlanId();
        ThreadLocalUtils2.getThreadMap().get("aa");
    }

}
class MyThreadEntity{
    private Map<String, String> map;
    private List<?> list;
    private Date date = new Date();
    private String planId;

    public String getPlanId() {
        return planId;
    }

    public void setPlanId(String planId) {
        this.planId = planId;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public List<?> getList() {
        return list;
    }

    public void setList(List<?> list) {
        this.list = list;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

普通demo - ThreadLocalUtils2

package com.sinosig.xb.crms.utils;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 田海超
 * @E-mail  tianhaichao@sinosoft.com.cn
 * @date 2019年3月19日 上午10:32:37  
 * @Description 单个线程整个声明周期的共享参数
 */
public class ThreadLocalUtils3 {
    // MyThreadEntity 这个是自己创建的类,里面可以设置你要存储在该线程中的变量(里面封装了你要放在单个线程整个生命周期都要共享的参数)
    private final static ThreadLocal<MyThreadEntity2> threadLocal = new ThreadLocal<>();

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @return description :通过threadLoal获得我们自己创建的MyThreadEntity的实例(第一次创建)
     */
    public static MyThreadEntity2 getMyThreadEntity() {
        MyThreadEntity2 entity = threadLocal.get();
        if (entity == null) {
            entity = new MyThreadEntity2() {
                private Map<String, String> map;
                private List<?> list;
                private Date date = new Date();
                private String planId;

                public String getPlanId() {
                    return planId;
                }

                public void setPlanId(String planId) {
                    this.planId = planId;
                }

                public Map<String, String> getMap() {
                    return map;
                }

                public void setMap(Map<String, String> map) {
                    this.map = map;
                }

                public List<?> getList() {
                    return list;
                }

                public void setList(List<?> list) {
                    this.list = list;
                }

                public Date getDate() {
                    return date;
                }

                public void setDate(Date date) {
                    this.date = date;
                }
            };
            threadLocal.set(entity);
        }
        return entity;
    }

    /**
     * @author 田海超
     * @date 2019年3月19日 description :创建目的:【清空当前线程内对象】
     */
    public static void remove() {
        threadLocal.remove();
    }

    /**
     * <li>创建人:xiepan</li>
     * <li>创建时间:2018年5月3日</li>
     * <li>创建目的:【获取当前线程ConcurrentHashMap】</li>
     */
    public static Map<String, String> getThreadMap() {
        Map<String, String> map = getMyThreadEntity().getMap();
        if (map == null) {
            map = new HashMap<>();
            getMyThreadEntity().setMap(map);
        }
        return map;
    }

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @param key
     * @param value
     *            description :创建目的:【当前线程内添加key值】
     */
    public static void put(String key, String value) {
        getThreadMap().put(key, value);
    }

    /**
     * @author 田海超
     * @date 2019年3月19日
     * @param key
     * @return description :创建目的:【当前线程内获取value值】
     */
    public static String get(String key) {
        return getThreadMap().get(key);
    }

    public static void main(String[] args) {
        // 使用时,先往线程实例中放值
        ThreadLocalUtils3.getMyThreadEntity().setPlanId("1033");
        ThreadLocalUtils3.getThreadMap().put("aa", "test");
        // 然后在需要用的时候取值
        ThreadLocalUtils3.getMyThreadEntity().getPlanId();
        ThreadLocalUtils3.getThreadMap().get("aa");
    }
}

使用内部类的demo - ThreadLocalUtils3

方法里使用内部类:

ThreadLocalUtils3中getThreadMap方法的注解是错的。真正的ConcurrentHashMap是这样的:

参考博文:https://www.cnblogs.com/ITtangtang/p/3948786.html

参考博文:https://blog.csdn.net/qq_38663729/article/details/80058980

原文地址:https://www.cnblogs.com/tianhaichao/p/10557590.html

时间: 2024-11-09 00:57:23

ThreadLocal学习Demo的相关文章

CABasicAnimation学习Demo 包含了一些经常使用的动画效果

个人写的一些样例: // // ViewController.m // CABasicAnimationDemo // // Created by haotian on 14-6-13. // Copyright (c) 2014年 Baseus. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @syn

CABasicAnimation学习Demo 包括了一些常用的动画效果

个人写的一些例子: // // ViewController.m // CABasicAnimationDemo // // Created by haotian on 14-6-13. // Copyright (c) 2014年 Baseus. All rights reserved. // #import "ViewController.h" @interface ViewController () @end @implementation ViewController @syn

函数指针的应用学习Demo

学习函数指针的应用 ,简单demo #include "stdafx.h" #include "SubClass.h"; //函数指针 typedef int (*Operation)(int a,int b);//定义int 类型函数指针 typedef struct _str{ int result; Operation opt; } STR; //a和b相加 int Add (int a, int b){ return a + b ; } //a和b相乘 in

【mvc学习】给小白们的第一个MVC学习Demo

首先用VS2012以上的VS创建一MVC网站,创建完后在解决方案视图应该有这些文件,我这里项目名称就叫taobao,你们可以自己取 加亮的地方是重点,也就是M-V-C,这时候默认已经可以运行了 大家可以右击,查看源代码,IE上好像叫查看源文件.会发现在已经引入的很多的JS,包括我们要用到的ajax请求的jquery,另外这个bootstrap是个好东西,用来布局网页,可以在PC和手机上使用一套界面,这个放后期我们再学习 <script src="/Scripts/jquery-1.10.2

小程序入门学习Demo

技术:小程序 概述 适合学习小程序的初级开发人员,入门教程 详细 代码下载:http://www.demodashi.com/demo/14956.html 小程序周边美甲美发预约Demo 代码主要写了轮播+导航切换+返回顶部+滑动切换+下拉菜单选择+用户信息获取.页面布局运用flex布局. 看代码时建议打开小程序文档,更好的了解组件或者Api.附上小程序文档链接:https://developers.weixin.qq.com/miniprogram/dev/component/swiper.

ThreadLocal学习记录

ThreadLocal简介 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思.ThreadLocal类接口只有4个方法: void set(T value) 设置当前线程的线程局部变量的值. public T get() 该方法返回当前线程所对应的线程局部变量. public voi

【mvc学习】给小白们的第一个MVC学习Demo之Login篇

上次的Demo,只做了一个查询列表的功能,而且用的是ajax,今天我们来看下原味的mvc的过程,以登录为例,我们依旧是用sqlite数据库 按上次的步骤,我们已经有了一个可以跑的项目,接下来就是添加Login的Action和View以及Modals STEP 1 : 我们需要数据库支持,添加用户表users,字段如下 添加用户数据:insert into users(account,password,name) values('123','123','白茶程序员') STEP 2 :添加Moda

ThreadLocal学习笔记

首先,ThreadLocal是Java语言提供的用于支持线程局部变量的标准实现类.很多时候,ThreadLocal与Synchronized在功能上有一定的共性,都可以用来解决多线程环境下线程安全问题.但是它们之间区别很大:Synchronized是通过同步的方式来管理多个线程对共享对象状态的访问以保证应用程序的线程安全:ThreadLocal是通过消除对象的共享以保证应用程序的线程安全.所以,共享对象是ThreadLocal尽量避免的,如果管理的对象非要共享,ThreadLocal就处理不了.

ThreadLocal学习

ThreadLocal是什么  早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.  ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本.所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应