Saya tahu bahwa menggunakan synchronize
kata kunci sebelum metode membawa sinkronisasi ke objek itu. Artinya, 2 utas yang menjalankan contoh objek yang sama akan disinkronkan.
Namun, karena sinkronisasi berada di level objek, 2 utas yang menjalankan instance objek yang berbeda tidak akan disinkronkan. Jika kita memiliki variabel statis di kelas Java yang dipanggil oleh metode, kita ingin itu disinkronkan di seluruh instance kelas. Kedua contoh tersebut berjalan di 2 utas berbeda.
Bisakah kita mencapai sinkronisasi dengan cara berikut?
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(lock)
{
count++;
}
}
}
Apakah benar bahwa karena kita telah mendefinisikan objek lock
yang statis dan kita menggunakan kata kunci synchronized
untuk kunci itu, variabel statis count
sekarang disinkronkan di seluruh kelas Test
?
Jawaban:
Ada beberapa cara untuk menyinkronkan akses ke variabel statis.
Gunakan metode statis tersinkronisasi. Ini disinkronkan pada objek kelas.
Sinkronisasi secara eksplisit pada objek kelas.
Sinkronisasi pada beberapa objek statis lainnya.
Metode 3 adalah yang terbaik dalam banyak kasus karena objek kunci tidak diekspos di luar kelas Anda.
sumber
Test.class
dan berpotensi merusak hari Anda. Selain itu, inisialisasi kelas dijalankan dengan kunci pada kelas yang dipegang, jadi jika Anda memiliki penginisialisasi kelas yang gila, Anda dapat membuat diri Anda pusing.volatile
tidak membantucount++
karena ini adalah urutan baca / ubah / tulis. Seperti disebutkan dalam jawaban yang berbeda,java.util.concurrent.atomic.AtomicInteger
kemungkinan besar pilihan yang tepat di sini.Test.class
.this
akan menjadi kunci untuk metode non-statisJika Anda hanya berbagi penghitung, pertimbangkan untuk menggunakan AtomicInteger atau kelas lain yang sesuai dari paket java.util.concurrent.atomic:
sumber
Ya itu benar.
Jika Anda membuat dua contoh kelas Anda
Kemudian t1.foo dan t2.foo keduanya melakukan sinkronisasi pada objek statis yang sama dan karenanya saling memblokir.
sumber
Anda dapat menyinkronkan kode Anda di atas kelas. Itu paling sederhana.
Semoga jawaban ini bermanfaat bagi Anda.
sumber
Test.class
dan memengaruhi perilaku. Inilah sebabnya mengapa sinkronisasi aktiflock
mungkin lebih disukai.Kami juga dapat menggunakan ReentrantLock untuk mencapai sinkronisasi variabel statis.
sumber