Bagaimana saya bisa menggunakan AtomicBoolean dan untuk apa kelas itu?
java
concurrency
yart
sumber
sumber
volatile boolean
vsAtomicBoolean
: stackoverflow.com/questions/3786825/…Jawaban:
Ketika beberapa utas perlu memeriksa dan mengubah boolean. Sebagai contoh:
Ini bukan thread-safe. Anda dapat memperbaikinya dengan menggunakan
AtomicBoolean
:sumber
true
kapaninitialize()
belum selesai. Jadi, ini hanya berfungsi jika utas lainnya tidak peduli penyelesaiannyainitialize()
.initialized
hanya digunakan untuk memastikan bahwa satu dan hanya satu utas akan memanggilinitialize()
metode. Jelasinitialized
benar bukan berarti inisialisasi telah selesai dalam kasus ini, jadi mungkin istilah yang sedikit berbeda akan lebih baik di sini. Sekali lagi, itu tergantung pada apa yang digunakan untuk itu.volatile boolean
akan sama denganAtomicBoolean
?synchronized
blok, dalam hal ini Anda tidak perlu lagiAtomicBoolean
, hanya avolatile boolean
. (if(! this.initialized) { synchronized(this) { if(! this.initialized) { initialize(); this.initialized = true; } } }
akan memastikan bahwa hanya satu utas panggilaninitialize
, dan bahwa semua utas lainnya menunggu untuk melakukannya, asalkaninitialized
ditandaivolatile
.)Ini adalah catatan (dari buku Brian Goetz ) yang saya buat, yang mungkin bisa membantu Anda
Kelas AtomicXXX
menyediakan implementasi Bandingkan-dan-Tukar Non-pemblokiran
Mengambil keuntungan dari dukungan yang diberikan oleh perangkat keras (instruksi CMPXCHG pada Intel) Ketika banyak utas berjalan melalui kode Anda yang menggunakan API konkurensi atom ini, mereka akan berskala jauh lebih baik daripada kode yang menggunakan monitor / sinkronisasi tingkat objek. Karena, mekanisme sinkronisasi Java membuat kode menunggu, ketika ada banyak utas yang berjalan melalui bagian-bagian penting Anda, banyak waktu CPU dihabiskan untuk mengelola mekanisme sinkronisasi itu sendiri (menunggu, memberi tahu, dll.). Karena API baru menggunakan konstruksi tingkat perangkat keras (variabel atom) dan menunggu dan mengunci algoritma gratis untuk menerapkan keamanan ulir, lebih banyak waktu CPU dihabiskan untuk "melakukan hal-hal" daripada mengelola sinkronisasi.
tidak hanya menawarkan throughput yang lebih baik, tetapi mereka juga memberikan perlawanan yang lebih besar terhadap masalah kehidupan seperti kebuntuan dan inversi prioritas.
sumber
Ada dua alasan utama mengapa Anda dapat menggunakan boolean atom. Pertama bisa berubah, Anda bisa meneruskannya sebagai referensi dan mengubah nilai yang terkait dengan boolean itu sendiri, misalnya.
dan di kelas someObject
Lebih penting lagi, utasnya aman dan dapat menunjukkan kepada pengembang yang menjaga kelas, bahwa variabel ini diharapkan akan dimodifikasi dan dibaca dari beberapa utas. Jika Anda tidak menggunakan AtomicBoolean, Anda harus menyinkronkan variabel boolean yang Anda gunakan dengan mendeklarasikannya volatil atau menyinkronkan sekitar bidang baca dan tulis bidang.
sumber
The
AtomicBoolean
kelas memberi Anda nilai boolean yang Anda dapat memperbarui atom. Gunakan ketika Anda memiliki banyak utas yang mengakses variabel boolean.The gambaran paket java.util.concurrent.atomic memberikan gambaran tingkat tinggi baik dari apa kelas dalam paket ini dilakukan dan kapan menggunakannya. Saya juga merekomendasikan buku Java Concurrency in Practice oleh Brian Goetz.
sumber
Kutipan dari deskripsi paket
sumber