Was für ein Objekt synchronisiere ich auf in Scala?
In C# es ist ziemlich einfach:
class Class1{
private static readonly object locker = new object();
void Method1(){
lock(locker) { .... }
}
}
Und ich auf jeden Fall nicht machen sollte, eine Synchronisierung auf this
da es möglicherweise zu einem deadlock führen. Ebenfalls in der Scala sah ich Beispiele und konnte nicht auf die Idee kommen, was ist das grundlegende Prinzip der Synchronisierung und Objekt (Feld) sollte ich verwenden, um eine Synchronisierung:
#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...
Würden Sie mir klar machte für mich?
InformationsquelleAutor der Frage | 2013-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schloss auf Objekt in Scala ist das gleiche wie mit der Sperre auf statische Feld/Klasse in Java, die im Grunde ist eine der 'härtesten' sperrt. Es werden block-Vorgänge nicht auf die Instanz der Klasse, sondern auf der Klasse selbst im Rahmen der class-loader. Sollten Sie denken Sie sorgfältig bei der Einführung von Schlössern wie diesem. Es nicht schützen Sie vor einem deadlock aufgrund von falschen Reihenfolge erworben Schlösser, sondern führt zum blockieren von threads, wenn diejenigen, die arbeiten mit verschiedenen Instanzen der Klasse, und kann nicht eingreifen überhaupt.
Schloss auf 'dieses' oder einige Klassen (nicht Objekt) Bereich (mutex) ist entspannter Art der Synchronisierung verwenden, sollten Sie es für die Verwaltung des Zugriffs nicht auf Klasse, sondern auf Besondere Instanz dieser Klasse.
Blick auf die Akteure in akkaSie rock und beseitigen viele der Probleme mit der Synchronisation.
Seite-Hinweis: die Synchronisierung auf "dieser" bedeutet nicht, deadlocks.
InformationsquelleAutor der Antwort jdevelop
In Scala ist es sogar noch einfacher, um das gleiche Verhalten (ich gehe davon aus, das Sie sperren möchten, auf das enthaltene Objekt aus irgendeinem Grund, z.B. mehr feinkörnige Kontrolle über die Verriegelung der gesamten Instanz der Klasse):
Aber Sie sollten nur selten Kontrolle über die Dinge auf diese Weise. Insbesondere, es wird nicht verhindern, dass deadlocks in C# oder Scala, ohne viel Aufmerksamkeit auf das, was geht in
...
.Sollten Sie mindestens verwenden Sie die Parallelität Werkzeuge in
java.util.concurrent
und möchten Sie vielleicht zu schauen, in futures-oder Schauspieler.InformationsquelleAutor der Antwort Rex Kerr
Wenn die Prämisse ist, dass Sie wollen, um zu vermeiden, sperren auf
this
da ein anderer thread mit third-party-code-Sperre auf dem selben Objekt, dann Scala bietet eine weitere Ebene der Sichtbarkeitprivate[this]
.Hier eigentlich keine anderen anderen Objekt als einer bestimmten Instanz von
C
zugreifen könnenlock
. Auch andere Instanzen von der gleichen Klasse zugreifen kannlock
.InformationsquelleAutor der Antwort huynhjl