首页 > 编程知识 正文

深入剖析threadlocal,threadlocal线程安全

时间:2023-05-05 13:30:35 阅读:58766 作者:1130

在struts2中,一个用户访问并对应于一个线程。 我们经常使用ActionContext获取会话,获取我们特定线程的数据。 那么,这到底是怎么进行的呢? 通过对struts2ActionContext类的模拟来说明这一点。 这里大致模拟了100个用户在5秒内随机访问系统的情况,以及struts2中Session的使用

代码为以下:

import java.util.HashMap; import java.util.Map; import java.util.Random;/* * * * @ author wjw * @ since 2017-12-7 */publicclassactioncontext { staticthreadlocalactioncontext=netactiont 私有映射,对象上下文; /*** *当前线程的ActionContext对象* @ return */publicstaticaction contextgetcontext () {return actionContext.get ); }/*** *当前线程context * @ paramcontextmap */publicvoidsetcontextmap (映射, Object contextMap ) ({ getContext ().context () ) ) ).context }/*** * set方法* @ param key * @ param value */publl }/*** * get方法* @ param key * @ return */publicobjectget (string key ) ) returncontext.get ) key ); }/* * * * * session * @ param session */publicvoidsetsession (mapstring,Object session ) context.put ) session, Session }/*** *模拟在ActionContext中使用session方法* @return */public MapString,Object getSession () return ) mapstring 对象(contect ) ) }模拟publicstaticvoidmain (字符串[ ] args )/100线程的访问系统,然后执行Session (此操作在Struts2中执行)、 i 100; I ()//线程为系统newthread(newrunnable ) ) { @ override public void run } (/todo auto-generatedmethodstubmapstring, object SSS ion.put (thread.current thread (.getname ) )、'我是' thread.current thread (.getname ) )、'线程的session!' 是。 ); //为特定线程设置特定的ActionContext对象(struts2完成) actioncontexttempactioncontext=newactioncontext ); 动作上下文. set (tempaction context; ActionContext.getContext ().setcontextmap (newhashmapstring,Object ) ); //sesion(struts2完成) ActionContext.getContext ) (.setsession ) session ); //暂时try{thread.sleep(newRandom ).nextint(5) *1000 ); }catch(interruptedexceptione )/todo auto-generatedcatchblocke.print stack trace ); }MapString,objectsession2=action context.get context ().getSession ); system.out.println (thread.currentthread (.getname ) ) (: ) (string ) session2.get ) thread.current thread

)));}}).start();}}}
运行结果:

