Artikel ini memperkenalkan beberapa poin pengetahuan tentang kata kunci yang disinkronkan di java multithreading sebagai kunci objek.
Kunci objek yang disebut berarti disinkronkan untuk mengunci objek tertentu. Untuk referensi, silakan merujuk ke: artikel ini
1. Analisis
Sinkronisasi dapat memodifikasi metode instan sebagai berikut:
kelas publik myobject {disinkronkan public void methoda () {// lakukan sesuatu ....}Di sini, kata kunci yang disinkronkan mengunci objek saat ini. Ini juga disebut kunci objek.
Mengapa mengunci objek saat ini? Karena methoda () adalah metode instan, jika Anda ingin menjalankan methoda (), Anda harus menyebutnya dalam bentuk objek. Method () (obj.methoda (), OBJ adalah objek kelas myObject, disinkronkan berarti mengunci objek OBJ).
Kode di atas juga dapat ditulis seperti ini:
kelas publik myObject {public void methoda () {disinkronkan (this) {// lakukan sesuatu ....}}2. Fitur
Fitur yang jelas dari sinkronisasi kata kunci yang disinkronkan adalah bahwa ketika beberapa metode instance yang dimodifikasi yang disinkronkan didefinisikan dalam kelas myObject, jika beberapa utas memiliki objek yang sama dari kelas myObject, metode ini hanya dapat dieksekusi dengan cara yang sinkron. Artinya, setelah menjalankan metode modifikasi yang disinkronkan, metode modifikasi lain yang disinkronkan dapat dijalankan.
sebagai berikut:
kelas publik myObject {disinkronkan void methoda () {// lakukan sesuatu ....} methodb void publik yang disinkronkan () {// lakukan beberapa hal lain}}Ada dua metode modifikasi yang disinkronkan di kelas MyObject.
Public Class Threada memperluas thread {private myObject objek; // hilangkan konstruktor @override public void run () {super.run (); object.methoda (); }}Thread A mengeksekusi methoda ()
Public Class ThreadB Extends Thread {Private MyObject Object; // menghilangkan konstruktor @Override public void run () {super.run (); object.methodb (); }} Thread B mengeksekusi methodB ()
kelas publik run {public static void main (string [] args) {myObject object = new myobject (); // Thread A dan Thread B Pegang objek yang sama: objek threada a = new threada (objek); ThreadB B = ThreadB baru (objek); a.start (); b.start (); }}Karena Thread A dan Thread B tahan objek objek dari kelas myObject yang sama, meskipun kedua utas ini perlu memanggil metode yang berbeda, mereka harus disinkronkan. Misalnya, Thread B perlu menunggu Thread A untuk menjalankan metode Methoda () sebelum dapat menjalankan metode MethodB ().
3. Kesimpulan
Seperti yang dapat dilihat dari hal di atas, ruang lingkup kunci yang disinkronkan yang dijelaskan dalam artikel ini adalah seluruh objek. Jika ada beberapa metode sinkronisasi yang dimodifikasi yang disinkronkan di kelas, dan beberapa utas memiliki objek kelas yang sama (objek yang sama dari kelas), meskipun mereka menyebut metode yang berbeda, pelaksanaan masing -masing metode juga disinkronkan.
Jika tidak ada variabel bersama antara setiap metode yang disinkronkan, atau tidak ada hubungan antara setiap metode, tetapi hanya dapat dieksekusi secara sinkron, ini akan mempengaruhi efisiensi.
4. Aplikasi-Gunakan yang disinkronkan untuk menghindari membaca data kotor karena inkonsistensi data
Contoh berikut:
kelas publik myObject {private string username = "b"; Private String Password = "BB"; Methoda public void yang disinkronkan (string username, string password) {this.userName = username; coba {thread.sleep (5000); } catch (InterruptedException e) {} this.password = kata sandi; } Metode public void yang disinkronkan () {System.out.println ("nama pengguna" + nama pengguna + ":" + "kata sandi" + kata sandi); }}Methoda () bertanggung jawab untuk mengubah nama pengguna dan kata sandi. Pada kenyataannya, nama pengguna sesuai dengan kata sandi.
MethodB () bertanggung jawab untuk membaca nama pengguna dan kata sandi.
Jika MethodB () tidak dimodifikasi dengan disinkronkan, Thread A mengubah nama pengguna saat memanggil methoda () ke baris 7, dan menyerahkan CPU untuk beberapa alasan (seperti tidur di baris 9).
Pada saat ini, jika utas B mengeksekusi methodB (), nama pengguna yang dibaca adalah nama pengguna yang diubah oleh utas A ("A"), tetapi kata sandi adalah kata sandi asli ("BB"). Karena Thread A sedang tidur dan belum punya waktu untuk mengubah kata sandi.
Namun, jika methodB () dimodifikasi dengan disinkronkan, maka utas B hanya dapat menunggu utas A untuk menyelesaikan eksekusi (yaitu, telah mengubah nama pengguna dan kata sandi) sebelum menjalankan MethodB untuk membaca nama pengguna dan kata sandi. Oleh karena itu, masalah membaca kotor yang disebabkan oleh ketidakkonsistenan dalam data dihindari.
Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk belajar pemrograman Java.