可以将user作为参数在每个方法中进行传递,
缺点:但是这样做会产生代码冗余问题,并且可维护性差。
- 方案2:使用Map
对此进行改进的方案是使用一个Map,在第一个方法中存储信息,后续需要使用直接get()即可,
缺点:如果在单线程环境下可以保证安全,但是在多线程环境下是不可以的。如果使用加锁和ConcurrentHashMap都会产生性能问题。
- 方案3:使用ThreadLocal,实现不同方法间的资源共享
使用 ThreadLocal 可以避免加锁产生的性能问题,也可以避免层层传递参数来实现业务需求,就可以实现不同线程中存储不同信息的要求。
/**
* 演示 ThreadLocal 的用法2:避免参数传递的麻烦
*/
public class ThreadLocalNormalUsage06 {
public static void main(String[] args) {
new Service1().process();
}
}
class Service1 {
public void process() {
User user = new User("鲁毅");
//将User对象存储到 holder 中
UserContextHolder.holder.set(user);
new Service2().process();
}
}
class Service2 {
public void process() {
User user = UserContextHolder.holder.get();
System.out.println("Service2拿到用户名: " user.name);
new Service3().process();
}
}
class Service3 {
public void process() {
User user = UserContextHolder.holder.get();
System.out.println("Service3拿到用户名: " user.name);
}
}
class UserContextHolder {
public static ThreadLocal<User> holder = new ThreadLocal<>();
}
class User {
String name;
public User(String name) {
this.name = name;
}
}
运行结果
3.对ThreadLocal的总结- 让某个需要用到的对象实现线程之间的隔离(每个线程都有自己独立的对象)
- 可以在任何方法中轻松的获取到该对象
- 根据共享对象生成的时机选择使用initialValue方法还是set方法 对象初始化的时机由我们控制的时候使用initialValue 方式 如果对象生成的时机不由我们控制的时候使用 set 方式
- 达到线程安全的目的
- 不需要加锁,执行效率高
- 更加节省内存,节省开销
- 免去传参的繁琐,降低代码耦合度