下面貼幾個例項來具體驗證下:
預設情況下 synchronized 修飾的非靜態方法,其鎖為 this,與 synchronized(this) 效果一樣:
public class synchronized
public static void synctest(final synchronized sync1, final synchronized sync2)
}, "th-1");
th1.start();
thread th2 = new thread(new runnable()
}, "th-2");
th2.start();
}/**
* 同步方法一
*/public synchronized void sync1()
} catch (interruptedexception e)
system.out.println("sync1 is end");
}/**
* 同步方法二
*/public synchronized void sync2()
} catch (interruptedexception e)
system.out.println("sync2 is end");
}}
上面是對非靜態 synchronized 的方法。
下面是靜態的 synchronized 執行結果:
預設情況下,synchronized 修飾的靜態方法,其鎖為 類.class
public class synchronized
public static void synctest(final synchronized sync1, final synchronized sync2)
}, "th-1");
th1.start();
thread th2 = new thread(new runnable()
}, "th-2");
th2.start();
}/**
* 同步方法一
*/public static synchronized void sync1()
} catch (interruptedexception e)
system.out.println("sync1 is end");
}/**
* 同步方法二
*/public static synchronized void sync2()
} catch (interruptedexception e)
system.out.println("sync2 is end");
}}
對於 synchronized 修飾的靜態方法,因為其鎖預設為 類.class,所以在多個執行緒同時執行時,會存在鎖競爭的情況,所以會阻塞
下面是對 synchronized(例項物件) 的使用:
public class synchronized2
}, "th-1");
thread th2 = new thread(new runnable()
}, "th-2");
th1.start();
th2.start();
}public void synctest(object sync)
} catch (interruptedexception e) }}
}
上面**執行結果為:
ob1 == ob2: true
ob1.hashcode() == ob2.hashcode(): true
thread name : th-1
th-1 : 0
th-1 : 1
th-1 : 2
thread name : th-2
th-2 : 0
th-2 : 1
th-2 : 2
原因是:兩個執行緒競爭的鎖是同乙個鎖,因為 ob1==ob2 結果為true。
下面看,如果把上面的
string ob1 = new string("sync");
string ob2 = ob1;
改為:
string ob1 = new string("sync");
string ob2 = new string("sync");
結果就為:
ob1 == ob2: false
ob1.hashcode() == ob2.hashcode(): true
thread name : th-2
th-2 : 0
thread name : th-1
th-1 : 0
th-1 : 1
th-2 : 1
th-2 : 2
th-1 : 2
因為此時兩個執行緒競爭的鎖不為同乙個鎖,所以不存在鎖競爭。
下面的例項來自網上,原文出自(抱歉,沒有儲存到)
public class run
}class service
public void setusernamepassword(string username, string password)
} catch (interruptedexception e)
}}class threada extends thread
@override
public void run()
}class threadb extends thread
@override
public void run()
}
執行結果為:
執行緒名稱為:a在1482044312482進入同步塊
執行緒名稱為:a在1482044313483離開同步塊
執行緒名稱為:b在1482044313483進入同步塊
執行緒名稱為:b在1482044314483離開同步塊
因為作為鎖的物件為同乙個物件 service1 的 anystring 物件,所以存在鎖競爭,所以兩個程序會按順序輸出
如果我將 main 方法改為如下,結果會是什麼呢:
public static void main(string args)
這次我傳的物件為兩個不同的物件,那麼輸出結果是什麼呢?答案是不變的:
true
執行緒名稱為:a在1482044611516進入同步塊
執行緒名稱為:a在1482044612517離開同步塊
執行緒名稱為:b在1482044612517進入同步塊
執行緒名稱為:b在1482044613518離開同步塊
因為這個例子中,作為鎖的不是 兩個 service1 與 service2,而是其中的 anystring 字串物件。寫到這,可能細心的讀者會發現,在用 string 型別作為鎖時,一定要注意,因為在jvm 中存在乙個 字串常量池 的記憶體區域,這就涉及到有關 string 的記憶體空間分配的問題了,如:
string str1 = "12345";
string str2 = new string("12345");
string str3 = "12345".intern();
他們直接先後順序不一樣,變數的記憶體位址也是不一樣的
synchronized的使用總結
synchronized的基本使用規則可總結為以下3條。1.當乙個執行緒訪問 某物件 的 synchronized方法 或者 synchronized 塊 時,其他執行緒對 該物件 的該 synchronized方法 或者 synchronized 塊 的訪問將被阻塞。2.當乙個執行緒訪問 某物件 ...
執行緒 synchronized的使用
synchronized public class sync override public void run public void pf int i catch interruptedexception e system.err.println i new date gettime public...
使用 synchronized指令
使用 synchronized指令 synchronized 指令是在 objective c 中建立乙個互斥鎖非常方便的方法。synchronized 指令做和其他互斥鎖一樣的工作 它防止不同的執行緒在同一時間獲取同乙個鎖 然而在這種情況下,你不需要直接建立乙個互斥鎖或鎖物件。相反,你只需要簡單的...