日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

4、线程范围内的数据共享之ThreadLocal

發布時間:2024/4/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4、线程范围内的数据共享之ThreadLocal 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 /** 2 * 線程范圍類的數據共享 3 * 核心:ThreadLocal類 4 * 實際場景: 5 * Hibernate的getCurrentSession方法,就是從線程范圍內獲取存在的session,如果不存在則新建一個并綁定到線程上 6 * struts將一個請求里的所有參數綁定到一個線程范圍內的對象里 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 //這里操作其實就是同一個MyThreadLocalObj對象 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 //這里操作其實就是同一個MyThreadLocalObj對象 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 * 線程范圍內共享 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 }

運行結果:

不同線程操作的對象不是同一個,同一個線程操作的是同一個

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

?

轉載于:https://www.cnblogs.com/yangzhilong/p/4780751.html

總結

以上是生活随笔為你收集整理的4、线程范围内的数据共享之ThreadLocal的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。