0

データベース クエリのラッパーを作成し、別のスレッドからアクセスする必要があります。したがって、私のアプリケーションはそのヘルパー クラスのインスタンスを 1 つだけ作成し、getter を介して返します。

DbConnection dbc = app.getDatabaseConnection();
synchronized (dbc) {
  dbc.doSomething();
}

このコードは安全ですか? ここで述べたように、ローカル変数で同期しても機能するはずです。オブジェクトインスタンスが同じであることが保証されている限り、これは正しいですか?

影響を受ける DbConnection のすべてのインスタンス メソッドを同期させる方が良い方法ですか?

4

2 に答える 2

3

それは良いデザインではありません。

必要に応じてメソッド/ブロックを同期して DBConnection クラスを本質的にスレッドセーフにする代わりに、このクラスのすべてのクライアントを必要なときに明示的に同期するように強制します。したがって、スレッド セーフを明確に識別された 1 つのクラスにカプセル化する代わりに、この責任をクラスのすべてのクライアントに分散することで、全体が非常に壊れやすくなり、潜在的なバグを見つけるのが非常に難しくなります。

とはいえ、複数のスレッドから単一のデータベース接続を使用すること自体は、悪い考えです。

于 2013-11-01T17:07:34.303 に答える
1

DbConnection のすべてのインスタンス メソッドを同期する必要がある場合は、すべてのメソッドを同期します。書いたコードの量を見ないで、正確さだけを見てください。各メソッドを同期すると、何年も前に戻って getDatabaseConnection を呼び出してから同期するのを忘れる可能性はありません。

于 2013-11-01T17:07:21.740 に答える