Tại sao không có từ khóa đồng thời trong Kotlin?


82

Tại sao không có từ khóa nào cho đồng bộ hóa / đồng thời?

Cho đến nay, nghiên cứu của tôi mang lại cho tôi một giải pháp, bạn bọc một số lớp cấp cao và sử dụng chúng để xử lý đồng thời.

Với một dự án bằng Kotlin thuần túy, người ta sẽ làm gì nếu cần một thành phần nhỏ được tối ưu hóa cao để xử lý đồng thời, v.v.?

Ấn tượng của tôi là Kotlin là một ngôn ngữ hỗ trợ cho Java, để viết 90% mã bằng Kotlin nhưng có một số mã java không thể diễn đạt bằng Kotlin.

Thê nay đung không? Đây có phải là cách nó được dự định?



24
Kotlin đã đồng bộ hóa các khối ( kotlinlang.org/api/latest/jvm/stdlib/kotlin/synchronized.html ), các phương pháp đồng bộ hóa ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-synchronized ), trường biến động ( kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-volatile/… ). Và nó có thể sử dụng các lớp java.util.concurrent. Chính xác thì bạn đang tìm điều gì?
JB Nizet

1
Bạn có nhiều hơn một câu hỏi ở đây, bạn nên tập trung vào một chủ đề. Bạn nghĩ là còn thiếu những thứ đồng thời nào, bạn chỉ định một thứ gì đó mà tôi nghe có vẻ là KHÔNG thiếu. Sau đó, câu hỏi khác không thực sự là một câu hỏi SO và dựa trên ý kiến ​​(và không phải là một khẳng định đúng).
Jayson Minard

1
xem: github.com/Kotlin/kotlinx.coroutines các bản cập nhật để coroutines Kotlin
Jayson Minard

Câu trả lời:


141

Kotlin 1.1 với Coroutines đã được phát hành và nó mang theo async..await! Đọc thêm về nó trong tài liệu tham khảo Kotlin , thư viện Kotlinx CoroutinesCouroutines chuyên sâu tuyệt vời này bằng Ví dụ

Bên ngoài Kotlin Coroutines, bạn có các tùy chọn sau:

Bạn có mọi thứ mà Java có và hơn thế nữa. Danh sách trên đã thỏa mãn cụm từ "đồng bộ hóa và khóa" của bạn, và sau đó, bạn thậm chí có nhiều hơn và không có thay đổi ngôn ngữ. Bất kỳ tính năng ngôn ngữ nào sẽ chỉ làm cho nó đẹp hơn một chút.

Vì vậy, bạn có thể có 100% mã Kotlin, sử dụng thời gian chạy Kotlin nhỏ, thời gian chạy JVM từ JDK và bất kỳ thư viện JVM nào khác mà bạn muốn sử dụng. Không cần mã Java, chỉ cần các thư viện Java (as-in JVM).

Một số mẫu nhanh về một số tính năng:

class SomethingSyncd {
    @Synchronized fun syncFoo() {

    }

    val myLock = Any()

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

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

1
Có ví dụ nào không? cos nếu tôi viết đồng bộ hóa trên phương thức nó sẽ không lấy nó ... tương tự với dễ bay hơi ...
vach

2
@vach Tôi đã đưa ra các liên kết trong bình luận của tôi, dưới câu hỏi của bạn. Đồng bộ hóa và Biến động là các chú thích.
JB Nizet

@vach nếu bạn có mã bạn đã thử, nó sẽ được đưa vào câu hỏi của bạn cùng với bất kỳ thông báo lỗi nào.
Jayson Minard

1
@JBNizet Tôi đã hợp nhất trong các liên kết của bạn
Jayson Minard

1
@vach Tôi đã thêm một mẫu chú thích nhanh liên quan đến câu hỏi này, những thứ như CountDownLatchchỉ mẫu cổng Java hoặc cho Kovenant, hãy xem tài liệu cho lib.
Jayson Minard

3

Tôi sẽ trả lời câu hỏi của riêng mình vì câu trả lời thực sự cho câu hỏi của tôi nằm ở đâu đó sâu trong các cuộc thảo luận về kotlin.

Điều khiến tôi bối rối tại thời điểm bắt đầu từ java là các từ khóa đồng thời không phải là các từ khóa ngôn ngữ mà chúng là các chú thích? đối với tôi, có vẻ kỳ lạ khi các khái niệm quan trọng như đồng bộ hóa được xử lý bằng chú thích cuối cùng, nhưng bây giờ nó có ý nghĩa hoàn hảo. Kotlin đang đi theo hướng là ngôn ngữ bất khả tri nền tảng, nó sẽ không chỉ hoạt động trên jvm mà còn khá nhiều thứ. Vì vậy, đồng bộ hóa và dễ bay hơi là rất đặc trưng cho jvm, chúng có thể không cần thiết trong javascript.

Tóm lại, kotlin có mọi thứ mà java có (ngoại trừ khả năng hiển thị gói) và hơn thế nữa, một điểm khác biệt rất lớn mà không ngôn ngữ nào khác có được là coroutines. Nhưng không có gì bạn có thể viết trong java mà bạn không thể làm trong kotlin ... (theo như tôi biết)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.