1.執行緒的同步和通訊
虛假喚醒:在increment和
decrement裡面需要用while 而不能用if,記住:在多執行緒中永遠用while而不用if,因為if判斷有可能這次通過,但是還有可能方法體內wait等待,所以必須用while。
class sharedata
++ number;
system. out.println(thread. currentthread().getname()+"\t"+ number);
this.notifyall();
}public synchronized void decrement() throws interruptedexception
-- number;
system. out.println(thread. currentthread().getname()+"\t"+ number);
this.notifyall();
}}/**
* 題目:現在兩個執行緒,可以操作同乙個變數,實現乙個執行緒對該變數加1,乙個執行緒對該變數減1,實現交替,來10輪,變數初始值為零。
* @author admin
* 1 高內聚低耦合
* 2 執行緒 操作 資源
*/public class threaddemo2 catch (interruptedexception e)}}
}, "aa").start();
new thread(new runnable()
catch (interruptedexception e)}}
}, "bb").start();
new thread(new runnable()
catch (interruptedexception e)}}
}, "cc").start();
new thread(new runnable()
catch (interruptedexception e)}}
}, "dd").start();
}}
2.加同步方法,加靜態同步方法練習
//1 標準訪問,先列印蘋果還是android
//2 加入thread.sleep(4000),先列印蘋果還是android?
//3 加入gethello(),先列印蘋果還是hello?
//4 有兩部手機,先列印蘋果還是android?
//5 兩個靜態同步方法,有一部手機,先列印蘋果還是android?
//6 兩個靜態同步方法,有兩部手機,先列印蘋果還是android?
//7 乙個靜態同步方法,乙個普通同步方法,有一部手機,先列印蘋果還是android?
//先列印ios,因為在ios鎖的是類物件本身 而android鎖的是例項物件本身
//8 乙個靜態同步方法,乙個普通同步方法,有兩部手機,先列印蘋果還是android?
public class threaddemo3 catch (interruptedexception e)}}
}, "aa").start();
new thread(new runnable() catch (interruptedexception e)}}
}, "bb").start();
}}
class phone
public synchronized void getandroid() throws interruptedexception
public void gethello() throws interruptedexception
}
結論:
乙個物件裡面如果有多個synchronized方法,某乙個時刻內,只要乙個執行緒去呼叫其中的一synchronized方法了,其它的執行緒都只能等待,換句話說,某乙個時刻內,只能有唯一乙個執行緒去訪問這些synchronized方法
鎖的是當前物件this,被鎖定後,其它的執行緒都不能進入到當前物件的其它的synchronized方法
加個普通方法後發現和同步鎖無關
換成兩個物件後,不是同一把鎖了,情況立刻變化。
都換成靜態同步方法後,情況又變化
所有的非靜態同步方法用的都是同一把鎖——例項物件本身,也就是說如果乙個例項物件的非靜態同步方法獲取鎖後,該例項物件的其他非靜態同步方法必須等待獲取鎖的方法釋放鎖後才能獲取鎖,可是別的例項物件的非靜態同步方法因為跟該例項物件的非靜態同步方法用的是不同的鎖,所以毋須等待該例項物件已獲取鎖的非靜態同步方法釋放鎖就可以獲取他們自己的鎖。
所有的靜態同步方法用的也是同一把鎖——類物件本身,這兩把鎖是兩個不同的物件,所以靜態同步方法與非靜態同步方法之間是不會有競態條件的。但是一旦乙個靜態同步方法獲取鎖後,其他的靜態同步方法都必須等待該方法釋放鎖後才能獲取鎖,而不管是同乙個例項物件的靜態同步方法之間,還是不同的例項物件的靜態同步方法之間,只要它們同乙個類的例項物件!
3.考察兩個執行緒相互交換:在main方法中建立並啟動兩個執行緒。第乙個執行緒迴圈隨機列印100以內的整數,直到第二個執行緒從鍵盤讀取了「q」命令。
public class hellothread4 implements runnable
}public static void setflag()
}
public class hellothread5 implements runnable}}
}
/*
* 在main方法中建立並啟動兩個執行緒。第乙個執行緒迴圈隨機列印100以內的整數,直到第二個執行緒從鍵盤讀取了「q」命令。
*/public class testthread2
}
4.考察執行緒基本使用:編寫程式,在main方法中建立乙個執行緒。執行緒每隔一定時間(200ms以內的隨機時間)產生乙個0-100之間的隨機整數,列印後將該整數放到集合中; 共產生100個整數,全部產生後,睡眠30秒,然後將集合內容列印輸出; 在main執行緒中,喚醒上述睡眠的執行緒,使其盡快列印集合內容。
public class hellothread6 implements runnable catch (interruptedexception e)
int num = (int)(math.random() * 101);
system.out.println(num);
list.add(num);
}//-------------------
flag = true;
try catch (interruptedexception e)
iteratorit = list.iterator();
while(it.hasnext())
}}public class testthread3 }}
}5.執行緒同步解決執行緒單利設計模式的懶漢式執行緒安全問題
public class testsingleton
//懶漢式
class singleton
//2. 類的內部建立物件
private static singleton instance = null;
public static singleton getinstance()}}
return instance;
}}
java多執行緒練習1
5輛汽車過隧道,隧道一次只能通過一輛汽車,每輛汽車通過時間不固定 1 class threaddemo2 227 catch exception e 29 system.out.println 所有車都已經通過隧道了 30 31 3233 使用單個執行緒類實現 34class car extends...
java例程練習(多執行緒 執行緒同步問題 )
執行緒同步問題 public class testthread implements runnable public void run class timer catch interruptedexception e system.out.println 可能被打斷 name 你是第 num 個使用...
簡單的 java 多執行緒程式設計練習。
啟動 3個執行緒列印遞增的數字 執行緒 1先列印 1,2,3,4,5,然後是執行緒2列印 6,7,8,9,10,然後是執行緒3列印 11,12,13,14,15.接著再由執行緒1列印 16,17,18,19,20.以此類推 直到列印到 75.程式的輸出結果應該為 執行緒1 1 執行緒 1 2 執行緒...