《Effective Java讀書筆記》--線程

對共享可變數據的同步訪問

以下代碼經過同步方法實現了延遲初始化。
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的同步區,那會怎樣?結果會形成死鎖!!!! 併發

  • 爲了性能考慮,儘可能限制同步區域內的工做量。

不要依賴線程的調度器

  • 不要依賴Thread.yield或者線程優先級
  • 對大多數程序員來講,Thread.yield的惟一用途是在測試期間人爲地增長一個程序的併發性。

避免使用線程組

線程組並無提供太多有用的功能,它已經基本上過期了。 性能

相關文章
相關標籤/搜索