Чому в Котліні немає ключових слів одночасності?


84

Чому немає ключових слів для синхронізації / паралельності?

Поки моє дослідження дає мені одне рішення, ви обгортаєте кілька класів високого рівня і використовуєте їх для обробки паралельності.

Що стосується проекту в чистому Котліні, що робити, якщо є потреба в невеликому високооптимізованому компоненті, який обробляє паралельність тощо?

У мене таке враження, що Kotlin є допоміжною мовою для Java, щоб написати 90% коду в Kotlin, але має певний код Java, який неможливо висловити за допомогою Kotlin.

Чи це правильно? Це так було задумано?



24
Kotlin має синхронізовані блоки ( kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html ), синхронізовані методи ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized ), летке поле ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/… ). І він може використовувати паралельні класи java.util.concurrent. Що саме ви шукаєте?
JB Nizet

1
У вас тут більше одного запитання, вам слід зосередитися на одній темі. Як ви вважаєте, яких спільних речей не вистачає, ви вказуєте щось, що для мене здається таким, що НЕ відсутнє. Тоді інше питання насправді не є СО питанням і засноване на думці (і не є правильним твердженням).
Джейсон Мінар

1
див .: github.com/Kotlin/kotlinx.coroutines для оновлення програм Kotlin
Jayson Minard

Відповіді:


143

Випущено Kotlin 1.1 з Coroutines, і він приносить із собою async..await! Детальніше про це читайте у довідкових документах Kotlin , бібліотеці Kotlinx Coroutines і цих чудових Couroutines на прикладі

За межами котлінської програми Kotlin у вас є такі варіанти:

У вас є все, що є у Java та багато іншого. Ваша фраза "синхронізація та блокування" відповідає наведеному вище списку, і тоді у вас ще більше і без мовних змін. Будь-які мовні особливості лише роблять його трохи гарнішим.

Отже, ви можете мати 100% код Kotlin, використовуючи невеликий час виконання Kotlin, час виконання JVM від JDK та будь-яку іншу бібліотеку JVM, яку ви хочете використовувати. Не потрібно код Java, лише бібліотеки Java (як у JVM).

Короткий зразок деяких функцій:

class SomethingSyncd {
    @Synchronized fun syncFoo() {

    }

    val myLock = Any()

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

    @Volatile var thing = mapOf(...)
}

1
Будь-які приклади? тому що якщо я пишу синхронізацію методу, це просто не візьметься ... те саме з мінливою ...
vach

2
@vach Я дав посилання у своєму коментарі на ваше запитання. Синхронізовані та летючі - це анотації.
JB Nizet

@vach, якщо у вас є код, який ви спробували, його слід включити у ваше запитання разом із повідомленням про помилку.
Джейсон Мінар

1
@JBNizet Я об’єднав ваші посилання
Джейсон Мінар

1
@vach Я додав короткий зразок анотацій, що стосуються цього питання, таких як CountDownLatchпросто портувати Java-зразки, або для Kovenant, переглянути документи для lib.
Джейсон Мінар

3

Я відповім на власне запитання, оскільки фактична відповідь на моє запитання була десь глибоко в дискусіях про Kotlin.

Мене бентежило під час виходу з Java те, що ключові слова-паралелі не були ключовими словами мови, а анотаціями? мені здалося дивним, що такі важливі поняття, як синхронізація, обробляються за допомогою анотації, але зараз це цілком логічно. Котлін йде в напрямку того, щоб бути агностичною мовою платформи, це не буде працювати лише на jvm, а майже на все. Тож синхронізовані та нестабільні були дуже специфічними для jvm, вони можуть не знадобитися, наприклад, у javascript.

У двох словах, у kotlin є все, що є у Java (крім видимості пакета), і багато іншого, величезна різниця, яку не має жодна інша мова, - це спільні програми. Але в Java ви нічого не можете написати, чого не можете зробити у kotlin ... (наскільки мені відомо)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.