1.Threadlocal为每个线程都创建了一个局部变量副本,线程和线程之间的局部变量相互隔离,
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
ThreadLocal在保持事务的特性上有独特的优势,例如多个线程链接数据库去操作数据库链接的开启和关闭,线程之间的开启和关闭有可能会相互干扰,此时可以
将conn放入ThreadLocal<Connection> threadlocal中,从而实现线程之间局部变量的有效隔离;
2.示例1:
public class UniqueThreadIdGenerator { private static final AtomicInteger uniqueId = new AtomicInteger(0); private static final ThreadLocal < Integer > uniqueNum = new ThreadLocal < Integer > () { @Override protected Integer initialValue() { return uniqueId.getAndIncrement(); } }; public static int getCurrentThreadId() { return uniqueId.get(); } } // UniqueThreadIdGenerator
3.示例2:
public class SequenceImpl implements Sequence{ private static int number=0; @Override public int getNumber() { numberContainer.set(numberContainer.get()+1); return numberContainer.get(); } private static ThreadLocal<Integer> numberContainer=new ThreadLocal<Integer>(){ @Override protected Integer initialValue() { return 0; } }; public static void main(String[] args) { Sequence sequencea = new SequenceImpl(); ClientThread thread1 = new ClientThread(sequencea); ClientThread thread2 = new ClientThread(sequencea); ClientThread thread3 = new ClientThread(sequencea); thread1.start(); thread2.start(); thread3.start(); } }
4.方法摘要
方法摘要 | |
---|---|
T | get() 返回此线程局部变量的当前线程副本中的值。 |
protected T | initialValue() 返回此线程局部变量的当前线程的“初始值”。 |
void | remove() 移除此线程局部变量当前线程的值。 |
void | set(T value) 将此线程局部变量的当前线程副本中的值设置为指定值。 |