この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 14222|答える: 0

[通信] JavaおよびI++スレッドセキュリティの基本タイプに関する洞察

[リンクをコピー]
掲載地 2015/04/05 22:17:45 | | |

Javaでは、LongとDoubleの8バイト64ビット変数を除き、他の基本変数は原子変数です。


Javaのストレージモデルでは、getおよびstore操作の両方が原子的である必要がありますが、非揮発性の長変数や二重変数の場合、JVMは64ビットの読み書きを2つの32ビット操作に分割することを可能にします。

読み書きが異なるスレッドで行われる場合、非揮発性タイプのロングを読み取ると、一方の値は32ビット高く、もう一方は32ビット低くなることがあります。

ですので、期限切れのデータに関心がなくても、マルチスレッドプログラムで共有・可変のロングやダブル変数を使うのは、揮発性と宣言されているかロックで保護されていない限り安全ではないかもしれません。


原子操作と言えば、読み書きは原子的であり、例えば i=5 のようになります。 これは原子力の作戦です。

しかし、2つの原子の操作が同時に行われる場合、例えば最初に読み込んでから書き込むような原子的な操作ではない場合、読み取り後に変数が修正されている可能性があります。

i++はそのような操作で、まず読み取り、その後に書き込みを行うため、整数変数は原子的であり、i++が原子的操作であるわけではありません。

for(int i=0; i<10000; i++){System.out.print(i)}

最終的に1万部を印刷するわけではなく、8千〜9千部ほど印刷するでしょう。


しかしマルチスレッドの場合、たとえ整数変数が原子変数であっても、スレッドの安全性問題、つまりスレッドの可視性の問題が起こる可能性があるため、揮発性の文を追加する必要があります。

この修飾子は強制変数で、毎回メモリから読み込まれ、レジスタに保存されません。




先の:SQL 2008のプロンプトにはエラーメッセージが表示されます(プロバイダー:SQL Network Interfaces、エラー:25 - 接続ワード)。
次に:[ワイルド・スピード7] 2.12G DVD初公開 インターネットで最も鮮明なバージョン
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com