Locksupport adalah primitif yang memblokir utas dasar yang digunakan untuk membuat kunci dan kelas sinkronisasi lainnya.
Fungsi park () dan unpark () di Locksupport masing -masing adalah untuk memblokir utas dan membuka blokir, masing -masing, dan park () dan unpark () tidak akan menghadapi masalah "kebuntuan yang mungkin disebabkan oleh masalah.
Karena park () dan unpark () memiliki izin; Persaingan antara Park Panggilan Thread () dan utas lain yang mencoba untuk membongkar () akan tetap aktif.
Penggunaan dasar
Locksupport sangat mirip dengan semaphore biner (hanya 1 lisensi yang tersedia). Jika lisensi ini belum ditempati, utas saat ini memperoleh lisensi dan terus mengeksekusi; Jika lisensi telah ditempati, blok utas saat ini, menunggu untuk mendapatkan lisensi.
public static void main (string [] args) {locksupport.park (); System.out.println ("Block.");}Menjalankan kode akan mengungkapkan bahwa utas utama selalu memblokir. Karena lisensi ditempati secara default, lisensi tidak dapat diperoleh saat memanggil Park (), sehingga ia memasuki status pemblokiran.
Kode berikut: Lepaskan lisensi pertama, lalu dapatkan lisensi, dan utas utama dapat berakhir secara normal. Akuisisi dan pelepasan lisensi LockSupport umumnya sesuai. Jika Anda membongkar beberapa kali, tidak akan ada masalah jika Anda hanya parkir sekali. Akibatnya, lisensi berada dalam keadaan yang tersedia.
public static void main (string [] args) {thread thread = thread.currentThread (); Locksupport.unpark (utas); // Lepaskan lisensi locksupport.park (); // dapatkan lisensi system.out.println ("b");}Locksupport tidak masuk kembali. Jika utas memanggil locksupport .park () dua kali berturut -turut, maka utas pasti akan diblokir.
public static void main (string [] args) melempar pengecualian {thread thread = thread.currentThread (); Locksupport.unpark (thread); System.out.println ("A"); Locksupport.park (); System.out.println ("B"); Locksupport.park (); System.out.println ("c");}Kode ini mencetak A dan B, tetapi tidak mencetak C, karena utas tidak dapat memperoleh izin saat memanggil Park untuk kedua kalinya.
Mari kita lihat respons interupsi Locksupport yang sesuai
public static void t2 () melempar Exception {thread t = utas baru (runnable baru () {private int count = 0; @Override public void run () {long start = System.currentTimeMillis (); end long = 0; while (end - start) <= 1000) {count ++; end = System.currentTem Second.count = " + count); // tunggu izin untuk diizinkan locksupport.park (); System.out.println (" Thread over. " + Thread.currentThread (). IsInterrupted ());}}); t.start (); Thread.sleep (2000); // interrupt thread t.interrupt (); System.out.println ("Main Over");}Utas akan mencetak utas over.true. Ini berarti bahwa jika utas blok karena menelepon taman, itu dapat menanggapi permintaan interupsi (status interupsi diatur ke true), tetapi tidak akan melempar Exception interrupted.
Daftar Fungsi Locksupport
// Mengembalikan objek blocker yang disediakan untuk panggilan metode taman terbaru yang tidak diblokir, dan mengembalikan nol jika panggilan tidak diblokir. Objek statis getBlocker (thread t) // Untuk penjadwalan utas, nonaktifkan utas saat ini kecuali lisensi tersedia. Static Void Park () // Untuk penjadwalan utas, nonaktifkan utas saat ini sebelum lisensi tersedia. Static Void Park (Object Blocker) // Untuk penjadwalan utas, tunggu waktu tunggu yang ditentukan paling banyak kecuali lisensi tersedia. Static Void Parknanos (Long Nanos) // Untuk penjadwalan utas, nonaktifkan utas saat ini sebelum lisensi tersedia dan tunggu waktu tunggu yang ditentukan paling banyak. Static void Parknanos (Object Blocker, Long Nanos) // Untuk penjadwalan utas, utas saat ini dinonaktifkan sebelum batas waktu yang ditentukan kecuali lisensi tersedia. static void parkuntil (batas waktu panjang) // Untuk penjadwalan utas, utas saat ini dinonaktifkan sebelum batas waktu yang ditentukan kecuali lisensi tersedia. static void parkuntil (objek blocker, batas waktu panjang) // membuatnya tersedia jika lisensi utas yang diberikan belum tersedia. static void unpark (utas utas)
Contoh LockSupport
Membandingkan "Contoh 1" dan "Contoh 2" di bawah ini dapat memberi Anda pemahaman yang lebih jelas tentang penggunaan Locksupport.
Contoh 1
kelas publik waittest1 {public static void main (string [] args) {threada ta = new threada ("ta"); disinkronkan (ta) {// Dapatkan "kunci sinkronisasi objek TA" melalui sinkronisasi (ta) coba {system.out.println (thread.currentThread (). getName ()+"start ta"); ta.start (); System.out.println (thread.currentThread (). GetName ()+"block"); // utas utama sedang menunggu ta.wait (); System.out.println (thread.currentThread (). GetName ()+"lanjutkan"); } catch (InterruptedException e) {E.PrintStackTrace (); }}} kelas statis threada memperluas thread {public threada (nama string) {super (name); } public void run () {disinkronkan (ini) {// Dapatkan "kunci sinkronisasi objek saat ini" melalui sinkronisasi (this) system.out.println (thread.currentThread (). getName ()+"wakup lainnya"); memberitahu(); // bangun "utas tunggu pada objek saat ini"}}}} Contoh 2
Impor java.util.concurrent.locks.locksupport; kelas publik locksupportTest1 {private static thread mainthread; public static void main (string [] args) {threada ta = new threada ("ta"); // Dapatkan utas utama mainThread = thread.currentThread (); System.out.println (thread.currentThread (). GetName ()+"Mulai ta"); ta.start (); System.out.println (thread.currentThread (). GetName ()+"block"); // Thread utama memblokir locksupport.park (MainThread); System.out.println (thread.currentThread (). GetName ()+"lanjutkan"); } kelas statis threada memperluas thread {public threada (name string) {super (name); } public void run () {System.out.println (thread.currentThread (). getName ()+"Wakup lainnya"); // Bangunkan "utas utama" locksupport.unpark (mainthread); }}} Hasil Menjalankan:
start utama tamain blockta bangun lainnya
Deskripsi: Perbedaan antara taman dan tunggu. Sebelum blok menunggu utas, kunci sinkronisasi harus diperoleh melalui disinkronkan.