『Effective Java読書ノート』--スレッド
共有可変データへの同期アクセス
次のコードは同期法により遅延初期化を実現した.
同期には追加のオーバーヘッドがあり、同期によるオーバーヘッドに耐えられない場合は、遅延初期化を実現したい場合は、次の初期化コンテナクラスで実現することもできます.
getFooメソッドが最初に呼び出されると、FooHolderが読み込む.fooは、FooHolderクラスを初期化します.
多すぎる同期を避けるデッドロックとデータ破壊を避けるために、同期領域から外来メソッドを呼び出さないでください.
例えば、同期領域内では、オブジェクトAがロックされ、メソッドfuncが呼び出される.funcは外来メソッドであり,ユーザによってカスタマイズできる.考えてみましょう.funcメソッドにオブジェクトAの同期領域がある場合、どうなりますか.結果的にデッドロックになる!!!性能を考慮するために、同期領域内のワークロードをできるだけ制限する.
スレッドのスケジューラに依存しない頼むなyieldまたはスレッド優先度 多くのプログラマーにとってyieldの唯一の用途は、テスト中にプログラムの同時性を人為的に増加させることである.
スレッドグループの使用を避ける
スレッドグループはあまり役に立たない機能を提供していません.基本的には時代遅れです.
次のコードは同期法により遅延初期化を実現した.
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の同期領域がある場合、どうなりますか.結果的にデッドロックになる!!!
スレッドのスケジューラに依存しない
スレッドグループの使用を避ける
スレッドグループはあまり役に立たない機能を提供していません.基本的には時代遅れです.