多線程之間通訊,其實就是多個線程在操作同一個資源,但是操作的動作不同。 第一個線程寫入count,另一個線程取讀取count的值.實現讀一個,寫一個操作。 小明,男 小明,女 小紅,女 小明,男數據格式發生錯誤?????System.out.println(res.username+","+res. ...
多線程之間通訊,其實就是多個線程在操作同一個資源,但是操作的動作不同。
第一個線程寫入count,另一個線程取讀取count的值.實現讀一個,寫一個操作。
class Res{ public String username; public String sex; } class Out extends Thread{ Res res; public Out(Res res){ this.res=res; } @Override public void run() { //寫操作 int count=0; while (true){ // synchronized (res.getClass()){ if(count==0){//偶數 res.username="小明"; res.sex="男"; } else {//奇數 res.username="小紅"; res.sex="女"; } count=(count+1)%2; // } } } } class Input extends Thread{ Res res; public Input(Res res){ this.res=res; } @Override public void run() { while (true){ // synchronized (res.getClass()){ System.out.println(res.username+","+res.sex); // } } } } public class OutInputThread { public static void main(String[] args) { Res res = new Res(); Out out = new Out(res); Input input = new Input(res); out.start(); input.start(); } }
輸出如下:
小明,男
小明,女
小紅,女
小明,男
數據格式發生錯誤?????System.out.println(res.username+","+res.sex);Input這一句在輸出username時,可能Out又修改了Res對象的值為小紅/小明,導致sex發生混亂,,也就是說多線程下,讀寫同一個資源也可能發生線程安全問題,可見性不具備原子性。
具體原因請參考Java記憶體模型。。。https://blog.csdn.net/qq_37049496/article/details/81172330
怎麼解決?同步而且是兩個線程都需要同步,取消註釋即可保證對共用資源res的操作同一時刻僅有一個線程。。