15

C# では非常に簡単です。

class Class1{
  private static readonly object locker = new object();
  void Method1(){
    lock(locker) { .... }
  }
}

thisまた、デッドロックにつながる可能性があるため、同期を行うべきではありません。同様に、Scala では例を見ましたが、同期を行うために使用する必要がある同期とオブジェクト (フィールド) の基本原則が何であるかを理解できませんでした。

#1
def add(user: User) {
  // tokenizeName was measured to be the most expensive operation.
  val tokens = tokenizeName(user.name)

  tokens.foreach { term =>
    userMap.synchronized {
      add(term, user)
    }
  }
}

#2
class Person(var name: String) {
  def set(changedName: String) {
    this.synchronized {
      name = changedName
    }
  }
}

#3 and so on...

はっきりさせてくれませんか?

4

3 に答える 3

16
  1. Scala でオブジェクトをロックすることは、Java で静的フィールド/クラスをロックすることと同じであり、基本的に「最も難しい」ロックの 1 つです。クラスのインスタンスではなく、クラスローダーのスコープ内のクラス自体に対する操作をブロックします。このようなロックを導入するときは、慎重に検討する必要があります。取得されたロックの順序が正しくないためにデッドロックが発生することはありませんが、スレッドがクラスの異なるインスタンスで動作している場合はスレッドがブロックされ、まったく干渉しない可能性があります。

  2. 「this」または一部のクラス(オブジェクトではない)フィールド(ミューテックス)をロックすることは、同期のよりリラックスした方法です。クラスではなく、このクラスの特定のインスタンスへのアクセスを管理するために使用する必要があります。

  3. akkaのアクターを見ると、同期に関する問題の多くが揺らいで解消されます。

補足: 「this」で同期を行うことは、デッドロックを意味するものではありません。

于 2013-06-16T04:11:54.113 に答える