Ketika kata kunci bahasa Java digunakan untuk memodifikasi metode atau blok kode, itu dapat memastikan bahwa paling banyak satu utas menjalankan kode secara bersamaan.
1. Ketika dua utas bersamaan mengakses blok kode sinkronisasi yang disinkronkan ini dalam objek objek yang sama, hanya satu utas yang dapat dieksekusi dalam satu waktu. Utas lain harus menunggu utas saat ini untuk menjalankan blok kode ini sebelum dapat menjalankan blok kode.
2. Namun, ketika satu utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain masih dapat mengakses blok kode sinkronisasi yang tidak disinkronkan (ini) di objek itu.
3. Sangat penting bahwa ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain akan memblokir akses ke semua blok kode sinkronisasi yang disinkronkan (ini) dalam objek.
4. Contoh ketiga juga berlaku untuk blok kode sinkron lainnya. Artinya, ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, ia memperoleh kunci objek objek ini. Akibatnya, utas lain akses ke semua bagian kode sinkron dari objek objek diblokir sementara.
5. Aturan di atas juga berlaku untuk kunci objek lainnya.
Berikan contoh:
1. Ketika dua utas bersamaan mengakses blok kode sinkronisasi yang disinkronkan ini dalam objek objek yang sama, hanya satu utas yang dapat dieksekusi dalam satu waktu. Utas lain harus menunggu utas saat ini untuk menjalankan blok kode ini sebelum dapat menjalankan blok kode.
paket tHs; kelas publik thread1 mengimplementasikan runnable {public void run () {disinkronkan (this) {for (int i = 0; i <5; i ++) {System.out.println (thread.currentThread (). getName () + "sinkronisasi loop" + i); }}} public static void main (string [] args) {thread1 t1 = new thread1 (); Thread ta = utas baru (t1, "a"); Thread tb = utas baru (t1, "b"); ta.start (); tb.start (); }}hasil:
Loop yang disinkronkan 0
Loop 1 yang disinkronkan
Loop 2 yang disinkronkan
Loop 3 yang disinkronkan
Loop yang disinkronkan 4
B loop tersinkronisasi 0
B Loop Sinkronisasi 1
B Loop Sinkronisasi 2
B Loop Sinkronisasi 3
B Sinkronisasi Loop 4
2. Namun, ketika satu utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain masih dapat mengakses blok kode sinkronisasi yang tidak disinkronkan (ini) di objek itu.
paket tHs; kelas publik thread2 {public void m4t1 () {disinkronkan (this) {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ":" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}}} public void m4t2 () {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ":" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}} public static void main (string [] args) {final thread2 myt2 = new thread2 (); Thread t1 = utas baru (runnable baru () {public void run () {myt2.m4t1 ();}}, "t1"); Thread t2 = utas baru (runnable baru () {public void run () {myt2.m4t2 ();}}, "t2"); t1.start (); t2.start (); }} hasil:
T1: 4
T2: 4
T1: 3
T2: 3
T1: 2
T2: 2
T1: 1
T2: 1
T1: 0
T2: 0
3. Sangat penting bahwa ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain akan memblokir akses ke semua blok kode sinkronisasi yang disinkronkan (ini) dalam objek.
// Modifikasi thread2.m4t2 () Metode: public void m4t2 () {disinkronkan (this) {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ":" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}}}hasil:
T1: 4
T1: 3
T1: 2
T1: 1
T1: 0
T2: 4
T2: 3
T2: 2
T2: 1
T2: 0
4. Contoh ketiga juga berlaku untuk blok kode sinkron lainnya. Artinya, ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, ia memperoleh kunci objek objek ini. Akibatnya, utas lain akses ke semua bagian kode sinkron dari objek objek diblokir sementara.
// Ubah metode thread2.m4t2 () sebagai berikut: public disinkronkan void m4t2 () {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ":" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}} hasil:
T1: 4
T1: 3
T1: 2
T1: 1
T1: 0
T2: 4
T2: 3
T2: 2
T2: 1
T2: 0
5. Aturan di atas juga berlaku untuk kunci objek lainnya:
paket tHs; class public thread3 {class inner {private void m4t1 () {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ": inner.m4t1 () =" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}} private void m4t2 () {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ": inner.m4t2 () =" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}}} private void m4t1 (bagian dalam dalam) {disinkronkan (bagian dalam) {// Gunakan objek kunci bagian dalam.m4t1 (); } private void m4t2 (bagian dalam dalam) {inner.m4t2 (); } public static void main (string [] args) {final thread3 myt3 = new thread3 (); bagian dalam final = myt3.new inner (); Utas t1 = utas baru (runnable baru () {public void run () {myt3.m4t1 (dalam);}}, "t1"); Thread t2 = utas baru (runnable baru () {public void run () {myt3.m4t2 (dalam);}}, "t2"); t1.start (); t2.start (); }}hasil:
Meskipun Thread T1 memperoleh kunci objek pada bagian dalam, karena Thread T2 mengakses bagian asinkron dalam bagian dalam yang sama. Oleh karena itu, kedua utas tidak saling mengganggu.
T1: Inner.m4t1 () = 4
T2: Inner.m4t2 () = 4
T1: Inner.m4t1 () = 3
T2: Inner.m4t2 () = 3
T1: Inner.m4t1 () = 2
T2: Inner.m4t2 () = 2
T1: Inner.m4t1 () = 1
T2: Inner.m4t2 () = 1
T1: Inner.m4t1 () = 0
T2: Inner.m4t2 () = 0
Sekarang letakkan disinkronkan di depan bagian dalam.m4t2 ():
private disinkronkan void m4t2 () {int i = 5; while (i--> 0) {System.out.println (thread.currentThread (). getName () + ": inner.m4t2 () =" + i); coba {thread.sleep (500); } catch (InterruptedException IE) {}}}hasil:
Meskipun utas T1 dan T2 mengakses dua bagian yang tidak terkait dari objek bagian dalam yang sama, karena T1 pertama kali mendapatkan kunci objek ke bagian dalam, akses T2 ke bagian dalam.m4t2 () juga diblokir karena M4T2 () adalah metode sinkronisasi di dalam.
T1: Inner.m4t1 () = 4
T1: Inner.m4t1 () = 3
T1: Inner.m4t1 () = 2
T1: Inner.m4t1 () = 1
T1: Inner.m4t1 () = 0
T2: Inner.m4t2 () = 4
T2: Inner.m4t2 () = 3
T2: Inner.m4t2 () = 2
T2: Inner.m4t2 () = 1
T2: Inner.m4t2 () = 0
Pasal 2:
Kata kunci yang disinkronkan, yang mencakup dua penggunaan: metode yang disinkronkan dan blok yang disinkronkan.
1. Metode yang disinkronkan: Deklarasikan metode yang disinkronkan dengan menambahkan kata kunci yang disinkronkan ke deklarasi metode. menyukai:
public disinkronkan void accessVal (int newVal);
Metode yang disinkronkan mengontrol akses ke variabel anggota kelas: setiap instance kelas sesuai dengan kunci, dan setiap metode yang disinkronkan harus mendapatkan kunci instance kelas yang memanggil metode sebelum dapat dieksekusi. Kalau tidak, utas tempatnya diblokir. Setelah metode dieksekusi, itu akan secara eksklusif menempati kunci. Kunci tidak akan dirilis sampai kembali dari metode ini. Utas yang diblokir dapat memperoleh kunci dan masuk kembali ke negara bagian yang dapat dieksekusi. Mekanisme ini memastikan bahwa pada saat yang sama, untuk setiap contoh kelas, paling banyak dari semua fungsi anggota yang dinyatakan disinkronkan adalah dalam keadaan yang dapat dieksekusi (karena paling banyak orang dapat memperoleh kunci yang sesuai dengan instance kelas), sehingga secara efektif menghindari konflik akses variabel anggota kelas (selama semua metode yang memungkinkan untuk mengakses variabel anggota kelas dinyatakan disinkronisasi).
Di Java, tidak hanya contoh kelas, tetapi setiap kelas juga sesuai dengan kunci, sehingga kami dapat mendeklarasikan fungsi anggota statis kelas yang disinkronkan untuk mengontrol aksesnya ke variabel anggota statis kelas.
Kerugian dari metode yang disinkronkan: mendeklarasikan metode besar sebagaimana disinkronkan akan sangat mempengaruhi efisiensi. Biasanya, jika metode kelas utas berjalan () dinyatakan sebagai disinkronkan, karena telah berjalan sepanjang umur utas, itu akan menyebabkannya tidak pernah berhasil dalam metode yang disinkronkan dari kelas ini. Tentu saja kita dapat menyelesaikan masalah ini dengan menempatkan kode yang mengakses variabel anggota kelas ke dalam metode khusus, menyatakannya sebagai disinkronkan, dan menyebutnya dalam metode utama, tetapi Java memberi kita solusi yang lebih baik, yaitu, blok yang disinkronkan.
2. Blok Sinkronisasi: Deklarasikan blok yang disinkronkan melalui kata kunci yang disinkronkan. Sintaksnya adalah sebagai berikut:
Sinkronisasi (SyncObject) {// Kode yang memungkinkan kontrol akses} Blok yang disinkronkan adalah blok kode di mana kode harus mendapatkan kunci dari objek syncObject (seperti yang disebutkan sebelumnya, itu dapat berupa instance atau kelas kelas) sebelum dapat dieksekusi. Mekanisme spesifiknya sama seperti yang dijelaskan di atas. Karena dapat ditargetkan pada blok kode apa pun dan objek yang terkunci dapat ditentukan kapan saja, itu lebih fleksibel.
Beberapa pemahaman tentang sinkronisasi (ini) <br /> 1. Ketika dua utas bersamaan mengakses blok kode yang disinkronkan ini disinkronkan ini di objek yang sama, hanya satu utas yang dapat dieksekusi dalam satu waktu. Utas lain harus menunggu utas saat ini untuk menjalankan blok kode ini sebelum dapat menjalankan blok kode.
2. Namun, ketika satu utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain masih dapat mengakses blok kode sinkronisasi yang tidak disinkronkan (ini) di objek itu.
3. Sangat penting bahwa ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, utas lain akan memblokir akses ke semua blok kode sinkronisasi yang disinkronkan (ini) dalam objek.
4. Contoh ketiga juga berlaku untuk blok kode sinkron lainnya. Artinya, ketika utas mengakses blok kode sinkronisasi yang disinkronkan (ini) dari suatu objek, ia memperoleh kunci objek objek ini. Akibatnya, utas lain akses ke semua bagian kode sinkron dari objek objek diblokir sementara.
5. Aturan di atas juga berlaku untuk kunci objek lainnya.
Cara menggunakan disinkronkan di java
Misalnya: Objek seperti rumah besar, pintunya selalu terbuka. Ada banyak kamar di rumah (yaitu, metode).
Kamar -kamar ini telah terkunci (metode sinkronisasi), dan tidak terkunci (metode normal). Ada kunci di pintu, yang dapat membuka semua kamar yang terkunci.
Selain itu, saya membandingkan semua utas yang ingin memanggil metode objek dengan orang yang ingin memasuki ruangan di rumah ini. Hanya ada begitu banyak hal, mari kita lihat bagaimana hal -hal ini bekerja.
Di sini pertama -tama kami mengklarifikasi prasyarat kami. Objek tersebut memiliki setidaknya satu metode yang disinkronkan, jika tidak, apa gunanya kunci ini? Tentu saja, tidak akan ada topik seperti itu untuk kita.
Seorang pria ingin memasuki kamar yang terkunci. Dia datang ke pintu rumah dan melihat kunci di sana (itu berarti tidak ada orang lain yang ingin menggunakan ruang yang terkunci). Jadi dia berjalan dan mendapatkan kunci dan menggunakan kamar -kamar seperti yang dia rencanakan. Ketahuilah bahwa dia akan mengembalikan kunci segera setelah menggunakan ruang yang terkunci setiap saat. Bahkan jika dia ingin menggunakan dua kamar yang terkunci berturut -turut, dia akan mengembalikan kunci untuk mengambilnya. Oleh karena itu, prinsip menggunakan kunci dalam kasus biasa adalah: "Pinjam seperti yang Anda gunakan, dan kembalikan segera setelah Anda menggunakannya."
Pada saat ini, orang lain dapat menggunakan kamar yang tidak terkunci tanpa batasan. Satu orang dapat menggunakan satu kamar, dan dua orang dapat menggunakan satu kamar, tanpa batasan. Tetapi jika seseorang ingin memasuki ruang yang terkunci, ia harus berlari ke gerbang untuk melihatnya. Tentu saja, jika Anda memiliki kunci, Anda akan pergi. Jika Anda tidak memilikinya, Anda hanya bisa menunggu. Jika banyak orang menunggu kunci ini, siapa yang akan mendapatkan kunci terlebih dahulu setelah dikembalikan? Tidak dijamin. Seperti orang dalam contoh sebelumnya yang ingin menggunakan dua kamar terkunci berturut -turut, jika ada orang lain yang menunggu kunci di tengah, tidak ada jaminan bahwa orang ini akan mendapatkannya lagi. ; satu kondisi, tetapi berdasarkan banyak artikel.
Karena ada terlalu banyak kondisi penilaian, jika Anda mengatakannya, itu dapat memengaruhi promosi Java, atau mungkin karena perlindungan kekayaan intelektual. Sun memberi saya janji dan melewatinya. Tidak ada yang salah dengan itu. Tapi saya percaya ketidakpastian ini tidak sepenuhnya tidak pasti. Karena komputer itu sendiri berjalan sesuai instruksi. Bahkan jika fenomena itu tampak acak, itu sebenarnya teratur. Siapa pun yang telah mempelajari komputer tahu bahwa nama ilmiah angka acak di komputer adalah bilangan pseudo-acak, yang ditulis oleh orang-orang yang menggunakan metode tertentu, dan mereka hanya terlihat acak. Selain itu, mungkin itu karena terlalu sulit untuk memastikan dan tidak terlalu bermakna, jadi jika Anda tidak yakin, Anda tidak yakin. )
Mari kita lihat blok kode sinkronisasi. Ada sedikit perbedaan dari metode sinkronisasi.
1. Dalam hal ukuran, blok kode sinkronisasi lebih kecil dari metode sinkronisasi. Anda dapat memikirkan blok kode sinkronisasi sebagai ruang di ruang yang tidak terkunci yang dipisahkan oleh layar yang terkunci.
2. Blok kode sinkronisasi juga dapat secara artifisial menentukan kunci untuk mendapatkan objek lain tertentu. Sama seperti menentukan kunci mana yang akan membuka kunci layar, Anda dapat menggunakan kunci ruangan ini; Anda juga dapat menentukan bahwa kunci rumah lain dapat membukanya. Dengan cara ini, Anda harus berlari ke rumah lain untuk membawa kunci itu dan menggunakan kunci rumah itu untuk membuka layar yang terkunci dari rumah ini.
Ingatlah bahwa kunci dari rumah lain yang Anda peroleh tidak mempengaruhi orang lain yang memasuki ruangan tanpa kunci di rumah itu.
Mengapa menggunakan blok kode sinkron? Saya pikir itu harus seperti ini: Pertama -tama, bagian sinkronisasi dari program ini memiliki banyak dampak pada efisiensi operasi, dan metode biasanya untuk membuat beberapa variabel lokal terlebih dahulu, dan kemudian melakukan beberapa operasi pada variabel -variabel ini, seperti operasi, tampilan, dll.; Dan semakin banyak kode yang dicakup oleh sinkronisasi, semakin serius dampaknya pada efisiensi. Karena itu, kami biasanya mencoba mempersempit dampaknya.
Bagaimana cara melakukannya? Menyinkronkan blok kode. Kami hanya menyinkronkan tempat sinkronisasi dalam satu metode, seperti operasi.
Selain itu, fitur blok kode sinkron yang dapat menentukan kunci memiliki keuntungan tambahan, yaitu bahwa ia dapat menempati kunci objek dalam periode waktu tertentu. Apakah Anda ingat prinsip -prinsip penggunaan kunci dalam situasi biasa yang disebutkan sebelumnya? Ini bukan situasi biasa sekarang. Kunci yang Anda peroleh tidak pernah dikembalikan, tetapi dikembalikan hanya ketika Anda keluar dari blok kode sinkron.
Saya juga menggunakan pria di depan yang ingin menggunakan dua kamar terkunci berturut -turut untuk membuat contoh. Bagaimana saya bisa terus menggunakan yang lain setelah menggunakannya? Gunakan blok kode sinkron. Pertama -tama buat utas lain, buat blok kode sinkron, dan arahkan kunci blok kode itu ke kunci rumah. Kemudian mulailah utas itu. Selama Anda dapat mengambil kunci ke rumah saat memasuki blok kode itu, Anda dapat menyimpannya sampai Anda keluar dari blok kode itu. Dengan kata lain, Anda bahkan dapat melintasi semua kamar yang terkunci di ruangan ini, atau bahkan tidur (10*60*1000), dan masih ada 1.000 utas menunggu kunci ini di pintu. Sangat menyenangkan.
Di sini kita akan berbicara tentang korelasi antara metode tidur () dan kuncinya. Jika utas dipaksa tidur () setelah mendapatkan kunci dan belum menyelesaikan konten sinkron, kuncinya masih ada. Kunci tidak akan dikembalikan sampai berjalan lagi dan melengkapi semua konten sinkron. Ingat, pria itu hanya bosan bekerja, jadi dia pergi istirahat, dan dia tidak menyelesaikan apa yang akan dia lakukan. Untuk menghindari orang lain memasuki ruangan dan membuat kekacauan, dia harus memakai satu -satunya kunci di tubuhnya bahkan ketika dia sedang tidur.
Akhirnya, beberapa orang mungkin bertanya, mengapa Anda memerlukan kunci untuk membuka, bukan kunci dan pintu? Saya pikir ini murni karena kompleksitas. Tentu saja, satu kunci dan satu pintu lebih aman, tetapi itu akan melibatkan banyak masalah. Generasi, penyimpanan, akuisisi, pengembalian, dll. Dari kunci. Kompleksitasnya dapat meningkat dalam sekuens geometris dengan peningkatan metode sinkronisasi, yang secara serius mempengaruhi efisiensi. Ini juga merupakan trade-off. Betapa tidak diinginkan untuk meningkatkan keamanan sedikit, menghasilkan pengurangan efisiensi yang signifikan.
Contoh sederhana dari sinkronisasi
kelas publik TextThread {public static void main (string [] args) {txtthread tt = new txtthread (); utas baru (tt) .start (); utas baru (tt) .start (); utas baru (tt) .start (); utas baru (tt) .start (); }} class txtThread mengimplementasikan runnable {int num = 100; String str = new string (); public void run () {disinkronkan (str) {while (num> 0) {coba {thread.sleep (1); } catch (Exception e) {e.getMessage (); } System.out.println (thread.currentThread (). GetName () + "Ini" + num--); }}}}Dalam contoh di atas, untuk membuat perbedaan waktu, yaitu, kesempatan untuk membuat kesalahan, thread.sleep (10) digunakan.
Mekanisme dukungan dan sinkronisasi Java untuk multithreading sangat populer. Tampaknya menggunakan kata kunci yang disinkronkan dapat dengan mudah menyelesaikan masalah sinkronisasi data bersama multithreaded. Apa sebenarnya? Penting juga untuk memiliki pemahaman mendalam tentang peran kata kunci yang disinkronkan sebelum Anda dapat membuat kesimpulan.
Secara umum, kata kunci yang disinkronkan dapat digunakan sebagai pengubah fungsi atau sebagai pernyataan dalam fungsi, yang merupakan metode sinkronisasi dan blok pernyataan sinkronisasi yang biasanya disebutkan. Jika Anda mengklasifikasikannya dengan lebih hati -hati, disinkronkan dapat bertindak pada variabel instance, referensi objek, fungsi statis dan literal kelas (konstanta literal nama kelas).
Sebelum kita menjelaskan lebih lanjut, kita perlu mengklarifikasi beberapa poin:
A. Apakah kata kunci yang disinkronkan ditambahkan ke metode atau objek, kunci yang diperolehnya adalah objek, daripada memperlakukan sepotong kode atau fungsi sebagai kunci, dan metode sinkronisasi cenderung lebih mungkin terjadi lebih mungkin
Akses objek ke utasnya.
B. Setiap objek hanya memiliki satu kunci yang terkait dengannya.
C. Menerapkan sinkronisasi membutuhkan banyak overhead sistem sebagai biaya dan bahkan dapat menyebabkan kebuntuan, jadi cobalah untuk menghindari kontrol sinkronisasi yang tidak perlu.
Selanjutnya, mari kita bahas dampak disinkronkan menggunakan berbagai tempat pada kode:
Dengan asumsi bahwa P1 dan P2 adalah objek yang berbeda dari kelas yang sama, kelas ini mendefinisikan blok sinkronisasi atau metode sinkronisasi dalam situasi berikut, dan P1 dan P2 dapat memanggilnya.
1. Ketika disinkronkan digunakan sebagai pengubah fungsi, kode contoh adalah sebagai berikut:
Methodaaaaaaaaaaaaaaaaaaaaa yang disinkronkan publik (//….}
Ini adalah metode sinkronisasi. Jadi objek mana yang disinkronkan terkunci saat ini? Yang terkunci adalah menyebut objek metode sinkron ini. Dengan kata lain, ketika objek P1 menjalankan metode sinkronisasi ini di utas yang berbeda, pengecualian timbal balik akan dibentuk di antara mereka untuk mencapai efek sinkronisasi. Namun, objek lain P2 yang dihasilkan oleh kelas yang dimiliki oleh objek ini dapat secara sewenang -wenang menyebut metode ini dengan kata kunci yang disinkronkan ditambahkan.
Kode contoh di atas setara dengan kode berikut:
public void methodaaa () {disinkronkan (this) // (1) {//… ..}}(1) Apa arti ini? Ini mengacu pada objek yang menyebut metode ini, seperti P1. Dapat dilihat bahwa metode sinkronisasi pada dasarnya adalah menerapkan disinkronkan ke referensi objek. Hanya utas yang telah memperoleh kunci objek P1 yang dapat memanggil metode sinkronisasi P1. Untuk P2, kunci P1 tidak ada hubungannya dengan itu. Program ini juga dapat menghilangkan kendali mekanisme sinkronisasi dalam situasi ini, menyebabkan kebingungan data: (
2. Blok Sinkronisasi, kode sampel adalah sebagai berikut:
public void method3 (someObject so) {disinkronkan (jadi) {//… ..}}Pada saat ini, kunci adalah objek SO. Siapa pun yang mendapatkan kunci dapat menjalankan kode yang dikontrolnya. Ketika ada objek yang jelas sebagai kunci, Anda dapat menulis program seperti ini, tetapi ketika tidak ada objek yang jelas sebagai kunci dan hanya ingin sepotong kode untuk disinkronkan, Anda dapat membuat variabel instance khusus (itu harus menjadi objek) untuk bertindak sebagai kunci:
kelas foo mengimplementasikan runnable {private byte [] lock = byte baru [0]; // variabel variabel khusus public void methoda () {disinkronkan (lock) {// ...}} //… ..}Catatan: Objek array byte nol-panjang lebih ekonomis daripada objek apa pun untuk membuat kode byte yang dikompilasi: Hanya 3 opcode yang diperlukan untuk menghasilkan objek byte nol-panjang [], sedangkan objek kunci = objek baru () membutuhkan 7 opcode.
3. Gunakan disinkronkan ke fungsi statis, kode contoh adalah sebagai berikut:
Kelas foo {public static void methodaaaaaa () // fungsi statis disinkronkan {//…. } public void methodbbb () {disinkronkan (foo.class) // class literal (nama kelas konstanta literal)}}Metode MethodBBB () dalam kode menggunakan kelas literal sebagai kunci. Ini memiliki efek yang sama dengan fungsi statis yang disinkronkan. Kunci yang diperoleh sangat istimewa. Ini adalah kelas tempat objek yang saat ini menyebut metode ini (kelas, bukan objek spesifik yang dihasilkan oleh kelas ini).
Saya ingat bahwa dalam buku "Efektif Java", saya melihat bahwa menggunakan foo.class dan p1.getClass () karena kunci sinkron berbeda, dan p1.getClass () tidak dapat digunakan untuk mencapai tujuan mengunci kelas ini. P1 mengacu pada objek yang dihasilkan oleh kelas FOO.
Dapat disimpulkan bahwa jika suatu kelas mendefinisikan fungsi statis yang disinkronkan A dan fungsi instance yang disinkronkan B, maka objek yang sama OBJ dari kelas ini tidak akan merupakan sinkronisasi ketika mengakses dua metode A dan B di beberapa utas, karena kuncinya berbeda. Kunci metode A adalah objek OBJ, sedangkan kunci B adalah kelas yang dimiliki OBJ.
Ringkasannya adalah sebagai berikut:
Mencari tahu kunci yang disinkronkan objek mana yang dapat membantu kami merancang program multi-threaded yang lebih aman. Ada juga beberapa tips untuk membuat akses sinkron ke sumber daya bersama lebih aman:
1. Tentukan variabel instance dari pribadi + metode GET, alih -alih variabel instance dari publik/terlindungi. Jika suatu variabel didefinisikan sebagai publik, objek dapat mem -bypass kontrol metode sinkronisasi dan secara langsung mendapatkannya dan mengubahnya. Ini juga salah satu metode implementasi standar Javabean.
2. Jika variabel instan adalah objek, seperti array atau daftar array, maka metode di atas masih tidak aman, karena ketika objek eksternal mendapatkan referensi ke objek instan melalui metode GET dan mengarahkannya ke objek lain, maka variabel pribadi akan berubah, yang tidak terlalu berbahaya. Pada saat ini, Anda perlu menambahkan disinkronkan ke metode GET, dan hanya mengembalikan klon () dari objek pribadi ini, sehingga penelepon mendapatkan referensi ke salinan objek
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.