ThreadLocal

本文详细介绍了ThreadLocal的作用原理及其实现方式,并提供了一个简单的示例来展示如何使用ThreadLocal来解决多线程并发的安全性问题。

作用

ThreadLocal通过将对象封闭在线程之中,来解决多线程并发的安全性问题。每一个线程均有一个对象,线程只能访问自己的对象,这样,就不存在多线程并发处理单个对象的问题,也就解决了多线程并发的安全性问题。

原理

 

  1. Thread对象中有threadLocalMap属性,该属性为map,保存线程所有的ThreadLocal的值。map的键为ThreadLocal本身,值为ThreadLocal对应的本线程的值。
  2. 在使用ThreadLocal时,ThreadLocal会先找到当前线程对象,然后操作当前线程对象的threadLocalMap。
 1     public T get() {
 2         Thread t = Thread.currentThread();
 3         ThreadLocalMap map = getMap(t);
 4         if (map != null) {
 5             ThreadLocalMap.Entry e = map.getEntry(this);
 6             if (e != null) {
 7                 @SuppressWarnings("unchecked")
 8                 T result = (T)e.value;
 9                 return result;
10             }
11         }
12         return setInitialValue();
13     }
14 
15     
16     ThreadLocalMap getMap(Thread t) {
17         return t.threadLocals;
18     }
1     public void set(T value) {
2         Thread t = Thread.currentThread();
3         ThreadLocalMap map = getMap(t);
4         if (map != null)
5             map.set(this, value);
6         else
7             createMap(t, value);
8     }

使用

 1 public class ThreadLocalTest {
 2     private static final ThreadLocal<Integer> count = new ThreadLocal<Integer>() {
 3         @Override
 4         protected Integer initialValue() {
 5             return 0;
 6         }
 7     };
 8 
 9     private static class CountThread extends Thread {
10         @Override
11         public void run() {
12             for (int i = 0;i < 50;i++) {
13                 count.set(count.get() + 1);
14             }
15             System.out.println(count.get());
16         }
17     }
18 
19     public static void main(String[] args) {
20         for (int i=0;i < 100;i++) {
21             new CountThread().start();
22         }
23     }
24 }

 

转载于:https://www.cnblogs.com/qhdxqxx/p/8876330.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值