4、线程范围内的数据共享之ThreadLocal
生活随笔
收集整理的這篇文章主要介紹了
4、线程范围内的数据共享之ThreadLocal
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 /**
2 * 線程范圍類的數(shù)據(jù)共享
3 * 核心:ThreadLocal類
4 * 實(shí)際場景:
5 * Hibernate的getCurrentSession方法,就是從線程范圍內(nèi)獲取存在的session,如果不存在則新建一個(gè)并綁定到線程上
6 * struts將一個(gè)請(qǐng)求里的所有參數(shù)綁定到一個(gè)線程范圍內(nèi)的對(duì)象里
7 * @author yzl
8 *
9 */
10 public class ThreadPart_4 {
11 public static void main(String[] args) {
12 new Thread(new Runnable() {
13 public void run() {
14 MyThreadLocalObj obj = MyThreadLocalObj.getInstance();
15 while(obj.getData()<20){
16 obj.add();
17 System.out.println(Thread.currentThread().getName() + " after add method value :" + obj.getData());
18 //這里操作其實(shí)就是同一個(gè)MyThreadLocalObj對(duì)象
19 new MyAdd().add();
20 System.out.println(Thread.currentThread().getName() + " after MyAdd add method value :" + obj.getData());
21 try {
22 Thread.sleep(1000);
23 } catch (InterruptedException e) {
24 e.printStackTrace();
25 }
26 }
27 }
28 }).start();
29
30 new Thread(new Runnable() {
31 public void run() {
32 MyThreadLocalObj obj = MyThreadLocalObj.getInstance();
33 while(obj.getData()>0){
34 obj.sub();
35 System.out.println(Thread.currentThread().getName() + " after sub method value :" + obj.getData());
36 //這里操作其實(shí)就是同一個(gè)MyThreadLocalObj對(duì)象
37 new MySub().sub();
38 System.out.println(Thread.currentThread().getName() + " after MySub sub method value :" + obj.getData());
39 try {
40 Thread.sleep(1000);
41 } catch (InterruptedException e) {
42 e.printStackTrace();
43 }
44 }
45 }
46 }).start();
47 }
48 }
49
50 class MyAdd{
51 public void add(){
52 MyThreadLocalObj.getInstance().add();
53 }
54 }
55
56 class MySub{
57 public void sub(){
58 MyThreadLocalObj.getInstance().sub();
59 }
60 }
61
62 /**
63 * 單例模式下的
64 * 線程范圍內(nèi)共享
65 * 線程范圍外互不影響
66 * @author yzl
67 *
68 */
69 class MyThreadLocalObj{
70 private int data = 10;
71
72 public void add(){
73 data++;
74 }
75
76 public void sub(){
77 data--;
78 }
79
80 private MyThreadLocalObj(){};
81 private static ThreadLocal<MyThreadLocalObj> local = new ThreadLocal<MyThreadLocalObj>();
82
83
84 public static MyThreadLocalObj getInstance(){
85 if(local.get() == null){
86 local.set(new MyThreadLocalObj());
87 }
88 return local.get();
89 }
90
91 public int getData() {
92 return data;
93 }
94 }
運(yùn)行結(jié)果:
不同線程操作的對(duì)象不是同一個(gè),同一個(gè)線程操作的是同一個(gè)
1 Thread-0 after add method value :11 2 Thread-1 after sub method value :9 3 Thread-0 after MyAdd add method value :12 4 Thread-1 after MySub sub method value :8 5 Thread-1 after sub method value :7 6 Thread-0 after add method value :13 7 Thread-1 after MySub sub method value :6 8 Thread-0 after MyAdd add method value :14 9 Thread-1 after sub method value :5 10 Thread-0 after add method value :15 11 Thread-1 after MySub sub method value :4 12 Thread-0 after MyAdd add method value :16 13 Thread-0 after add method value :17 14 Thread-1 after sub method value :3 15 Thread-0 after MyAdd add method value :18 16 Thread-1 after MySub sub method value :2 17 Thread-0 after add method value :19 18 Thread-0 after MyAdd add method value :20 19 Thread-1 after sub method value :1 20 Thread-1 after MySub sub method value :0?
轉(zhuǎn)載于:https://www.cnblogs.com/yangzhilong/p/4780751.html
總結(jié)
以上是生活随笔為你收集整理的4、线程范围内的数据共享之ThreadLocal的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle快速复制表数据
- 下一篇: android support Perc