JAVAマルチスレッドの最初の部分(a)スレッドの安全性の基盤

コンカレントノートポータル:
1.0コンカレントプログラミング-マインドマップ
2.0コンカレントプログラミング-スレッドの安全性の基礎
3.0コンカレントプログラミング-基本的な構築モジュール
4.0コンカレントプログラミング-タスクの実行-将来
5.0コンカレントプログラミング-マルチスレッドのパフォーマンスとスケーラビリティ
6.0コンカレントプログラミング-明示的なロックと同期された
7.0同時プログラミング
-AbstractQueuedSynchronizer8.0同時プログラミング-アトミック変数と非ブロッキング同期メカニズム

最小限のセキュリティ

スレッドが同期せずに変数を読み取ると、無効な値を取得する可能性がありますが、少なくともこの値は前のスレッドによって設定された値であり、ランダムな値ではありません。この種のセキュリティ保証は、最小セキュリティと呼ばれます。

最低限のセキュリティはほとんどの変数に適用されますが、1つの例外、不揮発性64ビット数値変数(doubleおよびlang)があります。Javaメモリモデルでは、変数の読み取り操作と書き込み操作はアトミック操作である必要がありますが、非揮発性のlong変数とdouble変数の場合、JVMでは64ビットの読み取り操作または書き込み操作を2つの32ビット操作に分解できます。

揮発性変数

他のスレッドに変数の更新操作が通知されるようにするための、より弱い同期メカニズム。揮発性タイプとして宣言されると、コンパイラとランタイムの両方がこの変数が共有されていることに気付くため、この変数に対する操作は他のメモリ操作と並べ替えられません。揮発性変数は、プロセッサから見えないレジスタやその他の場所にキャッシュされないため、揮発性変数を読み取るときは、常に最新の書き込み値が返されます。

ロックメカニズムは可視性と原子性の両方を保証できますが、揮発性変数は可視性のみを保証できます。

  • 揮発性の使用条件(その場合のみ)
    • 変数への書き込み操作は、変数の現在の値に依存しません。または、単一のスレッドのみが変数値を更新するようにします。
    • この変数は、他の状態変数とともに不変性条件に含まれません。
    • 変数にアクセスするときにロックは必要ありません。

スレッドクロージャー

同期の使用を避け、単一のスレッドでデータにアクセスします。信頼性の高いスレッドクロージャーテクノロジーには栈封闭ThreadLocal

アドホックスレッドクロージャ

维护线程封闭性的职责完全由程序实现来承担。该方式是非常脆弱的。
可以通过在 volatile 变量上实现一种特殊的线程封闭。
确保只有单个线程对共享的 volatile 变量执行写入操作,
那么就可以安全的就可以安全的在这些共享的 volatile 变量上执行·读取·-·修改·-·写入·的操作。
在这种情况下,相当于将修改操作封闭在单个线程中以防止发生竟态条件,并且 volatile 变量还确保了其可见性。

スタックが閉じました

线程封闭的一种特例,栈封闭中,只能通过局部变量才能访问对象。
局部变量的固有属性之一就是封闭在执行线程中。
它们位于执行线程的栈中,其他线程无法访问这个栈。

ThreadLocalクラス

詳細なソースコードについては、ここをクリックしてください

ThreadLocal 提供了 get 和 set 等访问接口和方法。
这些方法为每个使用该变量的线程都存有一份独立的副本,
因此 get 总是返回由当前执行线程在调用 set 时设置的最新值。

不変性

不変のオブジェクト

オブジェクトが作成された後、その状態を変更することはできません。その場合、このオブジェクトは不変オブジェクトと呼ばれます。

不可变对象很简单,它们只有一种状态,并且该状态由构造函数控制。

最終ドメイン

finalは、不変のオブジェクトを作成するために使用されます。最終タイプフィールドは変更できません(ただし、最終フィールドによって参照されるオブジェクトが変更可能である場合、これらの参照オブジェクトは変更できます)
最終キーワードの詳細な理解

final 域能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无需同步。

セキュリティリリースオブジェクト

要安全发布一个对象,对象的引用和状态必须同时对其他线程可见。
一个正确构造的对象可以通过以下方式来安全发布。
    * 在静态初始化函数中初始化一个对象引用
    * 将对象的引用保存到 volatile 类型的域或AtomicReferance中
    * 将对象的引用保存到某个正确构造对象的 final 域中
    * 将对象的引用保存到由锁保护的域中

おすすめ

転載: blog.csdn.net/lijie2664989/article/details/103234782