Warum gibt es in Kotlin keine Parallelitätsschlüsselwörter?

81

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?

vach
quelle
24
Kotlin hat synchronisierte Blöcke ( kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html ), synchronisierte Methoden ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized ) und ein flüchtiges Feld ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/… ). Und es kann java.util.concurrent-Klassen verwenden. was genau suchst du?
JB Nizet
1
Sie haben hier mehr als eine Frage, Sie sollten sich auf ein Thema konzentrieren. Welche Parallelitätssachen fehlen Ihrer Meinung nach? Sie geben etwas an, das für mich so klingt, als würde es NICHT fehlen. Dann ist die andere Frage nicht wirklich eine SO-Frage und basiert auf Meinungen (und ist keine korrekte Behauptung).
Jayson Minard
1
Unter: github.com/Kotlin/kotlinx.coroutines finden Sie Aktualisierungen der Kotlin-Coroutinen
Jayson Minard,

Antworten:

141

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 Example

Außerhalb der Kotlin Coroutines haben Sie folgende Möglichkeiten:

Sie 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(...)
}
Jayson Minard
quelle
1
Irgendwelche Beispiele? cos wenn ich synchronize on method schreibe, wird es einfach nicht dauern ... dasselbe gilt für volatile ...
vach
2
@vach Ich habe in meinem Kommentar unter Ihrer Frage Links angegeben. Synchronisiert und flüchtig sind Anmerkungen.
JB Nizet
@vach Wenn Sie Code haben, den Sie ausprobiert haben, sollte dieser zusammen mit einer Fehlermeldung in Ihrer Frage enthalten sein.
Jayson Minard
1
@JBNizet Ich habe in Ihren Links zusammengeführt
Jayson Minard
1
@vach Ich habe ein kurzes Beispiel für Anmerkungen zu dieser Frage hinzugefügt, z. B. CountDownLatchnur Java-Port-Beispiele oder für Kovenant die Dokumente für die Bibliothek anzeigen.
Jayson Minard
3

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ß)

vach
quelle