国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ThreadLocal的使用及介紹

2019-11-14 22:19:52
字體:
來源:轉載
供稿:網友
ThreadLocal的使用及介紹ThreadLocal總結1、ThreadLocal使用場合主要解決多線程中數據數據因并發產生不一致問題。ThreadLocal為每個線程的中并發訪問的數據提供一個副本,通過訪問副本來運行業務,這樣的結果是耗費了內存,單大大減少了線程同步所帶來性能消耗,也減少了線程并發控制的復雜度。2、ThreadLocal不能使用原子類型,只能使用Object類型。ThreadLocal的使用比synchronized要簡單得多。3、ThreadLocal和Synchonized都用于解決多線程并發訪問。但是ThreadLocal與synchronized有本質的區別。synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某時間訪問到的并不是同一個對象,這樣就隔離了多個線程對數據的數據共享。而Synchronized卻正好相反,它用于在多個線程間通信時能夠獲得數據共享。4、Synchronized用于線程間的數據共享,而ThreadLocal則用于線程間的數據隔離。5、ThreadLocal并不能替代synchronized,它們處理不同的問題域。Synchronized用于實現同步機制,比ThreadLocal更加復雜。
import java.util.Random;/*** ThreadLocal實例* 源自http://lavasoft.blog.51cto.com/62575/51926/* @author yinchuan.chen**/public class ThreadLocalDemo implements Runnable {//創建線程局部變量studentLocal,在后面你會發現用來保存Student對象PRivate final static ThreadLocal studentLocal = new ThreadLocal();public static void main(String[] agrs) {ThreadLocalDemo td = new ThreadLocalDemo();Thread t1 = new Thread(td, "a");Thread t2 = new Thread(td, "b");t1.start();t2.start();}public void run() {accessStudent();}/*** 示例業務方法,用來測試*/public void accessStudent() {//獲取當前線程的名字String currentThreadName = Thread.currentThread().getName();System.out.println(currentThreadName + " is running!");//產生一個隨機數并打印Random random = new Random();int age = random.nextInt(100);System.out.println("thread " + currentThreadName + " set age to:" + age);//獲取一個Student對象,并將隨機數年齡插入到對象屬性中Student student = getStudent();student.setAge(age);System.out.println("thread " + currentThreadName + " first read age is:" + student.getAge());try {Thread.sleep(500);}catch (InterruptedException ex) {ex.printStackTrace();}System.out.println("thread " + currentThreadName + " second read age is:" + student.getAge());}protected Student getStudent() {//獲取本地線程變量并強制轉換為Student類型Student student = (Student) studentLocal.get();//線程首次執行此方法的時候,studentLocal.get()肯定為nullif (student == null) {//創建一個Student對象,并保存到本地線程變量studentLocal中student = new Student();studentLocal.set(student);}return student;}}class Student {private int age = 0; //年齡public int getAge() {return this.age;}public void setAge(int age) {this.age = age;}}

本文源自http://lavasoft.blog.51cto.com/62575/51926/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邯郸县| 洛阳市| 廉江市| 宿迁市| 乌审旗| 玛多县| 北流市| 道真| 南开区| 根河市| 兴隆县| 藁城市| 永宁县| 红原县| 珠海市| 武宁县| 东丰县| 克拉玛依市| 靖江市| 宝应县| 江安县| 邹平县| 屏东市| 鱼台县| 固阳县| 东安县| 榆中县| 文化| 四平市| 东乌珠穆沁旗| 囊谦县| 铜川市| 沙河市| 宜兰市| 堆龙德庆县| 杂多县| 台安县| 南召县| 潍坊市| 渝中区| 英吉沙县|