请选择 进入手机版 | 继续访问电脑版

ThreadLocal 的使用

[复制链接]
奇奇女 发表于 2020-12-31 20:24:38 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
ThreadLocal 的概念

ThreadLocal 的作用,它可以办理多线程的数据安全问题。
ThreadLocal 它可以给当前线程关联一个数据(可以是平凡变量,可以是对象,也可以是数组,聚集)
ThreadLocal 的特点:



  • 1、ThreadLocal 可以为当前线程关联一个数据。(它可以像 Map 一样存取数据,key 为当前线程)
  • 2、每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个 ThreadLocal 对象实例。
  • 3、每个 ThreadLocal 对象实例界说的时候,一般都是 static 范例
  • 4、ThreadLocal 中保存数据,在线程销毁后。会由 JVM 虚拟自动释放。
代码举例:
ThreadLocalTest:
  1. public class ThreadLocalTest {//    public static Map data = new Hashtable();    public static ThreadLocal threadLocal = new ThreadLocal();    public static Random random = new Random();    public static class Task implements Runnable{        @Override        public void run() {            // 在Run方法中,随机生成一个变量(线程要关联的数据),然后以当前线程名为key保存到map中            int i = random.nextInt(1000);//            String name = Thread.currentThread().getName();//            System.out.println("线程["+name+"]生成的随机数是:" + i);//            data.put(name,i);            String name = Thread.currentThread().getName();            System.out.println("在线程[" +name + "]保存的值是:" + i );            threadLocal.set(i);            try {                Thread.sleep(3000);            } catch (InterruptedException e) {                e.printStackTrace();            }            new OrderService().createOrder();//调用OrderService里的createOrder()方法            // 在Run方法竣事之前,以当前线程名获取出数据并打印。查察是否可以取出操纵//            Object o = data.get(name);            Object o = threadLocal.get();//            System.out.println("在线程["+name+"]快竣事时取出关联的数据是:" + o);            System.out.println("在线程["+name+"]快竣事时取出关联的数据是:" + o);        }    }    public static void main(String[] args) {        for (int i = 0; i < 3; i++) {            new Thread(new Task()).start();        }    }}
复制代码
OrderService
  1. public class OrderService {    public void createOrder(){        String name = Thread.currentThread().getName();        System.out.println("OrderService 当前线程[" + name + "]中保存的数据是:" + ThreadLocalTest.threadLocal.get());        new OrderDao().saveOrder();    }}
复制代码
OrderDao:
  1. public class OrderDao {    public void saveOrder(){        String name = Thread.currentThread().getName();        System.out.println("OrderDao 当前线程[" + name + "]中保存的数据是:" + ThreadLocalTest.threadLocal.get());    }}
复制代码

结论:同一个线程的i是相同的,每一个 ThreadLocal 对象,只能为当前线程关联一个数据

来源:https://blog.csdn.net/qq_45554909/article/details/111876933
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )