ThreadLocal类与Synchonized对象锁的区别
生活随笔
收集整理的這篇文章主要介紹了
ThreadLocal类与Synchonized对象锁的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換時間”的
方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。ThreadLocal和Synchonized都用于解決多線程并發訪問。但是ThreadLocal與synchronized有本質的區別。
synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。
而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象,
這樣就隔離了多個線程對數據的數據共享。
而Synchronized卻正好相反,它用于在多個線程間通信時能夠獲得數據共享。import java.util.Random;public class ThreadLocalDemo {public static void main(String[] args) {School school = new School();Thread thread = new Thread(school);thread.start();Thread thread2 = new Thread(school);thread2.start();}
}class School implements Runnable{private ThreadLocal<Student> sutdentPool = new ThreadLocal<Student>();@Overridepublic void run() {// TODO Auto-generated method stubaccessStudent();}public void accessStudent() {Student stu= this.getSudent();Random random = new Random(); int age = random.nextInt(100); stu.setAge(age);System.out.println("current thread first get age " + Thread.currentThread()
+ ":" + stu.getAge());try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("current thread second get age "+ Thread.currentThread()
+ ":" + stu.getAge()); }public Student getSudent() {Student stu= sutdentPool.get();if(stu==null) {stu=new Student();sutdentPool.set(stu);}return stu;}
}class Student {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
ThreadLocal和Synchonized的區別
ThreadLocal使用場合主要解決多線程中數據因并發產生不一致問題。ThreadLocal為每個線程的中并發訪問的數據提供一個副本,通過訪問副本來運行業務,這樣的結果是耗費了 內存,但大大減少了線程同步所帶來性能消耗,也減少了線程并發控制的復雜度。ThreadLocal不能使用原子類型,只能使用Object類型。ThreadLocal的使用比synchronized要簡單得多。ThreadLocal和Synchonized都用于解決多線程并發訪問。synchronized是利用鎖的機制,使變量或代碼塊在 某一時該只能被一個線程訪問。而ThreadLocal為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象, 這樣就隔離了多個線程對數據的數據共享。而Synchronized卻正好相反,它用于在多個線程間通信時能夠獲得數據共享。Synchronized用于線程間的數據共享,而ThreadLocal則用于線程間的數據隔離。當然ThreadLocal并不能替代synchronized,它們處理不同的問題域。Synchronized用于實現同步機制, 比ThreadLocal更加復雜。深入比較TheadLocal模式與synchronized關鍵字
ThreadLocal模式synchronized關鍵字都用于處理多線程并發訪問變量的問題,只是二者處理問題的角度和 思路不同。1)ThreadLocal是一個java類,通過對當前線程中的局部變量的操作來解決不同線程的變量訪問的沖突問題。 所以,ThreadLocal提供了線程安全的共享對象機制,每個線程都擁有其副本。2)Java中的synchronized是一個保留字,它依靠JVM的鎖機制來實現臨界區的函數或者變量的訪問中的原子 性。在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。此時,被用作“鎖機制”的變量時 多個線程共享的。同步機制(synchronized關鍵字)采用了“以時間換空間”的方式,提供一份變量,讓不同的線程排隊訪問。 而ThreadLocal采用了“以空間換時間”的方式,為每一個線程都提供一份變量的副本,從而實現同時訪問而 互不影響。ThreadLocal和synchronized的區別
synchronized關鍵字主要解決多線程共享數據同步問題。ThreadLocal使用場合主要解決多線程中數據因并發產生不一致問題。ThreadLocal和Synchonized都用于解決多線程并發訪問。但是ThreadLocal與synchronized有本質的區別:synchronized是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而ThreadLocal為每一個 線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象,這樣就隔離了多個線程對數據 的數據共享。而Synchronized卻正好相反,它用于在多個線程間通信時能夠獲得數據共享。Synchronized用于線程間的數據共享,而ThreadLocal則用于線程間的數據隔離。當然ThreadLocal并不能 替代synchronized,它們處理不同的問題域。Synchronized用于實現同步機制,比ThreadLocal更加復雜。1、Java中synchronized用法使用了synchronized關鍵字可以輕松地解決多線程共享數據同步問題。synchronized關鍵字可以作為函數的修飾符,也可作為函數內的語句,也就是平時說的同步方法和同步語句塊。如果再細的分類,synchronized可作用于instance變量、object reference(對象引用)、static函數 和class literals(類名稱字面常量)身上。synchronized取得的鎖都是對象;每個對象只有一個鎖(lock)與之相關聯;實現同步是要很大的系統開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。 synchronized的4種用法 : 1.方法聲明時使用,線程獲得的是成員鎖. 2.對某一代碼塊使用,synchronized后跟括號,括號里是變量,線程獲得的是成員鎖. 3.synchronized后面括號里是一對象,此時,線程獲得的是對象鎖. 4.synchronized后面括號里是類,此時,線程獲得的是對象鎖.2、java.lang.ThreadLocal()的用法ThreadLocal并非是一個線程的本地實現版本,它并不是一個Thread,而是threadlocalvariable (線程局部變量)。也許把它命名為ThreadLocalVar更加合適。線程局部變量(ThreadLocal)其實的功用非常簡單,就是為每一個使用該變量的線程都提供一個變量值的 副本,是Java中一種較為特殊的線程綁定機制,是每一個線程都可以獨立地改變自己的副本,而不會和 其它線程的副本沖突。在ThreadLocal類中有一個Map,用于存儲每一個線程的變量的副本。對于多線程資源共享的問題,同步機制采用了“以時間換空間”的方式,而ThreadLocal采用了“以空間換 時間”的方式。前者僅提供一份變量,讓不同的線程排隊訪問,而后者為每一個線程都提供了一份變量, 因此可以同時訪問而互不影響。二、API說明ThreadLocal() 創建一個線程本地變量。T get() 返回此線程局部變量的當前線程副本中的值,如果這是線程第一次調用該方法,則創建并初始化此副本。四、總結ThreadLocal使用場合主要解決多線程中數據因并發產生不一致問題。ThreadLocal為每個線程的中并發訪問的數據提供一個副本,通過訪問副本來運行業務,這樣的結果是耗費了 內存,單大大減少了線程同步所帶來性能消耗,也減少了線程并發控制的復雜度。ThreadLocal不能使用原子類型,只能使用Object類型。ThreadLocal的使用比synchronized要簡單得多。線程局部變量。是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java提供 ThreadLocal 類來支持線程局部變量,是一種實現線程安全的方式。synchronized 是利用鎖的機制,使變量或代碼塊在某一時該只能被一個線程訪問。而 ThreadLocal 為每一個線程都提供了變量的副本,使得每個線程在某一時間訪問到的并不是同一個對象,這樣就隔離了 多個線程對數據的數據共享。?
總結
以上是生活随笔為你收集整理的ThreadLocal类与Synchonized对象锁的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中ListIterator和It
- 下一篇: ajax是什么?