Ketika saya pertama kali melihat pertanyaan ini, saya tidak bisa memulai karena saya merasa bahwa disinkronkan dan kunci sangat berbeda dalam hal penguncian. Misalnya, lihat cara mengunci saat disinkronkan dalam keadaan normal.
Metode 1:
public disinkronkan membatalkan a () {// todo}Metode 2:
public void b () {disinkronkan (this) {// todo}}Dari dua cara ini, kunci ditambahkan antara {}. Mari kita lihat bagaimana kunci dilakukan:
public void c () {lock.lock (); coba {// todo} akhirnya {lock.unlock (); }}Cara kunci ini ditambahkan antara lock () dan buka kunci (). Oleh karena itu, jika Anda ingin menerapkan fungsi kunci, Anda perlu memikirkan cara menerapkan kedua metode ini, lock () dan membuka metode (), pertama -tama mendefinisikan kerangka kerja sebagai berikut:
public void lock () {} public void unlock () {}Maka Anda harus berpikir tentang cara menggunakan disinkronkan untuk mengimplementasikan kedua metode ini.
Sekarang saya hanya sedikit lebih jelas dalam pikiran saya, tetapi saya tidak tahu bagaimana mengisi kedua metode ini. Inilah cara menganalisis karakteristik penguncian Lock, dan kemudian lihat kode ini:
public void c () {lock.lock (); // Saat utas saat ini dapatkan kunci, utas lain harus menunggu coba {// utas saat ini dapatkan di kunci, utas lain tidak bisa masuk // todo} akhirnya {lock.unlock (); // lepaskan utas saat ini}}Saya baru saja menambahkan sedikit komentar pada kode ini dan tidak melakukan hal lain. Apakah membantu memahami kode ini dan melihat apa kata yang paling sering terjadi, CurrentThread? Jadi ketika kita mengisi metode lock () dan buka kunci (), haruskah kita memperhatikan untuk menggenggam kata kunci saat ini untuk menemukan solusinya? Jawabannya adalah ya.
Kemudian analisis, bagaimana membuat utas menunggu saat menggunakan disinkronkan? Ini adalah menggunakan metode tunggu (). Bagaimana cara membangunkan utas? Itu menggunakan metode notify (). Maka Anda perlu menggunakan metode tunggu () dalam metode lock () dan metode notify () dalam metode buka kunci (). Jadi ketika kami menggunakan Wait () dan Notify (), kami memiliki kondisi. Pikirkan tentang apa yang harus kita gunakan sebagai kondisinya?
Kita harus menggunakan apakah kunci saat ini ditempati sebagai kondisi penilaian. Jika kuncinya ditempati, CurrentThread tunggu. Pikirkan apakah kami telah menggunakan kondisi ini saat menggunakan disinkronkan. Jawabannya adalah ya.
Mari kita analisis kapan akan melepaskan kunci dan kondisi apa yang digunakan. Pikirkan jika utas A mendapatkan kunci, dapatkah utas B dilepaskan? Tentu saja tidak. Jika B dapat dirilis, itu melanggar prinsipnya, tentu saja tidak. Jelas bahwa kunci Thread A hanya dapat dilepaskan. Oleh karena itu, kondisi penilaian adalah untuk menilai apakah utas yang memegang kunci adalah Currentthread. Jika demikian, itu bisa dirilis, tetapi tentu saja tidak bisa.
Mari kita lihat kode lengkapnya sekarang:
Paket test.lock; impor java.util.random; impor java.util.concurrent.executorservice; impor java.util.concurrent.executors; impor java.util.concurrent.-threadfactory; public class naivelock {private static final long none none none = -1; no long funtry! Sinkronisasi void lock () {long currentThreadId = thread.currentThread (). getId (); if (owner == currentThreadId) {lempar baru ilegalstateException ("kunci telah diperoleh oleh utas saat ini"); while (this.islooked ()) {System.out.println (string.form.form.format (ini. " {tunggu ();} catch (interruptedException e) {e.printstacktrace ();}} own = currentThreadId; System.out.println (string.format ("kunci diperoleh oleh thread %s", pemilik);} public sinchonized void unlock () {if (! this.islook). {throw new IllegalStateException("Only Lock owner can unlock the lock");}System.out.println(String.format("thread %s is unlocking", owner));System.out.println();owner = NONE;notify();}public static void main(String[] args) {final NaiveLock lock = new NaiveLock();ExecutorService executor = Executors.newfixedThreadPool (20, new threadFactory () {private threadGroup grup = new threadGroup ("test thread group"); {group.setdaemon (true);}@override public thread newThread (runnable r) {return new thread (grup, r);}}); for (int i = 0 {@Override public void run () {lock.lock (); System.out.println (string.format ("Thread %s sedang berjalan ...", thread.currentThread (). GetId ())); coba {thread.sleep (acak baru (). NextInt (1000));} tangkapan (interruprExcepion e) {E.PrintStackTrace ();} lock.unlock ();}});}}}Jalankan dan lihat hasilnya:
Kunci diperoleh dengan utas 8 utas 8 sedang berjalan ... utas 27 adalah tunggu ulir kunci 26 adalah menunggu benang kunci 25 adalah menunggu utas kunci 24 adalah menunggu utas kunci 23 adalah tunggu -tunggu ulir kunci 22 adalah waiting thread 21 is waiting lock thread 20 tunggu kunci utas 19 adalah tunggu kunci utas 18 adalah tunggu -tunggu ulir 17 adalah locking. Thread 27 Thread 27 sedang berjalan ... Thread 27 adalah kunci kunci yang dibuka diperoleh dengan utas 26 Thread 26 sedang berjalan ... Thread 26 adalah kunci kunci yang dibuka diperoleh oleh Thread 25 Thread 25 sedang berjalan ... Thread 25 membuka kunci kunci yang diperoleh dengan utas 24 Thread 24 sedang berjalan ... Thread 24 Bentang Kunci 22 Berlari Datang oleh Thread 23 Berlari Kunci ... Utas 23 Kunci Terbuka Kunci 2 22 Lock IS IS AMUT 22 Utas Diperoleh Bangkit 22 unlocking Lock is acquired by thread 20 thread 20 is running... thread 20 is unlocking Lock is acquired by thread 19 thread 19 is running... thread 19 is unlocking Lock is acquired by thread 18 thread 18 is running... thread 18 is unlocking Lock is acquired by thread 17 thread 17 is running... thread 17 is unlocking Lock is acquired by thread 16 thread 16 is running... thread 16 is unlocking Lock is acquired by thread 15 thread 15 is running... thread 15 is unlocking Lock is acquired by thread 14 Thread 14 sedang berjalan ... Thread 14 adalah kunci kunci yang dibuka diperoleh dengan utas 13 Thread 13 sedang berjalan ... Thread 13 adalah kunci kunci yang dibuka diperoleh dengan utas 12 Thread 12 sedang berjalan ... Thread 12 adalah kunci kunci yang dibuka diperoleh dengan utas 11 Thread 11 sedang berjalan ... Thread 11 adalah kunci yang tidak terkunci 9 Thread yang dijalankan 10 sedang berjalan ...
Jika Anda mengubah loop untuk 30 kali, lihat hasilnya:
Kunci diperoleh dengan utas 8 utas 8 sedang berjalan ... utas 27 adalah tunggu ulir kunci 26 adalah menunggu benang kunci 25 adalah menunggu utas kunci 24 adalah menunggu utas kunci 23 adalah tunggu -tunggu ulir kunci 22 adalah waiting thread 21 is waiting lock thread 20 tunggu kunci utas 19 adalah tunggu kunci utas 18 adalah tunggu -tunggu ulir 17 adalah locking. Utas 27 Thread 27 sedang berjalan ... Thread 8 sedang menunggu kunci utas 27 adalah kunci kunci yang dibuka diperoleh dengan utas 27 utas 27 sedang berjalan ... utas 26 adalah tunggu kunci utas 27 Kunci membuka kunci diperoleh dengan utas 27 Thread 27 sedang berjalan ... utas 25 adalah utas kunci tunggu 27 Kunci yang tidak dikunci oleh utas 24 utas 24 berjalan ... utas 27 adalah tunggu kunci utas 24 adalah kunci yang tidak terkunci. 22 sedang berjalan ... Thread 23 sedang menunggu kunci utas 22 adalah kunci yang membuka kunci diperoleh dengan utas 22 Thread 22 sedang berjalan ... utas 21 adalah menunggu kunci utas 22 adalah kunci kunci yang dibuka diperoleh dengan utas 22 Thread 22 sedang berjalan ... utas 20 adalah tunggu kunci utas 22 adalah kunci yang tidak terkunci. Menjalankan ... Thread 17 Kunci Membuka Kunci Diperoleh oleh Thread 16 Thread 16 sedang berjalan ... Thread 16 Kunci Buka Kunci Diperoleh oleh Thread 15 Thread 15 sedang berjalan ... Thread 15 Kunci Buka Kunci Diperoleh oleh Thread 14 Thread 14 sedang berjalan ... Thread 14 adalah Kunci yang Membuka Kunci 12. Diakuisisi oleh Thread 10 Thread 10 sedang berjalan ... Thread 10 membuka kunci kunci diperoleh oleh Thread 9 Thread 9 sedang berjalan ... Thread 9 adalah kunci kunci yang dibuka diakuisisi oleh Thread 8 Thread 8 sedang berjalan ... Thread 8 membuka kunci kunci yang diperoleh oleh Thread 26 Thread 26 adalah Thread 26 IS OVERLOCKING LOCKET AKTIF BREAD 25 Utas 25 Berlari ... Thread 25 Is Unlocking Lock By Thread By Thread 27 Berlari 27 Berlari 27 Berlari 2. Thread 24 adalah kunci kunci yang diakuisisi oleh utas 23 Thread 23 sedang berjalan ... Thread 23 adalah kunci kunci yang dibuka diperoleh dengan utas 21 Thread 21 sedang berjalan ... Thread 21 adalah kunci kunci yang dibuka diperoleh dengan utas 20 utas 20 sedang berjalan ... Thread 20 adalah kunci terbuka yang diakuisisi oleh Thread 19 sedang berjalan ... utas 19 adalah kunci kunci yang diakuisisi oleh Thread 18 Thread 18 is Unread 18
Meringkaskan
Di atas adalah semua penjelasan terperinci dari artikel ini tentang penggunaan yang disinkronkan untuk mengimplementasikan kode kunci. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
Contoh Kode Kunci Sinkronisasi Sinkronisasi Lokir Java
Perbedaan antara sinkronisasi dan kunci dalam pemrograman Java [disarankan]
Java Kode Implementasi Pemisahan ReadWritelock Multithreaded Read-Write
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!