多线程环境中也可以通过线程封闭实现线程安全。
实现线程封闭的方式有:
- 堆栈封闭:如果可以的话,将共享变量声明在方法中,即声明为局部变量,因为局部变量存放在栈中,线程私有,不会发生线程共享;
- ThreadLocal线程封闭。
java.lang.ThreadLocal类可以实现线程本地存储的功能。每一个线程的Thread对象中都有一个ThreadLocalMap对象,该对象存储了以ThreadLocal.threadLocalHashCode为键,以为本地变量为值的key-value对。
demo
package com.mark.example.threadLocal;
/**
* author:Mark
* date:2018/7/31 8:25
*/
public class ThreadLocalTest {
private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();
public static void add(Long id) {
requestHolder.set(id);//保存数据
}
public static Long getId() {
return requestHolder.get();//取出数据
}
public static void remove() {
requestHolder.remove();//删除数据,如果移出可能会造成内存泄漏
}
}