class Foo { private static Foo foo = null; public static synchronized Foo getFoo() { if (null == foo) { return new Foo(); } return foo; } private Foo() { } }
同步是有額外的開銷的,若是不能承受同步而帶來的開銷,又想實現延遲初始化,還可經過以下的初始化容器類實現: java
class Foo { private Foo() { } private static class FooHolder { static final Foo foo = new Foo(); } public static Foo getFoo() { return FooHolder.foo; } }
當getFoo方法第一次被調用的時候,它讀入FooHolder.foo,才使得FooHolder類被初始化。 程序員
好比,同步區內,對象A被加了鎖,而且調用了方法func。func是外來方法,能夠被用戶自定義。考慮一下,若是func方法中,也有一個對象A的同步區,那會怎樣?結果會形成死鎖!!!! 併發
線程組並無提供太多有用的功能,它已經基本上過期了。 性能