synchronized細節問題

2021-07-25 17:53:54 字數 2449 閱讀 7703

一、synchronized有鎖重入的特點,某個執行緒得到物件的鎖後,再次請求此物件可以再次得到改物件的鎖。如下示例,在method1中呼叫method2,在method2中呼叫method3,而method1、method2和method3都是加了synchronized關鍵字的。

public class syncdubbo1 

public synchronized void method2()

public synchronized void method3()

public static void main(string args)

});t1.start();

}}

二、父類和子類的方法都是synchronized的,在子類的方法中呼叫父類的方法,也是執行緒安全的。

public class syncdubbo2  catch (interruptedexception e) 

} }static class sub extends main

} catch (interruptedexception e)

} }public static void main(string args)

});t1.start(); }

}

執行結果:

三、synchronized方法內拋異常怎麼處理

鎖會自動釋放

throw runtimeexception打斷此執行緒或者記錄日誌然後continue,選擇哪種方案取決於具體業務要求。

public class syncexception 

} catch (interruptedexception e)

} }public static void main(string args)

},"t1");

t1.start(); }

}

四、synchronized**塊鎖,實用起來也會比較靈活

this、class、object都可以用來作為**塊鎖

public class objectlock  catch (interruptedexception e) 

} }public void method2() catch (interruptedexception e)

} }private object lock = new object();

public void method3() catch (interruptedexception e)

} }

public static void main(string args)

});thread t2 = new thread(new runnable()

});thread t3 = new thread(new runnable()

});t1.start();

t2.start();

t3.start();} }

五、盡量不要用string常量作為鎖

如下**只會有t1執行緒執行,但可以new乙個string物件。

public class stringlock 

} catch (interruptedexception e)

} }public static void main(string args)

},"t1");

thread t2 = new thread(new runnable()

},"t2");

t1.start();

t2.start();

}}

六、乙個物件被用作鎖時,這個物件內的屬性發生變化不會影響鎖的使用。

public class modifylock 

public void setname(string name)

public int getage()

public void setage(int age)

public synchronized void changeattributte(string name, int age) catch (interruptedexception e) }

public static void main(string args)

},"t1");

thread t2 = new thread(new runnable()

},"t2");

t1.start();

try catch (interruptedexception e)

t2.start(); }

}

synchronized細節問題

一 synchronized有鎖重入的特點,某個執行緒得到物件的鎖後,再次請求此物件可以再次得到改物件的鎖。如下示例,在method1中呼叫method2,在method2中呼叫method3,而method1 method2和method3都是加了synchronized關鍵字的。public c...

powerdesigner匯出指令碼細節問題

love聊網路那點事 步驟 database generatedatabase 匯出的指令碼需要調整的地方有 mysql5.5測試結果 1 帶有autocreament的字段,主鍵約束要放在建表語句中,不能在外面通過alter加入。因為該欄位必須是主鍵。例如 create table t sys g...

執行緒synchronized 例子

public class foo public int fix int y return x public class myrunnable implements runnable catch interruptedexception e system.out.println thread.curr...