当前位置: 首页 > 后端技术 > Java

ThreadLocal_1

时间:2023-04-01 16:03:06 Java

的使用线程在运行时会遇到两种场景:每个线程需要一个独占对象,需要一个全局对象来保存线程中的参数,并在不同方法之间传递。在场景一中,ThreadLocal用于保存对象。该对象只对当前线程可见,对其他线程不可见,因此是线程安全的。公共类MessageHolder{privateListmessages=Lists.newArrayList();@SuppressWarnings({"rawtypes","unchecked"})privatestaticfinalThreadLocalholder=newThreadLocal(){@OverrideprotectedObjectinitialValue(){returnnewMessageHolder();}};publicstaticvoidadd(Messagemessage){holder.get().add(message);}publicstaticListclear(){ArrayListlist=列表。newArrayList(holder.get().messages);holder.remove();返回列表;}}如上图,在新建ThreadLocal对象时,重写initialValue方法,持有MessageHolder对象,只对当前线程有效。场景2中,可以直接使用YOURThreadLocal().set(YOUR_OBJECT)设置持有对象,方便同线程中的其他方法获取和使用YOURThreadLocal().get()。两种场景的区别在于,在场景一中,持有的对象是由开发者控制的,因此可以在初始化时设置,重写initialValue();场景2,由用户控制,业务运行时才知道持有。什么对象,所以使用set(YOUR_OBJECT)方法。可以看出ThreadLocal有四个好处:线程安全避免使用锁或线程安全类提高效率避免创建过多的工具对象避免繁琐的参数传递