Warum gibt es keine Schlüsselwörter für Synchronisation / Parallelität?
Bisher gibt mir meine Forschung eine Lösung: Sie wickeln einige Klassen auf hoher Ebene ein und verwenden sie, um die Parallelität zu behandeln.
Was ist bei einem Projekt in reinem Kotlin zu tun, wenn eine kleine, hochoptimierte Komponente für die Parallelität usw. benötigt wird?
Mein Eindruck ist, dass Kotlin eine unterstützende Sprache für Java ist, um 90% des Codes in Kotlin zu schreiben, aber Java-Code zu haben, der mit Kotlin nicht ausgedrückt werden kann.
Ist das richtig? Ist es so beabsichtigt?
java
concurrency
kotlin
vach
quelle
quelle
Antworten:
Kotlin 1.1 mit Coroutines wurde veröffentlicht und bringt es mit sich
async..await
! Weitere Informationen finden Sie in den Kotlin-Referenzdokumenten , in der Kotlinx Coroutines-Bibliothek und in diesen ausführlichen Couroutines by ExampleAußerhalb der Kotlin Coroutines haben Sie folgende Möglichkeiten:
@Synchronized
und@Volatile
Anmerkungen, die denselben Schlüsselwörtern in Java direkt zugeordnet sindsynchronized
Blöcke, die in Kotlin aus einer Inline-Funktion stammensynchronized()
.Kotlin.concurrent
Paket und Erweiterungen mit neuen Funktionen sowie Erweiterungen für JDK-Klassen.java.util.concurrent
Paket wieConcurrentHashMap
,CountdownLatch
,CyclicBarrier
,Semaphore
, ...java.util.concurrent.locks
Paket zugreifen und Kotlin hat Erweiterungen für einige davon, einschließlich der coolenwithLock()
Erweiterungsfunktion und ähnlicherread
/write
Erweiterungen fürReentrantReadWriteLock
.java.util.concurrent.atomic
Paket wieAtomicReference
,AtomicLong
, ...wait
undnotify
auf Objekten verwendenSie haben alles, was Java hat und noch mehr. Ihr Satz "Synchronisation und Sperren" wird durch die obige Liste erfüllt, und dann haben Sie noch mehr und ohne Sprachänderungen. Alle Sprachfunktionen würden es nur ein bisschen schöner machen.
Sie können also 100% Kotlin-Code verwenden, indem Sie die kleine Kotlin-Laufzeit, die JVM-Laufzeit aus dem JDK und jede andere JVM-Bibliothek verwenden, die Sie verwenden möchten. Kein Java-Code erforderlich, nur Java-Bibliotheken (wie in JVM).
Ein kurzes Beispiel einiger Funktionen:
class SomethingSyncd { @Synchronized fun syncFoo() { } val myLock = Any() fun foo() { synchronized(myLock) { // ... code } } @Volatile var thing = mapOf(...) }
quelle
CountDownLatch
nur Java-Port-Beispiele oder für Kovenant die Dokumente für die Bibliothek anzeigen.Ich werde meine eigene Frage beantworten, da die eigentliche Antwort auf meine Frage irgendwo tief in Kotlin-Diskussionen war.
Was mich zu der Zeit, als ich von Java kam, verwirrte, war, dass Parallelitätsschlüsselwörter keine Sprachschlüsselwörter waren, sondern Anmerkungen? Für mich schien es seltsam, dass wichtige Konzepte wie die Synchronisation durch Annotation behandelt wurden, aber jetzt macht es vollkommen Sinn. Kotlin geht in Richtung plattformunabhängige Sprache, es wird nicht nur auf jvm funktionieren, sondern so ziemlich alles. So synchronisiert und flüchtig waren jvm sehr spezifisch, dass sie beispielsweise in Javascript möglicherweise nicht benötigt werden.
Kurz gesagt, Kotlin hat alles, was Java hat (außer die Sichtbarkeit von Paketen) und vieles mehr. Ein großer Unterschied, den keine andere Sprache hat, sind Coroutinen. Aber es gibt nichts, was Sie in Java schreiben können, was Sie in Kotlin nicht tun können ... (soweit ich weiß)
quelle