Pourquoi n'y a-t-il pas de mots-clés pour la synchronisation/l'accès simultané?
Jusqu'à présent, mes recherches m'ont fourni une solution: vous encapsulez des classes de haut niveau et les utilisez pour gérer la concurrence.
Étant donné un projet en Kotlin pur, que faire si on a besoin d’un petit composant hautement optimisé qui gère la concurrence, etc.?
Mon impression est que Kotlin est un langage d'assistance pour Java, permettant d'écrire 90% du code dans Kotlin mais comportant du code Java qu'il n'est pas possible d'exprimer avec Kotlin.
Est-ce correct? Est-ce ainsi que cela devait être?
Kotlin 1.1 avec Coroutines a été publié et il est accompagné de async..await
! En savoir plus à ce sujet dans documentation de référence Kotlin , bibliothèque Kotlinx Coroutines et cette grande profondeur Couroutines par exemple
En dehors des Koutlin Coroutines, vous disposez des options suivantes:
@Synchronized
et @Volatile
annotations mappant directement les mêmes mots-clés en Javasynchronized
blocs qui, dans Kotlin, proviennent d'une fonction inline synchronized()
.Kotlin.concurrent
Et extensions avec de nouvelles fonctions ainsi que des extensions de classes JDK.Java.util.concurrent
, tel que ConcurrentHashMap
, CountdownLatch
, CyclicBarrier
, Semaphore
, ...Java.util.concurrent.locks
et Kotlin a extensions pour quelques-unes y compris le cool withLock()
fonction d'extension et similaire read
/write
extensions pour ReentrantReadWriteLock
.Java.util.concurrent.atomic
tel que AtomicReference
, AtomicLong
, ...wait
et notify
sur des objetsVous avez tout Java a et plus. Votre phrase "synchronisation et verrous" est satisfaite par la liste ci-dessus, puis vous en avez encore plus et sans changement de langue . Toutes les fonctionnalités linguistiques le rendraient un peu plus joli.
Vous pouvez donc avoir du code Kotlin à 100%, en utilisant le petit runtime Kotlin, le runtime JVM du JDK et toute autre bibliothèque JVM que vous souhaitez utiliser. Pas besoin de code Java, seulement des bibliothèques Java (as-in JVM)).
Un échantillon rapide de certaines fonctionnalités:
class SomethingSyncd {
@Synchronized fun syncFoo() {
}
val myLock = Any()
fun foo() {
synchronized(myLock) {
// ... code
}
}
@Volatile var thing = mapOf(...)
}