ThreadLocal变量-Java

ThreadLocal介绍:

  1. ThreadLLocal变量是为了对象线程安全。是synchronization的另一种选择。
  2. 每个线程都会有ThreadLocal变量的副本,所以能够提供线程安全。
  3. 一个线程可以全局访问ThreadLocal变量,表示一个线程中的任何方法都可以访问该变量
  4. ThreadLocal变量对于一个线程来说是本地,表示一个线程不能访问、修改另一个线程的ThreadLocal变量。

ThreadLocal简单语法:

  1. 创建变量
    private static final ThreadLocal threadLocalVar = new ThreadLocal();

  2. 设置变量
    threadLocalVar.set(“this is a thread local variable”);

  3. 获取变量值
    threadLocalVar.get();

ThreadLocal场景:

例如,当客户请求服务时,关联该客户的服务线程存储一个userID或者TransactionID来表示该用户。
代码如下:

package com.fengfengzai.example.thread;

import java.util.concurrent.atomic.AtomicInteger;

public class ThreadLocalExample {

    public static void main(String[] args) {

        MyThread myThread = new MyThread();
        Thread t1 = new Thread(myThread, "t1");
        Thread t2 = new Thread(myThread, "t2");
        Thread t3 = new Thread(myThread, "t3");

        t1.start();
        t2.start();
        t3.start();

    }
}


class MyThread implements Runnable {

    @Override
    public void run() {
        System.out.println("Thread: " + ThreadID.get());
    }
}


class ThreadID {

    private static AtomicInteger atomicInteger = new AtomicInteger();

    private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {

        @Override
        protected Integer initialValue() {
            return atomicInteger.incrementAndGet();
        }
    };

    protected static Integer get() {
        return threadLocal.get();
    }
}

输出如下:
Thread: 1
Thread: 3
Thread: 2

*每次输出结果不同,但是都是输出不同的数值

另外一些使用场景是:
1、使用ThreadLocal来代替synchronization,例如SimpleDateFormat并不是线程安全的,可以使用ThreadLocal为每个线程初始化一个SimpleDateFormat。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值