Dlaczego w Kotlinie nie ma słów kluczowych współbieżnych?

84

Dlaczego nie ma słów kluczowych do synchronizacji / współbieżności?

Jak dotąd moje badania dają mi jedno rozwiązanie - zawijasz kilka klas wysokiego poziomu i używasz ich do obsługi współbieżności.

Biorąc pod uwagę projekt w czystym Kotlinie, co należy zrobić, jeśli istnieje potrzeba małego, wysoce zoptymalizowanego komponentu, który obsługuje współbieżność itp.?

Mam wrażenie, że Kotlin jest językiem pomocniczym dla Javy, do pisania 90% kodu w Kotlinie, ale ma trochę kodu java, którego nie można wyrazić za pomocą Kotlin.

Czy to jest poprawne? Czy tak miało być?

vach
źródło
24
Kotlin ma zsynchronizowane bloki ( kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html ), zsynchronizowane metody ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized ), zmienne pole ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/… ). I może używać klas java.util.concurrent. Czego dokładnie szukasz?
JB Nizet
1
Masz więcej niż jedno pytanie, powinieneś skupić się na jednym temacie. Jak myślisz, jakich elementów współbieżności brakuje, określasz coś, co wydaje mi się, że NIE brakuje. Wtedy drugie pytanie nie jest tak naprawdę pytaniem SO i opiera się na opinii (i nie jest poprawnym stwierdzeniem).
Jayson Minard,
1
zobacz: github.com/Kotlin/kotlinx.coroutines, aby uzyskać aktualizacje do programów Kotlin
Jayson Minard

Odpowiedzi:

143

Kotlin 1.1 z Coroutines został wydany i przynosi ze sobą async..await! Przeczytaj więcej na ten temat w dokumentach referencyjnych Kotlin , bibliotece Kotlinx Coroutines i tym bardzo dogłębnym Couroutines by Example

Poza Coroutines Kotlin masz następujące opcje:

Masz wszystko, co ma Java i więcej. Twoja fraza „synchronizacja i blokady” jest zadowolona z powyższej listy, a wtedy masz jeszcze więcej i bez zmiany języka. Wszelkie funkcje językowe sprawiłyby, że byłby tylko trochę ładniejszy.

Możesz więc mieć 100% kod Kotlin, używając małego środowiska uruchomieniowego Kotlin, środowiska wykonawczego JVM z JDK i dowolnej innej biblioteki JVM, której chcesz użyć. Nie potrzeba kodu Java, tylko biblioteki Java (jak w JVM).

Krótka próbka niektórych funkcji:

class SomethingSyncd {
    @Synchronized fun syncFoo() {

    }

    val myLock = Any()

    fun foo() {
        synchronized(myLock) {
            // ... code
        }
    }

    @Volatile var thing = mapOf(...)
}
Jayson Minard
źródło
1
Jakieś przykłady? bo jeśli napiszę synchronizuj metodą, po prostu nie weźmie tego ... tak samo z volatile ...
vach
2
@vach Podałem linki w moim komentarzu pod twoim pytaniem. Zsynchronizowane i niestabilne to adnotacje.
JB Nizet,
@vach, jeśli wypróbowałeś kod, powinien on znaleźć się w Twoim pytaniu wraz z komunikatem o błędzie.
Jayson Minard
1
@JBNizet Połączyłem w twoich linkach
Jayson Minard
1
@vach Dodałem krótką próbkę adnotacji związanych z tym pytaniem, rzeczy takie jak CountDownLatchtylko przeniesienie próbek Java lub w przypadku Kovenant wyświetl dokumentację dla lib.
Jayson Minard
3

Odpowiem na moje własne pytanie, ponieważ rzeczywista odpowiedź na moje pytanie była gdzieś głęboko w dyskusjach kotlina.

Co mnie zdezorientowało, gdy przechodziłem z javy, to fakt, że słowa kluczowe współbieżności nie były słowami kluczowymi języka, ale były adnotacjami? Wydawało mi się dziwne, że ważne pojęcia, takie jak synchronizacja, były obsługiwane przez adnotacje, ale teraz ma to doskonały sens. Kotlin zmierza w kierunku bycia platformowym językiem agnostycznym, nie będzie działać tylko na jvm, ale prawie na wszystkim. Tak więc zsynchronizowane i niestabilne były bardzo specyficzne dla jvm, mogą nie być potrzebne na przykład w javascript.

Krótko mówiąc, kotlin ma wszystko, co ma java (poza widocznością pakietów) i wiele więcej, ogromną różnicą, której nie ma żaden inny język, są procedury. Ale nie ma nic, co możesz napisać w Javie, czego nie możesz zrobić w Kotlinie ... (o ile wiem)

vach
źródło