一个例子理解threadLocal用法

ThreadLocal可以使对象达到线程隔离的目的。话不多说直接上代码:

/**
 * 一个例子理解threadLocal
 *
 * 一个单例模式的类
 */
public class SingleThreadLocalTest {
    private static SingleThreadLocalTest single = new SingleThreadLocalTest();

    private ThreadLocal<String> threadLocal = new ThreadLocal<String>();
    private String str;// 用于threadLocal对比

    /**
     * 单例,保证对象只会被创建一次
     */
    private SingleThreadLocalTest() {

    }

    public static SingleThreadLocalTest getInstance() {
        return single;
    }

    public void setStr(String str) {
        this.threadLocal.set(str);// 设置threadLocal的变量
        this.str = str;// 设置全局变量
    }

    public void printStr() {
        System.out.println("threadLocal:str = " + this.threadLocal.get());
        System.out.println("str = " + str);
    }
}
public class Test {
    public static void main(String[] args) {
        SingleThreadLocalTest.getInstance().setStr("a");
        SingleThreadLocalTest.getInstance().printStr();
        new MyThread().run();
        new MyThread().start();
    }
}

class MyThread extends Thread {
    public void run() {
        SingleThreadLocalTest.getInstance().printStr();
    }
}

打印结果:

threadLocal:str = a

str = a

threadLocal:str = a

str = a

threadLocal:str = null

str = a

Test类中,mail线程设置SingleThreadLocalTest中ThreadLocal的值,然后打印ThreadLocal的值,new MyThread().run()只是执行run()方法,执行的线程还是main线程,所以打印结果一样;new MyThread().start()是新启动一个线程,新的线程中没有设置ThreadLocal的值,所以打印结果为null。所以ThreadLocal达到了线程间隔离的目的。

时间: 2024-10-07 13:11:53

一个例子理解threadLocal用法的相关文章

[PY3]——一个例子理解多线程和daemon

理解 (今天纠结已久,多谢junqi大大帮助理解,一语总结便解心头疑惑)(下面几点总结基本就是我们的对话) 1. 进程就相当于一个机器,多进程就相当于有多个机器在同时运行,多线程是多个任务在同一机器上交替运行,你用一段时间,我用一段时间. 2. 所以进程和线程没有必然联系. 3. 但是不管进程还是线程,一般都是和任务绑定在一起的,任务结束,销毁进程和线程. 4. 如果将进程比喻成一台机器,daemon理解为守护这台机器的东西,daemon守护一旦结束,机器这个进程就down. 5. 可以这样说,

一个例子理解break和continue的区别

结论:break用于终止整个循环,而continue用于终止某一次循环.public class Test { public static void main(String[] args) { for (int i = 0; i < 5; i++) { if (i == 2) // break; continue; System.out.println(i); } }} 结论:break用于终止整个循环,而continue用于终止某一次循环.

一个例子教你理解java回调机制

网上很多例子都写的很难理解,笔者刚开始都已经弄晕菜了. 这个例子,应该是再简单,再简洁不过的了,例子目的是测试某个方法的执行时间.这里就写三个java类,一个接口,一个实现,还有一个用于测试时间的类. 要测试的方法,尽量占用执行的时间,这样明显一些,这里测试循环1000000次,并且打印出来. 测试类: public class MyMethod { public void mytest() { // TODO Auto-generated method stub for (int i = 0;

理解ThreadLocal背后的概念

介绍 我之前在任何场合都没有使用过thread local,因此没有注意到它,直到最近用到它的时候. 前提信息 线程可以理解为一个单独的进程,它有自己的调用栈.在java中每一个线程都有一个调用栈或者说每一个调用栈都有一个线程,即使你不在你的程序中创建线程,线程仍然会在你不知道的情况下运行.最简单的例子就是,当你通过main方法启动一个简单的java程序时,你不在程序里调用new Thread().start(),但是JVM仍然会创建一个main thread 去运行main方法. main线程

【Java】深入理解ThreadLocal

一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包含多个线程的时候,就需要考虑线程安全问题,因为此时线程可能会同时操作同一个资源,当两个或者两个以上线程同时操作一个资源的时候,就会造成冲突.不一致等问题,即线程不安全. 解决线程安全问题,本质上就是解决资源共享问题,一般有以下手段: 1)可重入(不依赖环境):2)互斥(同一时间段只允许一个线程使用)

彻底理解ThreadLocal

学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么.所以我们先来看看ThreadLocal对我们到底有什么用,然后再来看看它的实现原理. ThreadLocal如果单纯从名字上来看像是“本地线程"这么个意思,只能说这个名字起的确实不太好,很容易让人产生误解,ThreadLocalVariable(线程本地变量)应该是个更好的名字.我们先看一下官方对ThreadLocal的描述: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通

深入理解ThreadLocal(转)(2015年06月11日)

注明:转自:http://my.oschina.net/clopopo/blog/149368 学习一个东西首先要知道为什么要引入它,就是我们能用它来干什么.所以我们先来看看ThreadLocal对我们到底有什么用,然后再来看看它的实现原理. ThreadLocal如果单纯从名字上来看像是"本地线程"这么个意思,只能说这个名字起的确实不太好,很容易让人产生误解,ThreadLocalVariable(线程本地变量)应该是个更好的名字.我们先看一下官方对ThreadLocal的描述: 该

Java 并发:深入理解 ThreadLocal

摘要: ThreadLocal 又名线程局部变量,是 Java 中一种较为特殊的线程绑定机制,用于保证变量在不同线程间的隔离性,以方便每个线程处理自己的状态.进一步地,本文以ThreadLocal类的源码为切入点,深入分析了ThreadLocal类的作用原理,并给出应用场景和一般使用步骤. 一. 对 ThreadLocal 的理解 1). ThreadLocal 概述 ThreadLocal 又名 线程局部变量,是 Java 中一种较为特殊的 线程绑定机制,可以为每一个使用该变量的线程都提供一个

理解ThreadLocal类

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