¿Por qué no hay palabras clave de concurrencia en Kotlin?

81

¿Por qué no hay palabras clave para sincronización / simultaneidad?

Hasta ahora, mi investigación me brinda una solución, envuelve algunas clases de alto nivel y las usa para manejar la concurrencia.

Dado un proyecto en Kotlin puro, ¿qué se debe hacer si se necesita un componente pequeño altamente optimizado que maneje la concurrencia, etc.?

Mi impresión es que Kotlin es un lenguaje de ayuda para Java, para escribir el 90% del código en Kotlin pero tiene algún código Java que no es posible expresar con Kotlin.

¿Es esto correcto? ¿Es así como se pretendía que fuera?

vach
fuente
24
Kotlin tiene bloques sincronizados ( kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html ), métodos sincronizados ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized ), campo volátil ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/… ). Y puede usar clases java.util.concurrent. ¿Que es exactamente lo que está buscando?
JB Nizet
1
Tienes más de una pregunta aquí, debes enfocarte en un tema. ¿Qué cosas de concurrencia crees que faltan? Especificas algo que me parece que NO falta. Entonces la otra pregunta no es realmente una pregunta SO y se basa en opiniones (y no es una afirmación correcta).
Jayson Minard
1
ver: github.com/Kotlin/kotlinx.coroutines para actualizaciones de las corutinas de Kotlin
Jayson Minard

Respuestas:

141

¡Kotlin 1.1 con Coroutines fue lanzado y trae consigo async..await! Lea más sobre esto en los documentos de referencia de Kotlin , la biblioteca de Kotlinx Coroutines y este gran Couroutines en profundidad por ejemplo

Fuera de Kotlin Coroutines, tiene estas opciones:

Tienes todo lo que tiene Java y más. Su frase "sincronización y bloqueos" se satisface con la lista anterior, y luego tiene aún más y sin cambios de idioma. Cualquier característica del idioma solo lo haría un poco más bonito.

Por lo tanto, puede tener código 100% Kotlin, utilizando el tiempo de ejecución pequeño de Kotlin, el tiempo de ejecución de JVM del JDK y cualquier otra biblioteca de JVM que desee usar. No se necesita código Java, solo bibliotecas Java (como en JVM).

Una muestra rápida de algunas características:

class SomethingSyncd {
    @Synchronized fun syncFoo() {

    }

    val myLock = Any()

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

    @Volatile var thing = mapOf(...)
}
Jayson Minard
fuente
1
¿Algún ejemplo? porque si escribo sincronizar en el método, simplemente no lo tomará ... lo mismo con volátil ...
vach
2
@vach Di enlaces en mi comentario, bajo tu pregunta. Sincronizados y volátiles son anotaciones.
JB Nizet
@vach, si tiene un código que probó, debe incluirse en su pregunta junto con cualquier mensaje de error.
Jayson Minard
1
@JBNizet Me fusioné en sus enlaces
Jayson Minard
1
@vach Agregué una muestra rápida de anotaciones relacionadas con esta pregunta, cosas como CountDownLatchsolo muestras de Java portuarias, o para Kovenant, vea los documentos de la lib.
Jayson Minard
3

Responderé mi propia pregunta ya que la respuesta real a mi pregunta estaba en algún lugar profundo de las discusiones de Kotlin.

Lo que me confundió en el momento en que venía de Java fue que las palabras clave de concurrencia no eran palabras clave de idioma, eran anotaciones. Me pareció extraño que conceptos importantes como la sincronización se manejaran a través de la anotación, pero ahora tiene mucho sentido. Kotlin va en la dirección de ser un lenguaje agnóstico de plataforma, no solo funcionará en jvm sino en casi cualquier cosa. Así que sincronizados y volátiles eran muy específicos de jvm, por lo que podrían no ser necesarios en javascript, por ejemplo.

En pocas palabras, kotlin tiene todo lo que tiene java (excepto la visibilidad del paquete) y mucho más, una gran diferencia que ningún otro lenguaje tiene son las corrutinas. Pero no hay nada que puedas escribir en java que no puedas hacer en kotlin ... (hasta donde yo sé)

vach
fuente