java Lock讀寫鎖測試

2021-08-04 10:47:03 字數 3295 閱讀 2046

當我們設計到讀寫操作時,需要實現讀與寫的互斥,寫與寫的互斥,但不需要維護讀與讀的互斥。

但是使用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 若讀取到,則返回,並釋放讀鎖 ...