Jika akses ke data bersama yang dapat diubah tidak dapat disinkronkan, konsekuensinya bisa sangat buruk, bahkan jika variabel tersebut dapat dibaca dan ditulis secara atom.
Mari pertimbangkan masalah sinkronisasi thread. Untuk sinkronisasi thread, perpustakaan kelas Java menyediakan metode Thread.stop, namun metode ini tidak layak untuk dipromosikan karena pada dasarnya tidak aman. Akan lebih baik jika menggunakan polling, seperti program berikut.
Copy kode kodenya sebagai berikut:
import java.util.bersamaan.TimeUnit;
kelas publik StopThread {
/**
* @param argumen
*/
boolean statis pribadi stopDiminta;
public static void main(String[] args)
melempar InterruptedException{
Thread backgroundThread = Thread baru(Runnable baru() {
@Mengesampingkan
menjalankan kekosongan publik() {
ke dalam saya = 0;
while(!stopDiminta){
saya++;
Sistem.keluar.println(i);
}
}
});
latar belakangThread.mulai();
TimeUnit.SECONDS.sleep(1);
stopDiminta = benar;
}
}
Anda mungkin berpikir bahwa setelah program ini berjalan sekitar satu detik, thread utama menyetel stopRequested ke true, menyebabkan thread baru di latar belakang berhenti, pada kenyataannya, hal ini tidak terjadi, karena thread latar belakang tidak dapat melihat perubahannya nilai, sehingga akan terus berulang tanpa henti, ini akibat tidak sinkronnya data. Jadi mari kita lakukan ini secara serempak.
Copy kode kodenya sebagai berikut:
import java.util.bersamaan.TimeUnit;
kelas publik StopThread {
/**
* @param argumen
*/
boolean statis pribadi stopDiminta;
private static disinkronkan void requestStop(){
stopDiminta = benar;
}
boolean tersinkronisasi statis pribadi stopRequested(){
return stopDiminta;
}
public static void main(String[] args)
melempar InterruptedException{
Thread latar belakangThread = Thread baru(Runnable baru() {
@Mengesampingkan
menjalankan kekosongan publik() {
ke dalam saya = 0;
while(!stopDiminta()){
saya++;
Sistem.keluar.println(i);
}
}
});
latar belakangThread.mulai();
TimeUnit.SECONDS.sleep(1);
permintaanBerhenti();
}
}
Ini mencapai sinkronisasi data. Perlu dicatat bahwa metode tulis (requestStop) dan metode baca (stopRequested) perlu disinkronkan, jika tidak maka masih belum disinkronkan dalam arti sebenarnya.
Selain itu, kita dapat menggunakan pengubah variabel volatil untuk menyelesaikan tugas sinkronisasi dengan lebih sederhana.
Copy kode kodenya sebagai berikut:
import java.util.bersamaan.TimeUnit;
kelas publik StopThread {
/**
* @param argumen
*/
stop boolean statis pribadi yang mudah menguap Diminta;
public static void main(String[] args)
melempar InterruptedException{
Thread backgroundThread = Thread baru(Runnable baru() {
@Mengesampingkan
menjalankan kekosongan publik() {
ke dalam saya = 0;
while(!stopDiminta){
saya++;
Sistem.keluar.println(i);
}
}
});
latar belakangThread.mulai();
TimeUnit.SECONDS.sleep(1);
stopDiminta = benar;
}
}