组团学

多线程资源并发

阅读 (356281)

一、概述

ThreadLocal通常用在一个类的成员上

多个线程访问它时,每个线程都有自己的副本,互不干扰!

Spring中把Connection放到了ThreadLocal中!

ThreadLocal是为了解决多个线程对资源的并发访问问题!

这个地方的资源不是共享资源,而是每个线程单独需要的一份资源!

例如:每个事务都需要一个单独的Connection

二、ThreadLocal API

ThreadLocal类只有三个方法:

​ void set(T value):保存值;

​ T get():获取值;

​ void remove():移除值。

三、ThreadLocal的内部是Map

ThreadLocal内部其实是个Map来保存数据。虽然在使用ThreadLocal时只给出了值,没有给出键,其实它内部使用了当前线程做为键。

class MyThreadLocal<T> { private Map<Thread,T> map = new HashMap<Thread,T>(); public void set(T value) { map.put(Thread.currentThread(), value); } public void remove() { map.remove(Thread.currentThread()); } public T get() { return map.get(Thread.currentThread()); } }

四、示例代码

@Test public void fun1() { final ThreadLocal<String> tl = new ThreadLocal<String>(); new Thread() { public void run() { tl.set("内部类存");//a } }.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(tl.get());//取 b }

输出结果

null
需要 登录 才可以提问哦