『Effective Java読書ノート』--スレッド


共有可変データへの同期アクセス
次のコードは同期法により遅延初期化を実現した.
class Foo {
	private static Foo foo = null;

	public static synchronized Foo getFoo() {
		if (null == foo) {
			return new Foo();
		}
		return foo;
	}

	private Foo() {

	}
}

同期には追加のオーバーヘッドがあり、同期によるオーバーヘッドに耐えられない場合は、遅延初期化を実現したい場合は、次の初期化コンテナクラスで実現することもできます.
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の同期領域がある場合、どうなりますか.結果的にデッドロックになる!!!
  • 性能を考慮するために、同期領域内のワークロードをできるだけ制限する.

  • スレッドのスケジューラに依存しない
  • 頼むなyieldまたはスレッド優先度
  • 多くのプログラマーにとってyieldの唯一の用途は、テスト中にプログラムの同時性を人為的に増加させることである.

  • スレッドグループの使用を避ける
    スレッドグループはあまり役に立たない機能を提供していません.基本的には時代遅れです.