標籤:android style java 使用 strong 資料
安全執行緒:
在多線程的情況下,不會因為線程之間的操作而導致資料錯誤。
線程同步:
同一個資源,可能在同一時間被多個線程操作,這樣會導致資料錯誤。這是一個現象,也是一個問題,而研究如何解決
此類問題的相關工作就叫做線程同步。
android中,處理線程同步的手段就是:鎖
一般分為公平鎖和非公平鎖:
synchronized(內部鎖,互斥鎖):
synchronized是JVM提供的線程同步機制,如果出現問題,JVM能捕獲異常,並釋放資源,具體實現機制需要查看JVM源碼
synchronized的使用特點:
lock介面:
這些實現了lock介面的鎖定義是通過java語言進行實現與封裝的,具體的實現機制可以通過查看其原始碼得知
lock執行個體加鎖和解鎖的大概過程:
當一個資源被鎖定之後,訪問它的線程會被加入等待隊列,當
內部鎖(互斥鎖)ReentrantLock
讀寫鎖
synchronized
1.synchronized作用在方法上:鎖對象
2.synchronized作用在代碼塊:只鎖代碼塊
3.synchronized(this):對象鎖
4.synchronized(object):成員鎖
總結synchronized:
可以鎖對象:synchronized(this) , synchronized(class) , synchronized methods , 此時對象的所有
資源不能被其他線程訪問
成員鎖:
synchronized(obj){ } , 程式碼片段內的代碼不能被同時訪問。
對象鎖太粗糙
通常情況使用synchronized就夠了,資源競爭很激烈的情況下,Synchronized的效能會下降幾十倍,才會使用
ReetrantLock來完成複雜的業務需求。(不公平鎖)
使用java封裝的鎖對象可以更靈活的滿足業務需求,比如可以設定鎖的等待時間,公平性等等,而使用Synchronized
則只能使用同步監視器的三個方法來操作線程
線程通訊:
synchronized作為對象鎖時候,通過this,可以調用三個方法線上程之間通訊
synchronized作為成員所時候,通過(obj),調用三個方法,其中被鎖的東西就叫做同步監視器。(this,obj)
wait:當前線程進入等待狀態,直到其他線程調用該同步監視器的notity方法或者notityall方法來喚醒.
調用wait就以為著釋放同步監視器
notify:喚醒在此同步監視器上等待的單個線程。如果所有線程都在此同步監視器上等待,則會隨機播放喚醒其中一個線程。
只有當前線程放棄對該同步監視器的鎖定後(用wait方法),才可以執行被喚醒的線程
notityAll: 喚醒在此同步監視器上等待的所有線程。只有當前線程放棄對該同步監視器的鎖定後,才能執行喚醒的線程。
執行緒模式:
訊息迴圈
訊息佇列
handler
Thread
UI Thread
android的執行緒模式:
UI線程有一個訊息佇列,一個訊息迴圈,一個Handler.
一般建立的後台線程對象就是一個一次性完成工作的任務.
如何建立他們之間的聯絡?
一般情況下,啟動一個非UI線程用於處理耗時工作之後,需要一個機制用於通知UI線程,工作做好了,
這個機制就是一個Message。
當後台線程工作結束之後,向欲通知的線程發送一個Message,用來通知這個目標線程說:“我已經工作完了”,而這個
Message怎麼發過去呢?通過Handler對象。 想給哪個線程發送Message就給該線程的Handler發送Message.
(前提是目標線程有處理訊息的能力)
綜上:
當後台線程完成工作之後,會通過UI線程的Handler對象發送一個Message到UI線程的訊息佇列中,UI線程的訊息迴圈
就會從訊息佇列中取出此Message,並且處理此Message,做愛做的事。
對於一個後台線程:
如果想讓該 線程具有訊息佇列和訊息迴圈,需要線上程中首先調用Looper.prepare()來建立訊息佇列,然後調用Looper.loop()進入訊息迴圈。 如下例所示:
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
這樣你的線程就具有了訊息處理機制了,在Handler中進行訊息處理。