失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Java并发编程—ThreadLocal用法详解

Java并发编程—ThreadLocal用法详解

时间:2019-08-25 13:52:16

相关推荐

Java并发编程—ThreadLocal用法详解

一、用法

ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量。

ThreadLocal.get: 获取ThreadLocal中当前线程共享变量的值。ThreadLocal.set: 设置ThreadLocal中当前线程共享变量的值。ThreadLocal.remove: 移除ThreadLocal中当前线程共享变量的值。ThreadLocal.initialValue: ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值。

packagecom.coshaho.reflect;publicclassMyThreadLocal{privatestaticfinalThreadLocal<Object> threadLocal =newThreadLocal<Object>(){//ThreadLocal没有被当前线程赋值时或当前线程刚调用remove方法后调用get方法,返回此方法值@OverrideprotectedObject initialValue(){System.out.println("调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!");returnnull;}};publicstaticvoidmain(String[] args){newThread(newMyIntegerTask("IntegerTask1")).start();newThread(newMyStringTask("StringTask1")).start();newThread(newMyIntegerTask("IntegerTask2")).start();newThread(newMyStringTask("StringTask2")).start();}publicstaticclassMyIntegerTaskimplementsRunnable{privateString name;MyIntegerTask(String name){this.name = name;}@Overridepublicvoidrun(){for(inti =0; i <5; i++){// ThreadLocal.get方法获取线程变量if(null== MyThreadLocal.threadLocal.get()){// ThreadLocal.et方法设置线程变量MyThreadLocal.threadLocal.set(0);System.out.println("线程"+ name +": 0");}else{intnum = (Integer)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(num +1);System.out.println("线程"+ name +": "+ MyThreadLocal.threadLocal.get());if(i ==3){MyThreadLocal.threadLocal.remove();}}try{Thread.sleep(1000);}catch(InterruptedException e){e.printStackTrace();}}}}publicstaticclassMyStringTaskimplementsRunnable{privateString name;MyStringTask(String name){this.name = name;}@Overridepublicvoidrun(){for(inti =0; i <5; i++){if(null== MyThreadLocal.threadLocal.get()){MyThreadLocal.threadLocal.set("a");System.out.println("线程"+ name +": a");}else{String str = (String)MyThreadLocal.threadLocal.get();MyThreadLocal.threadLocal.set(str +"a");System.out.println("线程"+ name +": "+ MyThreadLocal.threadLocal.get());}try{Thread.sleep(800);}catch(InterruptedException e){e.printStackTrace();}}}}}

运行结果如下:

如果觉得《Java并发编程—ThreadLocal用法详解》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。