[訳]Javaコンカレント:@GuardedBy------androidでの注記

2700 ワード

テキストリンク:https://samxiangyu.wordpress.com/2015/02/20/java-concurrency-guardedby/AndroidソースエンジニアリングのDownloadServiceクラスを読むと、@GuardedBy注釈が使用されていることに気づきました.これはJavaキーワードsynchronizedキーワードに似ていますが、代わりにロックが使用されています.この注記は、次のように使用できます.
public class foo {
  @GuardedBy("this")
  public String str;
}

ご覧のように、@GuardedBy(lock)として使用されます.これは、保護されたフィールドまたはメソッドがオンライン・スレッドにロックを保持している場合にのみ、一部のスレッドにアクセスできることを意味します.ロックを次のタイプに指定できます.
  • this:このクラスでフィールドのオブジェクトの固有ロックを定義します.
  • class-name.this:内部クラスでは、「this」の曖昧さを解消する必要があるかもしれません.class-name.this指定では、「this」参照の意図を指定できます.
  • itself:参照フィールドのみ;フィールド参照オブジェクト.
  • field-name:ロックオブジェクトは、フィールド名で指定された(インスタンスまたは静的)フィールドで参照されます.
  • class-name.field-name:ロックオブジェクトはclass-name.field-nameで指定した静的フィールド参照.
  • method-name():ロックオブジェクトは、名前付きnil-aryメソッドを呼び出すことによって返されます.
  • class-name:ロックオブジェクトとしてクラスのClassオブジェクトを指定します.

  • 例:
    public class BankAccount {
      private Object credential = new Object();
    
      @GuardedBy("credential")
      private int amount;
    }

    上記のコードセグメントでは、誰かが認証情報の同期ロックを取得した場合、金額にアクセスできるため、BankAccountの金額は認証情報によって保護される.このクラスに何かを追加しましょう.
    public class BankAccount {
      private Object credential = new Object();
    
      @GuardedBy("credential")
      private int amount;
    
      @GuardedBy("listOfTransactions")
      private List listOfTransactions;
    }

    私たちは今BankAccountのトランザクションリストを持っています.Listオブジェクトには多くの要素があるため、リスト内のすべての要素への参照があります.ここでは@GuardedBy("listOfTransactions")を使用して、listOfTransactionsが参照するオブジェクトにロックが関連付けられていることを指定します.すなわち、リストオブジェクトのロックを維持するために、すべてのトランザクションのロックを持つ必要がある人がいる.