2009年5月11日 星期一

Spin lock跟polling loop

之前看『Practical Java Programmin Language Guide』 看到的名詞
因為想不到要打什麼文章,姑且用這個充填一下

Spin lockpolling loop都是執行緒下的一種名詞產物
不過google一下其他地方似乎對這兩個名詞有不同的解釋,我就針對『Practical Java Programmin Language Guide』 的解釋來介紹好了

Spin lock


當執行緒須要某個條件而進入wait的狀態時,他應當在『一個迴圈』之內,稱為旋鎖(Spin lock)

舉個例子

...
if(command==null)
{
try
{
wait();
}
catch(...){...}
}
command.exec();
command=null;
...

像上面這隻程式,他必須檢查command是不是null,是的話必須讓這支Thread進入等待狀態
由於有很多執行緒在搶這個lock,但是不知道會是哪隻執行緒搶到,在此會有個bug
假設有A跟B兩執行緒在等command,但是不知道誰會先搶到
如果A搶到了,他執行
command.exec();
當然沒問題,問題出在B,B沒搶到而command又被A設null,B再去執行
command.exec();
就會出現錯誤

改善方法:將判斷是否要wait的條件式用while取代

while(command==null)
{
try
{
wait();
}
catch(...){...}
}
command.exec();
command=null;
...

讓執行緒不斷的去檢查這個lock就稱為旋鎖。

Polling Loop


執行緒用while加Thread.sleep的方式不斷去詢問是否有資料可read(polling)的方式稱之

...
while(data.length==0)
{
try
{
sleep(2000);
}
catch(...){...}
}
//do something
...

以上面為例,這支執行緒不斷去檢查是否有資料,沒有的話去sleep兩秒再去問一次
這種作法的缺點是很耗CPU,書中提出用wait改善

...
while(data.length==0)
{
try
{
wait();
}
catch(...){...}
}
//do something
...

進入wait的執行緒會變成suspend的狀態,他不會花費CPU資源,能夠得到比較好的效能


題外話
剛剛發現google有個貼心的設計
我在想把字體轉紅色的時候
<font color="red">while</font>
然後我按撰寫,再按回修改HTML
他自動幫我轉成CSS的形式
<span style="color:red;">while</span>

沒有留言: