Mari kita berpura-pura Anda paranoid dan paranoid ganda dalam hal multithreading. Misalkan Anda melakukan backend dari beberapa fungsionalitas aplikasi, dan aplikasi secara berkala menarik beberapa metode di server Anda. Semuanya tampak baik-baik saja, tetapi ada satu tetapi. Bagaimana jika fungsionalitas Anda secara langsung bergantung pada beberapa data lain, misalnya profil dangkal yang sama? Pertanyaannya adalah bagaimana memastikan bahwa skrip bekerja persis seperti yang Anda rencanakan dan tidak ada kejutan? Transaksi? Ya, itu bisa digunakan, tetapi bagaimana jika Anda seorang paranoid yang fantastis dan sudah membayangkan bagaimana 10 permintaan ke metode yang sama dari klien yang berbeda terbang ke server Anda dan semuanya secara ketat pada waktu yang sama. Dan saat ini, logika bisnis metode ini terkait dengan 100.500 data yang berbeda. Bagaimana Anda mengelola semua ini? Anda cukup menyinkronkan metode dan hanya itu.Tapi bagaimana jika ada juga permintaan yang tidak masuk akal untuk dipenuhi? Di sini kruk sudah dimulai. Saya telah mengajukan pertanyaan serupa beberapa kali, dan itu menarik, karena tugasnya sangat sederhana dan setiap hari (jika Anda peduli bahwa tidak ada bug logis, tentu saja). Hari ini saya memutuskan untuk memikirkan bagaimana ini dapat diterapkan dengan sangat sederhana dan tanpa kruk. Dan solusinya keluar dalam 100 baris kode.
Sedikit ilustrasi contoh
Mari kita asumsikan bahwa ada pengemudi dan penumpang. Pengemudi tidak dapat mengganti mobil sampai klien, misalnya, mengonfirmasi perjalanan. Ternyata klien setuju untuk melakukan perjalanan dengan karakteristik mobil yang sama, tetapi ternyata pengemudi memiliki mobil yang berbeda? Jangan lakukan itu! Anda dapat mengatur sesuatu seperti ini:
String result = l.lock(new ArrayList<Locker.Item>() {{
add(new Locker.Item(SimpleType.TRIP, 1));
add(new Locker.Item(SimpleType.USER, 2));
}}, () -> {
//
// - - USER=2 (),
// - TRIP=1
// USER=3, :)
// :)
return " :)";
});
Elegan dan sederhana!
Jangan melempar batu! )