2017-04-12 14 views
0

私は、非同期プログラミングやマルチスレッドの競合状態を避けるために、共有状態を避けるべきであることを何度も読んできました。共有状態を回避する方法は?

たとえば、外部サーバーからデータを取得してメモリ内のオブジェクトを更新し、ユーザーの要求によってメモリからオブジェクトを送信するプログラムがあるとします。

このようなプログラムの動作を共有状態を使用しないように変更するにはどうすればよいですか?

私はそれが理にかなっているとは思いません。私は共有状態を使わないという考えを誤解したことがありますか?

答えて

1

共有状態/競合状態は、あなたが失いたくない情報にとってより懸念されます。

例を使用すると、ユーザーが自分のログイン設定を更新し、ユーザーオブジェクトの更新バージョンをメモリ内からデータベースに送信することが妥当な可能性があります。これは、ユーザーが同時に2台のコンピュータから自分のログイン設定を更新することができないため、合理的です。

一方、ウェブサイトへの総訪問数をカウントするカウンタを持つオブジェクトがある場合、そのメモリ内オブジェクトをデータベースに書き込むことはお勧めできません。これは「共有状態」であり、非常に多くのユーザーが同時にその変数に書き込む必要があります。確かに期限切れになるでしょう。たとえば、私は5番目の訪問者かもしれませんが、遅いインターネットのために、その間にウェブサイトにアクセスし、5と書いてください。私はページを見て始めてデータベースを照会しただけなので、カウンターに4というオブジェクトがあるので、後でデータベースに5と書きます。これは効果的にサイトへの訪問を無効にします。代わりに、サーバー側でサイト訪問を集計し、受信したヒットに対して+1を追加するだけで(スレッドセーフな同期コードでこれをラップする)ことができます。

+0

しかし、そのオブジェクトの既存の情報を使用してオブジェクトを更新したい場合は、そのオブジェクトの最新のコピーを取得するか、またはそのオブジェクトをロックする必要があります。 – sidoshi

+0

は必ずしもそうではありません。それがユーザーのメタデータのようなものなら、おそらく全体を上書きするかどうかは気にしないでしょう。 – Julie

関連する問題