Thread-4:我是 Thread-4 线程中的session!
Thread-0:我是 Thread-0 线程中的session!
Thread-5:我是 Thread-5 线程中的session!
Thread-1:我是 Thread-1 线程中的session!
Thread-12:我是 Thread-12 线程中的session!
Thread-35:我是 Thread-35 线程中的session!
Thread-36:我是 Thread-36 线程中的session!
Thread-43:我是 Thread-43 线程中的session!
Thread-45:我是 Thread-45 线程中的session!
Thread-50:我是 Thread-50 线程中的session!
Thread-52:我是 Thread-52 线程中的session!
Thread-58:我是 Thread-58 线程中的session!
Thread-60:我是 Thread-60 线程中的session!
Thread-72:我是 Thread-72 线程中的session!
Thread-75:我是 Thread-75 线程中的session!
Thread-84:我是 Thread-84 线程中的session!
Thread-85:我是 Thread-85 线程中的session!
Thread-94:我是 Thread-94 线程中的session!
Thread-97:我是 Thread-97 线程中的session!
Thread-15:我是 Thread-15 线程中的session!
Thread-3:我是 Thread-3 线程中的session!
Thread-21:我是 Thread-21 线程中的session!
Thread-20:我是 Thread-20 线程中的session!
Thread-37:我是 Thread-37 线程中的session!
Thread-29:我是 Thread-29 线程中的session!
Thread-32:我是 Thread-32 线程中的session!
Thread-30:我是 Thread-30 线程中的session!
Thread-28:我是 Thread-28 线程中的session!
Thread-41:我是 Thread-41 线程中的session!
Thread-47:我是 Thread-47 线程中的session!
Thread-46:我是 Thread-46 线程中的session!
Thread-44:我是 Thread-44 线程中的session!
Thread-53:我是 Thread-53 线程中的session!
Thread-48:我是 Thread-48 线程中的session!
Thread-55:我是 Thread-55 线程中的session!
Thread-65:我是 Thread-65 线程中的session!
Thread-66:我是 Thread-66 线程中的session!
Thread-64:我是 Thread-64 线程中的session!
Thread-73:我是 Thread-73 线程中的session!
Thread-78:我是 Thread-78 线程中的session!
Thread-81:我是 Thread-81 线程中的session!
Thread-77:我是 Thread-77 线程中的session!
Thread-92:我是 Thread-92 线程中的session!
Thread-96:我是 Thread-96 线程中的session!
Thread-7:我是 Thread-7 线程中的session!
Thread-2:我是 Thread-2 线程中的session!
Thread-16:我是 Thread-16 线程中的session!
Thread-25:我是 Thread-25 线程中的session!
Thread-18:我是 Thread-18 线程中的session!
Thread-23:我是 Thread-23 线程中的session!
Thread-38:我是 Thread-38 线程中的session!
Thread-42:我是 Thread-42 线程中的session!
Thread-49:我是 Thread-49 线程中的session!
Thread-54:我是 Thread-54 线程中的session!
Thread-56:我是 Thread-56 线程中的session!
Thread-67:我是 Thread-67 线程中的session!
Thread-68:我是 Thread-68 线程中的session!
Thread-79:我是 Thread-79 线程中的session!
Thread-74:我是 Thread-74 线程中的session!
Thread-86:我是 Thread-86 线程中的session!
Thread-89:我是 Thread-89 线程中的session!
Thread-87:我是 Thread-87 线程中的session!
Thread-99:我是 Thread-99 线程中的session!
Thread-8:我是 Thread-8 线程中的session!
Thread-11:我是 Thread-11 线程中的session!
Thread-6:我是 Thread-6 线程中的session!
Thread-27:我是 Thread-27 线程中的session!
Thread-24:我是 Thread-24 线程中的session!
Thread-26:我是 Thread-26 线程中的session!
Thread-40:我是 Thread-40 线程中的session!
Thread-31:我是 Thread-31 线程中的session!
Thread-51:我是 Thread-51 线程中的session!
Thread-62:我是 Thread-62 线程中的session!
Thread-61:我是 Thread-61 线程中的session!
Thread-57:我是 Thread-57 线程中的session!
Thread-59:我是 Thread-59 线程中的session!
Thread-70:我是 Thread-70 线程中的session!
Thread-82:我是 Thread-82 线程中的session!
Thread-80:我是 Thread-80 线程中的session!
Thread-71:我是 Thread-71 线程中的session!
Thread-93:我是 Thread-93 线程中的session!
Thread-98:我是 Thread-98 线程中的session!
Thread-95:我是 Thread-95 线程中的session!
Thread-90:我是 Thread-90 线程中的session!
Thread-10:我是 Thread-10 线程中的session!
Thread-13:我是 Thread-13 线程中的session!
Thread-14:我是 Thread-14 线程中的session!
Thread-9:我是 Thread-9 线程中的session!
Thread-17:我是 Thread-17 线程中的session!
Thread-19:我是 Thread-19 线程中的session!
Thread-22:我是 Thread-22 线程中的session!
Thread-33:我是 Thread-33 线程中的session!
Thread-34:我是 Thread-34 线程中的session!
Thread-39:我是 Thread-39 线程中的session!
Thread-69:我是 Thread-69 线程中的session!
Thread-63:我是 Thread-63 线程中的session!
Thread-83:我是 Thread-83 线程中的session!
Thread-76:我是 Thread-76 线程中的session!
Thread-91:我是 Thread-91 线程中的session!
Thread-88:我是 Thread-88 线程中的session!


分析:

我先为当前线程初始化一个特定ActionContext对象,将其保存到ThreadLocal中,ActionContext对象通过一个map集合保存数据,而session又保存在map集合中。

使用的时候,通过ActionContext静态方法getContext()取得这个特定的ActionContext对象,里面的map集合就保存了当前线程的特定数据。

每一个访问是一个线程,每一个线程有一个特定ActionContext对象,也就有一份特定的map数据。

通过ThreadLocal取得当前线程的特定ActionContext对象。

通过结果,可以看出,各线程数据各归其位,各司其职。

主要细细体会ThreadLocal的用法。



如有错误,欢迎指正

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。