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ć?
java
concurrency
kotlin
vach
źródło
źródło
Odpowiedzi:
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 ExamplePoza Coroutines Kotlin masz następujące opcje:
@Synchronized
oraz@Volatile
adnotacje, które odwzorowują bezpośrednio te same słowa kluczowe w Javiesynchronized
bloki, które w Kotlinie pochodzą z funkcji inlinesynchronized()
.Kotlin.concurrent
pakiet i rozszerzenia o nowe funkcje, a także rozszerzenia do klas JDK.java.util.concurrent
pakiecie , takie jakConcurrentHashMap
,CountdownLatch
,CyclicBarrier
,Semaphore
, ...java.util.concurrent.locks
pakiecie, a Kotlin ma rozszerzenia dla kilku z nich, w tym fajnąwithLock()
funkcję rozszerzenia i podobneread
/write
rozszerzenia dlaReentrantReadWriteLock
.java.util.concurrent.atomic
pakiecie , takie jakAtomicReference
,AtomicLong
...wait
inotify
na przedmiotachMasz 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(...) }
źródło
CountDownLatch
tylko przeniesienie próbek Java lub w przypadku Kovenant wyświetl dokumentację dla lib.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)
źródło