In Scala gibt es eine synchronisierte Methode für AnyRef, mit der Sie jedes Objekt synchronisieren können, das AnyRef erweitert. Allerdings ist es auf AnyRef abstrakt, und ich konnte nicht herausfinden, wie es funktionierte, die Scala-Quelle zu übermalen. Es scheint so, als ob es das synchronisierte Schlüsselwort in Java ausnutzt. Ist das der Fall?Wie wird die synchronisierte Methode auf AnyRef implementiert?
Antwort
1) AnyRef.synchronized
ist eine magische Methode, die im Quellcode nicht existiert, aber bei jedem Start des Compilers in die Symboltabelle des Compilers eingefügt wird: Definitions.scala. Es gibt übrigens eine Reihe von magischen Methoden und Klassen().
2) Wenn eine Methode in this.synchronized
gewickelt wird, wird die Verpackung fallen gelassen, und das Verfahren ist im Inneren mit einer SYNCHRONIZED
Flag (UnCurry.scala) annotiert, die dann auf der JVM abgebildet wird `ACC_SYNCHRONIZED Methode Zugriffsflag (GenASM.scala).
3) Andere Anrufe synchronized
werden auf das Primitive SYNCHRONIZED
(backend/ScalaPrimitives.scala) Backend kartiert, die später in monitorenter/monitorexit abgesenkt (GenICode.scala #1, GenICode.scala #2).
Nur um die Antwort von Eugene, der den Compiler auswendig kennt, hinzuzufügen, hier ist eine kleine Scala-Konsolensitzung.
Die Quintessenz: Der generierte Code ist genau identisch mit dem, was Sie in Java erhalten würden. Für den synchronisierten {...} und nicht einmal für einen Methodenaufruf wird keine Sperrung generiert. Nur ein Versuch/catch, wo zu Beginn des Versuches gibt es einen monitorenter Bytecode (3) und beide in der normalen Ausgang (9) und in der Fang-Ausgang (12) gibt es einen Monitorexit. So gibt es keinen Aufwand bei der Verwendung synchronisiert in Scala vs Verwendung in Java.
Beachten Sie, dass die meisten Leute zustimmen, dass die Verwendung von gefährlichen Thread-Synchronisierungskonstrukten für niedrige Werte für jedes Objekt im Allgemeinen als eine schlechte Idee betrachtet wird, die nur für Java-Kompatibilität durchgeführt wurde.
scala> class Test { def test { this.synchronized { } } }
defined class Test
scala> :javap -c Test
Compiled from "<console>"
public class Test extends java.lang.Object implements scala.ScalaObject{
public void test();
Code:
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: getstatic #12; //Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
7: pop
8: aload_1
9: monitorexit
10: return
11: aload_1
12: monitorexit
13: athrow
Exception table:
from to target type
4 10 11 any
- 1. Wie wird die Java # intern() Methode implementiert?
- 2. Wie wird die http-Post-Methode implementiert?
- 3. Wie wird die 'NSTableview Delegate' Methode implementiert?
- 4. Java synchronisierte Methode
- 5. synchronisierte Methode für die Parallelität in Ruby
- 6. Wie funktioniert die synchronisierte Methode mit zusammengesetzten Objekten?
- 7. Wie wird die Stream.CopyTo (Stream) -Methode in .NET 4 implementiert?
- 8. Wie wird die Laufzeitlizenzierung implementiert?
- 9. Wie implementiert man die Methode onNavigationItemSelected?
- 10. Wie die Methode hashCode() in der Klasse Object implementiert wird?
- 11. Wie wird die Abhängigkeitseigenschaft implementiert?
- 12. Synchronisierte Methode von Android Activity onCreate Methode
- 13. Java synchronisierte Methodensperre für Objekt oder Methode?
- 14. Wie wird die UIViewController-Rotation als Reaktion auf Orientierungsänderungen implementiert?
- 15. Wie implementiert man die Linq OrderBy-Methode?
- 16. synchronisierte Methode nicht blockiert andere Threads
- 17. Warum die synchronisierte Methode nicht für Multithread funktioniert
- 18. Warum die synchronisierte Methode nicht in der Schnittstelle enthalten ist
- 19. Wie wird die Koppelnavigation beim Drehen implementiert?
- 20. Wie wird set() implementiert?
- 21. Wie wird die ereignisgesteuerte Programmierung implementiert?
- 22. Wie wird pthread_join implementiert?
- 23. Wie wird Serializable implementiert?
- 24. Wie wird Sleep auf Betriebssystemebene implementiert?
- 25. Wie wird OpenID implementiert?
- 26. Wie wird die Leinwandanimation auf der Apple Watch-Website implementiert?
- 27. Wie wird __RTC_CheckEsp implementiert?
- 28. in unserem Code Quick-Methode wird wie folgt implementiert? Welchen Vorteil bietet die schnelle Methode?
- 29. Wie wird die feste Seitenleiste korrekt implementiert?
- 30. Wie wird die Save/Load-Funktionalität implementiert?