java併發與執行緒

張超帥發表於2017-08-05

建立執行緒有哪些方式?
1.繼承Thread類,重寫run方法 2.實現Runnable介面,並將物件例項作為引數給Thread類的構造方法 3實現callable介面,實現call方法


Vector相當於一個執行緒安全的List
HashMap是非執行緒安全的,其對應的執行緒安全類是HashTable
Arraylist是非執行緒安全的,其對應的執行緒安全類是Vector
StringBuffer是執行緒安全的,相當於一個執行緒安全的StringBuilder
E,Properties實現了Map介面,是執行緒安全的


CopyOnWriteArrayList適合使用在讀操作遠遠大於寫操作的場景裡,比如快取。
ReadWriteLock 當寫操作時,其他執行緒無法讀取或寫入資料,而當讀操作時,其它執行緒無法寫入資料,但卻可以讀取資料 。適用於 讀取遠遠大於寫入的操作。
ConcurrentHashMap是一個執行緒安全的Hash Table,它的主要功能是提供了一組和HashTable功能相同但是執行緒安全的方法。ConcurrentHashMap可以做到讀取資料不加鎖,並且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持地儘量地小,不用對整個ConcurrentHashMap加鎖。


start和run
兩種方法的區別:
1.start方法
用 start方法來啟動執行緒,是真正實現了多執行緒, 通過呼叫Thread類的start()方法來啟動一個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法。但要注意的是,此時無需等待run()方法執行完畢,即可繼續執行下面的程式碼。所以run()方法並沒有實現多執行緒。
2.run方法
run()方法只是類的一個普通方法而已,如果直接呼叫Run方法,程式中依然只有主執行緒這一個執行緒,其程式執行路徑還是隻有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的程式碼。


第一,記住wait必須要進行異常捕獲
第二,記住呼叫wait或者notify方法必須採用當前鎖呼叫,即必須採用synchronized中的物件


執行緒區域性儲存技術:
同一全域性變數或者靜態變數每個執行緒訪問的是同一變數,多個執行緒同時訪存同一全域性變數或者靜態變數時會導致衝突,尤其是多個執行緒同時需要修改這一變數時,通過TLS機制,為每一個使用該全域性變數的執行緒都提供一個變數值的副本,每一個執行緒均可以獨立地改變自己的副本,而不會和其它執行緒的副本衝突。


synchronized關鍵字是同步程式碼塊關鍵字,對物件加互斥鎖

volatile:用來確保將變數的跟新操作通知到其他執行緒,當把變數宣告為volatile型別後,編譯器與執行時都會注意到這個變數是共享的,因此不會將該變數上的操作與其他記憶體操作一起重排序。然而,在訪問volatile變數時不會執行加鎖操作,因此也就不會使執行執行緒阻塞,因此volatile變數是一種比 synchronized關鍵字更輕量級的同步機制。


sleep和wait的區別有:
1,這兩個方法來自不同的類分別是Thread和Object
2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得敏感詞執行緒可以使用同步控制塊或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

相關文章