當我們設計到讀寫操作時,需要實現讀與寫的互斥,寫與寫的互斥,但不需要維護讀與讀的互斥。
但是使用synchronized無法實現排除讀與讀的互斥,這時候就需要lock來實現。
訪問測試類:
public class readwritelocktest
},"寫執行緒:"+i+"->").start();
}for (int i = 0; i < 5; i++)
},"讀執行緒"+i+"->").start();}}
}
不使用同步:
public class datetest catch (interruptedexception e)
this.data = s;
system.out.println(thread.currentthread().getname()+"----成功寫入資料:"+this.data);
}public /*synchronized*/ void get() catch (interruptedexception e)
system.out.println(this.data);
system.out.println(thread.currentthread().getname()+"----成功讀取資料");
}}
結果:
寫執行緒:0->----準備寫入資料:6
寫執行緒:1->----準備寫入資料:18
寫執行緒:2->----準備寫入資料:16
寫執行緒:3->----準備寫入資料:2
寫執行緒:4->----準備寫入資料:23
讀執行緒0->----準備讀取資料
讀執行緒1->----準備讀取資料
讀執行緒2->----準備讀取資料
讀執行緒3->----準備讀取資料
讀執行緒4->----準備讀取資料
寫執行緒:2->----成功寫入資料:16
寫執行緒:0->----成功寫入資料:16
寫執行緒:4->----成功寫入資料:23
寫執行緒:1->----成功寫入資料:16
寫執行緒:3->----成功寫入資料:2
2323
讀執行緒2->----成功讀取資料
23讀執行緒1->----成功讀取資料
讀執行緒0->----成功讀取資料
2323
讀執行緒3->----成功讀取資料
讀執行緒4->----成功讀取資料
可以看到結果很亂。
使用synchronized:
public class datetest catch (interruptedexception e)
this.data = s;
system.out.println(thread.currentthread().getname()+"----成功寫入資料:"+this.data);
}public /*synchronized*/ void get() catch (interruptedexception e)
system.out.println(this.data);
system.out.println(thread.currentthread().getname()+"----成功讀取資料");
}}
結果:
寫執行緒:0->----準備寫入資料:2
寫執行緒:0->----成功寫入資料:2
讀執行緒4->----準備讀取資料
2讀執行緒4->----成功讀取資料
讀執行緒3->----準備讀取資料
2讀執行緒3->----成功讀取資料
讀執行緒2->----準備讀取資料
2讀執行緒2->----成功讀取資料
讀執行緒1->----準備讀取資料
2讀執行緒1->----成功讀取資料
讀執行緒0->----準備讀取資料
2讀執行緒0->----成功讀取資料
寫執行緒:4->----準備寫入資料:17
寫執行緒:4->----成功寫入資料:17
寫執行緒:3->----準備寫入資料:7
寫執行緒:3->----成功寫入資料:7
寫執行緒:2->----準備寫入資料:26
寫執行緒:2->----成功寫入資料:26
寫執行緒:1->----準備寫入資料:7
寫執行緒:1->----成功寫入資料:7
可以看到讀與讀互斥
使用lock:
public class datetest catch (interruptedexception e)
this.data = s;
system.out.println(thread.currentthread().getname()+"----成功寫入資料:"+this.data);
}finally
}public void get() catch (interruptedexception e)
system.out.println(this.data);
system.out.println(thread.currentthread().getname()+"----成功讀取資料");
}finally
}}
結果:
寫執行緒:0->----準備寫入資料:1
寫執行緒:0->----成功寫入資料:1
寫執行緒:1->----準備寫入資料:24
寫執行緒:1->----成功寫入資料:24
寫執行緒:2->----準備寫入資料:14
寫執行緒:2->----成功寫入資料:14
寫執行緒:3->----準備寫入資料:23
寫執行緒:3->----成功寫入資料:23
寫執行緒:4->----準備寫入資料:0
寫執行緒:4->----成功寫入資料:0
讀執行緒0->----準備讀取資料
讀執行緒1->----準備讀取資料
讀執行緒2->----準備讀取資料
讀執行緒3->----準備讀取資料
讀執行緒4->----準備讀取資料00
0讀執行緒2->----成功讀取資料
0讀執行緒1->----成功讀取資料
讀執行緒3->----成功讀取資料
讀執行緒0->----成功讀取資料
0讀執行緒4->----成功讀取資料
寫與寫互斥了但是讀與讀不互斥。 讀寫鎖與自旋鎖
一 讀寫鎖 1 特點 讀寫鎖比mutex有更高的適用性,可以多個執行緒同時占用讀模式的讀寫鎖,但是只能乙個執行緒占用寫模式的讀寫鎖。1 當讀寫鎖是寫加鎖狀態時,在這個鎖被解鎖之前,所有試圖對這個鎖加鎖的執行緒都會被阻塞 2 當讀寫鎖在讀加鎖狀態時,所有試圖以讀模式對它進行加鎖的執行緒都可以得到訪問權...
互斥鎖和讀寫鎖
互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...
讀寫鎖 可重入鎖
讀寫鎖就是分了兩種情況,一種是讀時的鎖,一種是寫時的鎖,它允許多個執行緒同時讀共享變數,但是只允許乙個執行緒寫共享變數,當寫共享變數的時候也會阻塞讀的操作。這樣在讀的時候就不會互斥,提高讀的效率。可以用來讀寫快取,步驟 1 加讀鎖,從快取讀取key對應的value 2 若讀取到,則返回,並釋放讀鎖 ...