web-dev-qa-db-ja.com

RESTを介してArrayListと対話する場合、ReadWriteLockは一貫性を維持しますか?

REST呼び出しを介して追加/削除/更新できるオブジェクトのArrayListがあります。同時アクセスから発生する可能性のある問題を防ぐために、ReadWriteLockは適切で効率的ですか?

1
SVN600

[〜#〜] acid [〜#〜] が保証されているデータベースは、いくつかの理由から、ArrayListをメモリに保持しようとするよりも、ほぼ確実にこれを行うためのより良い方法です。

  1. スケーリングします。
  2. RESTのステートレス保証を維持します。
  3. 犬が電源コードにつまずく心配はありません。
  4. 並行性はすでに実行されています。

あまり変化しないデータで非常に高速なターンアラウンドが必要な場合は、Redisのようなキャッシュを追加するか、データベースから入力された メモ化されたオブジェクト を使用することを検討してください。

2
Robert Harvey

それは実際には非常に単純で、 Synchronized バージョンは問題なく動作し、繰り返し処理する必要がある場合を除いて、リストへのすべてのアクセスを安全にします。それを繰り返す必要がある場合は、いくつかの方法があります。

  • リストのコピーを作成してから、そのコピーを繰り返し処理します(これにより、リストのポインター配列のみがコピーされ、リスト内のオブジェクトはコピーされないことに注意してください。非常に迅速な操作です)。
  • 反復ループの周りにsynchronized(list){}を配置します。これにより、反復の全期間にわたってコレクションがロックアウトされますが、コピーは作成されません。

同期された操作のパフォーマンスについては、心配する必要はありません。同期されていないリストよりも数倍遅くなりますが、ディスクにアクセスするよりも数桁速くなります。

これで、リストから取得したオブジェクトを2つのスレッドから同時に更新できる場合は、独自の内部同期メカニズムが必要です(多くの場合、ビジネスロジックを使用してこの可能性を排除できます)。

これを使用して、速度に問題があるかどうかを確認します。同期を回避するためのパターンがありますが、もう少し考えてコーディングする必要があります。 (最も安全なのは、おそらくFunctionalコレクションのリストオブジェクトを使用することです)

Robertが提案するようにデータベースにアクセスする方が良いです。最初にそれを実行し、遅すぎる場合にのみ情報を内部にキャッシュします。

0
Bill K