class Demo extends Thread{
Test x;
String name;
String task;
public Demo(String name, String task, Test p){
this.name = name;
this.task = task;
x = p;
}
public void run(){
synchronized (x) {
x.message(name, task);
}
}
public static void main(String[] args) {
Test t = new Test();
Demo d = new Demo("Jack", "Cutting",t);
Demo d1 = new Demo("Jacoe", "Cooking",t);
Demo d2 = new Demo("Bob", "Cleaning",t);
d.start();
d1.start();
d2.start();
}
}
class Test{
void message(String name, String task){
System.out.println(name);
try{
Thread.sleep(5000);
}catch(Exception e){
}
System.out.println(task);
}
}
這是我創建的一個簡單程式,用于在 java 中練習多執行緒和同步。我想知道是否有人可以向我解釋為什么從 public void run() 方法中洗掉同步塊時輸出不同?
With: 帶同步塊
沒有: 沒有同步塊
uj5u.com熱心網友回復:
程式啟動執行緒。作業系統必須在它們運行時進行調度,這似乎是任意的。然后不鎖定執行緒可能會交錯它們的動作。
在同步情況下,所有執行緒的運行方法都在同一個物件上同步,因此一次只能執行其中一個。不能保證它們中的哪一個先出現,調度程式可以選擇它想要的任何一個。在您的情況下,它在第二個執行緒之前選擇了第三個執行緒。
由于列印流是同步的,因此各個輸出行在任何情況下都不會交錯。
uj5u.com熱心網友回復:
輸出從未被確定性地排序或保證為相同的順序。它始終是“未定義的;系統可以按照它最終執行的任何順序執行它”。
uj5u.com熱心網友回復:
synchronized就像lockc#中的陳述句
只有一個執行緒可以同時進入synchronized塊。
其他執行緒必須在synchronized塊前面等待。
總運行時間synchronized應為 15 秒。
總運行時間應該是 5 秒,因為所有 3 個執行緒同時運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/422244.html
標籤:
上一篇:為什么這兩個代碼塊的行為不同?
