Reentrantlock diimplementasikan secara internal oleh instance kelas sinkronisasi.
Kelas sinkronisasi didefinisikan di dalam reentrantlock.
Sinkronisasi warisan dari AbstractQueuedSynchronizer.
AbstractQueuedSynchronizer mewarisi dari AbstractOntribleSynchronizer.
Hanya variabel ExclusiveOwnerThread yang didefinisikan dalam kelas AbstractOnTables Synchronizer, mewakili utas yang saat ini dimiliki.
Selain kelas sinkronisasi, Reentrantlock juga mendefinisikan dua kelas implementasi secara internal.
Nonfairsync adalah kunci yang tidak adil. Fairsync adalah kunci yang adil.
Dua konstruksi reentrantlock adalah sebagai berikut:
Metode kunci reentrantlock
Metode kunci yang tidak adil
Metode CompareandsetState adalah metode CAS. Metode ini mencoba memperbarui variabel di objek. Variabel diharapkan menjadi 0, diperbarui ke 1.
Jika pembaruan berhasil, atur variabel ExclusiveOwnerThread ke utas saat ini. Maka metode kunci akan segera kembali.
Jika pembaruan gagal, peroleh (1) dipanggil.
Dalam metode perolehan, tryacquire () disebut terlebih dahulu dan cobalah untuk memperbarui lagi.
Metode tryacquire () dari kunci yang tidak adil adalah sebagai berikut:
Metode nonfairtryacquire () dari kunci yang tidak adil disebut secara internal dengan metode nonfairtryacquire sebagai berikut:
Jika metode tryacquire () dicoba lagi tanpa berhasil. Pertama, metode addWaiter () akan dipanggil untuk menambahkan utas saat ini ke antrian menunggu. Metode Addwaaiter mengembalikan simpul simpul.
Setelah kembali ke node, diakuisisi (node, 1) akan mencoba memperbarui lagi.
Jika pembaruan masih belum dapat diperbarui, utas akan ditangguhkan melalui ParkandCheckInterrupt.
Metode Buka Kunci Reentrantlock
Lihat metode rilis ().
Jika kepala antrian tidak kosong dan kondisi kepala yang menunggu tidak 0, metode unparkuccessor () dipanggil.
Metode Unparkuccessor () adalah sebagai berikut:
Buat node terdekat melintasi dari belakang ke depan untuk mendapatkan utas pertama dalam antrian dengan Waitstatus kurang dari 0. Kemudian lanjutkan utas pada node.