Ringkasan
Baru-baru ini, saya membaca "Berpikir di Java". dan sangat mendasar.
1. Volatile
Volatile terutama digunakan untuk menyinkronkan variabel dalam multithreads.
Secara umum, untuk meningkatkan kinerja, setiap utas akan menyimpan variabel dalam memori utama sebagai salinan variabel dalam memori sendiri saat berjalan, tetapi mudah untuk menyebabkan variabel replika yang tidak konsisten disimpan dalam banyak utas. Nilai variabel dalam memori utama.
Ketika variabel dimodifikasi dengan volatile, variabel tidak dapat di -cache ke dalam memori utas. "." Salinan variabel area memori, jadi ketika variabel berubah, semua utas yang memanggil variabel akan mendapatkan nilai yang sama, yang memastikan visibilitas variabel dalam aplikasi (ketika tugas dimodifikasi dalam aplikasi harus visual ), dan kinerjanya juga telah dikurangi (meskipun lebih tinggi dari disinkronkan).
Namun, perlu dicatat bahwa volatil hanya dapat memastikan bahwa operasi adalah bagian yang sama, dan tidak dapat menjamin atomisitas operasi. Oleh karena itu, volatil umumnya digunakan untuk mendeklarasikan variabel tipe sederhana, sehingga variabel -variabel ini bersifat atom, yaitu, beberapa penugasan sederhana dan operasi pengembalian akan dipastikan bahwa mereka tidak terganggu. Namun, ketika nilai variabel ditentukan oleh yang sebelumnya, peran volatil akan tidak valid, yang ditentukan oleh sifat kata kunci yang mudah menguap.
Oleh karena itu, berhati -hatilah saat tidak stabil.
2.Treadlocal
Pertama -tama, Threadlocal tidak memiliki hubungan sepeser pun dengan utas lokal, dan ini bukan utas khusus. Menggunakan variabel, sehingga masing -masing utas dapat secara independen mengubah salinannya sendiri tanpa mempengaruhi salinan yang sesuai ke utas lain. Ini sebenarnya adalah cara pertukaran ruang untuk waktu (sebagai lawan disinkronkan), yang sangat mengurangi konsumsi kinerja yang dibawa oleh sinkronisasi utas (seperti disinkronkan) dan mengurangi kompleksitas kontrol bersamaan utas dengan biaya memori.
Saya pribadi berpikir contoh khas adalah penggunaan threadlocal dalam kode sumber Android tentang Looper, yang juga mencakup penggunaan dasar threadlocal.
Kelas Publik Looper {Private Static Final String Tag = "Looper"; // sthreadlocal.get () akan mengembalikan null kecuali Anda telah memanggil persiapan (). private static looper mmainlooper = null; ...... public static final void () {if (sthreadlocal.get ()! = null) {lempar runimeException baru ("Hanya satu looper yang dapat dibuat per utas"); sthreadlocal.set (looper baru ()); looper) {mmainlover = looper; ..}
Tetapi harus dicatat bahwa meskipun threadlocal dan disinkronkan keduanya digunakan untuk menyelesaikan akses bersamaan multi-thread, masih ada perbedaan mendasar antara threadlocal dan disinkronkan. Sinkronisasi menggunakan mekanisme kunci sehingga variabel atau blok kode hanya dapat diakses oleh satu utas pada waktu tertentu. ThreadLocal menyediakan salinan variabel untuk setiap utas, sehingga setiap utas tidak mengakses objek yang sama pada waktu tertentu, yang mengisolasi data berbagi data dengan beberapa utas. Sinkronisasi adalah sebaliknya, digunakan untuk mendapatkan berbagi data saat berkomunikasi di antara beberapa utas. Artinya, disinkronkan digunakan untuk berbagi data antara utas, sedangkan threadlocal digunakan untuk isolasi data antara utas. Oleh karena itu, threadlocal tidak dapat menggantikan sinkronisasi, dan disinkronkan memiliki rentang fungsi yang lebih luas (mekanisme sinkronisasi).
3.Snchronized
Kata kunci yang disinkronkan secara otomatis diimplementasikan oleh Java menggunakan mekanisme kunci. Semua objek di Java secara otomatis berisi satu kunci (juga dikenal sebagai monitor). Ketika metode yang disinkronkan dipanggil pada objek, objek ini dikunci (tugas dapat memperoleh kunci objek beberapa kali, dan jumlah akan bertambah.), Dan sebelum utas kembali dari metode ini, semua utas lain di objek yang ingin memanggil metode yang ditandai disinkronkan di kelas akan diblokir. Tentu saja ada juga kunci untuk setiap kelas (sebagai bagian dari objek kelas kelas), jadi Anda tahu ^. ^.
Akhirnya, penting untuk dicatat bahwa disinkronkan adalah cara teraman dalam mekanisme sinkronisasi.