本文內容
何時該使用讀寫鎖.
讀寫鎖的寫法.
理解讀寫鎖和執行緒互斥的區別。
複習-同步化的概念
當乙個方法或**塊被宣告成synchronized,要執行此**必須先取得乙個物件例項或this的鎖定,這個鎖定要在 synchronized修飾的方法或**塊執行完後才能釋放掉(無論這段**是怎樣返回的,是正常執行還是異常執行)。每個物件只有乙個鎖定,如果有兩 個不同的執行緒試圖同時呼叫同一物件的同步方法,最終只會有乙個能執行此方法,另外乙個要等待第乙個執行緒釋放掉鎖定後才能執行此方法。
讀寫鎖應用的場合
我們有時會遇到對同乙個記憶體區域如陣列或者鍊錶進行多執行緒讀寫的情況,一般來說有以下幾種處理方式: 1.不加任何限制,多見於讀取寫入都很快的情況,但有時也會出現問題. 2.對讀寫函式都加以同步互斥,這下問題是沒了,但效率也下去了,比如說兩個讀取執行緒不是非要排隊進入不可. 3.使用讀寫鎖,安全和效率都得到了解決,特別合適讀執行緒多於寫執行緒的情況.也就是下面將要展現的模式.
讀寫鎖的意圖
讀寫鎖的本意是分別對讀寫狀態進行互斥區分,有互斥時才加鎖,否則放行.互斥的情況有: 1.讀寫互斥. 2.寫寫互斥. 不互斥的情況是:讀讀,這種情況不該加以限制. 程式就是要讓鎖物件知道當前讀寫狀態,再根據情況對讀寫的執行緒進行鎖定和解鎖。
讀寫執行緒都要操作的資料類
讀寫執行緒都要操作的資料是鍊錶datas。
注意其中try...finally 的寫法,它保證了加鎖解鎖過程是成對呼叫的l
public
class
datalib
//寫入資料
,這時不能讀取
public
void
writedata(list
newdatas)
finally}//
讀取資料
,這時不能寫入
public
list
readdata()
finally}}
讀寫鎖readwritelock類
public class readwritelock
catch(interruptedexception ex)
}system.out.println("設定鎖為讀取狀態");
isread=true;
}public synchronized void readunlock()
public synchronized void writelock()
catch(interruptedexception ex)
}// 有寫入時寫入執行緒也一樣要停止
while(iswrite)
catch(interruptedexception ex)
}system.out.println("設定鎖為寫入狀態");
iswrite=true;
}public synchronized void writeunlock()
}寫執行緒類writer -它用於往datalib類例項中的datas欄位寫資料
分析其中datalib欄位的用意。
注意並記住其中持續呼叫及使用隨機數的方法。l
public class writer implements runnable;
public writer(datalib datalib,string mockdatas)
public void run()
datalib.writedata(newdatas);}}
} 讀執行緒類reader -它用於從datalib類例項中的datas欄位讀取資料
分析其中datalib欄位的用意。
注意並記住其中持續呼叫及使用隨機數的方法。
public class reader implements runnable
public void run()
system.out.print("/n");}}
}將**執行起來
右邊的**建立了兩個寫執行緒和三個讀執行緒,它們都是對datalib例項進行操作的。
五個執行緒都有乙個datalib欄位,都提供了乙個帶參建構函式以給datas欄位賦值,這就保證了五個執行緒操作的都是乙個例項的同一字段,也就是同一片記憶體。
讀寫鎖就是對這五個執行緒進行控制的。
當有乙個讀執行緒在操作時,其它的寫執行緒無法進行操作,讀執行緒可以正常操作,互不干擾。
當有乙個寫執行緒在操作時,其它的讀執行緒無法進行操作。
public class test;
writer writer1=new writer(datalib,mockdatas1);
string
mockdatas2=;
writer writer2=new writer(datalib,mockdatas2);
reader reader1=new reader(datalib);
reader reader2=new reader(datalib);
reader reader3=new reader(datalib);}//
用於延時
public static void sleep(int sleepsecond)
catch(exception ex)}}
小結當多個執行緒試圖對同一內容進行讀寫操作時適合使用讀寫鎖。
請理解並記住readwritelock類讀寫鎖的寫法.
讀寫鎖相對於執行緒互斥的優勢在於高效,它不會對兩個讀執行緒進行盲目的互斥處理,當讀執行緒數量多於寫執行緒尤其如此,當全是寫執行緒時兩者等效。
Android 配置檔案
context mcontext override public void oncreate public class utils catch ioexception e try catch ioexception e return props public static void init con...
Android讀寫配置檔案
android 讀寫配置檔案 基本上我們所有的資料均放在 data data com.目錄下 shared prefs 放置簡單的配置資訊檔案,檔案格式為 xml databases 放置資料庫檔案,檔名自己定義。sharedpreferences 檔案讀寫 讀檔案 sharedpreference...
設定jmeter配置檔案
找到安裝目錄下,bin資料夾下jmeter.properties檔案 1.修改jmeter介面為中文 2.生成html報告 3.各命令的功能 n 以非gui形式執行jmeter t source.jmx 指令碼路徑 l result.jtl 執行結果儲存路徑 jtl 此檔案必須不存在 e 在指令碼執...