package basic;public class TestSynchronizedObject { public static void main(String[] args) { final TestSynchronizedObject testSynchronizedObject_first = new TestSynchronizedObject(); final TestSynchronizedObject testSynchronizedObject_second = new TestSynchronizedObject(); final MyObject myObject_first = new MyObject(); final MyObject myObject_seconde = new MyObject(); new Thread("線程A") { @Override public void run() { myObject_first.print("線程A"); } }.start(); new Thread("線程B") { @Override public void run() { myObject_seconde.print("線程B"); } }.start(); }}class MyObject { public void print(String str) { System.out.println("線程" + Thread.currentThread().getName() + "開始執(zhí)行"); synchronized ("") { for (int i = 0; i < 10; i++) { System.out.println(str + " ." + i + ". "); try { Thread.sleep(1000); } catch (InterruptedException e) { } } } System.out.println("線程" + Thread.currentThread().getName() + "執(zhí)行結(jié)束"); }}//輸出結(jié)果://線程線程A開始執(zhí)行//線程A .0. //線程線程B開始執(zhí)行//線程A .1. //線程A .2. //線程A .3. //線程A .4. //線程A .5. //線程A .6. //線程A .7. //線程A .8. //線程A .9. //線程B .0. //線程線程A執(zhí)行結(jié)束//線程B .1. //線程B .2. //線程B .3. //線程B .4. //線程B .5. //線程B .6. //線程B .7. //線程B .8. //線程B .9. //線程線程B執(zhí)行結(jié)束查閱相關(guān)文檔,當(dāng)synchronized修飾代碼塊的時候,表示線程在執(zhí)行的時候會將synchronized括號中的對象上鎖。(注意這個對象可以是任意類的對象,也可以使用this關(guān)鍵字)。但是我這里明明是兩個實例,而且在synchronized修飾代碼塊的時候,我的括號中明明沒有指定在什么對象上使用鎖,為什么是這樣的打印結(jié)果呢?
synchronized在修飾代碼塊的時候,括號后面要跟什么?。?/h1>
1 回答

梵蒂岡之花
TA貢獻1900條經(jīng)驗 獲得超5個贊
synchronized (lock-object) {
}
括號后面要跟一個對象,這個對象充當(dāng)鎖的作用。
synchronized(""),這里你把一個空字符串當(dāng)成鎖,并因此認為你沒有指定鎖住哪個對象。
而實際上,空字符串本身就是一個對象。并且,你有兩個實例,并把空字符串喂給它們,這兩個實例實際上持有的是同一個對象。
在Java中,全部都是對象, 空字符串也是對象。
常量字符串,比如空字符串,都放在常量池里,兩個實例引用的空字符串實際上就是常量池里的空字符串,是同一個對象。
添加回答
舉報
0/150
提交
取消