Jadual Kandungan
显式锁
 一、Lock与ReentrantLock
  1.基本语义:
  2.轮询锁与定时锁
  3.可中断的锁获取操作
二、公平性
三、读-写锁
  1、交互和实现方式
Rumah Java javaTutorial java并发编程之显式锁详解

java并发编程之显式锁详解

Jun 25, 2017 am 10:26 AM
java serentak pengaturcaraan

显式锁

 一、Lock与ReentrantLock

  Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有的加锁和解锁方法都是显式的

  ReentrantLock实现了Lock:并提供了和synchronized相同的内存语义;同时提供了可重入的加锁语义

  1.基本语义:

void LockDefinition() {
        Lock lock = new ReentrantLock();try {//do someting//更新对象状态,捕获异常;并在必要时恢复不变性条件} finally {//finally中释放锁            lock.unlock();
        }
    }
Salin selepas log masuk

 

  2.轮询锁与定时锁

    lock.tryLock([Long,TimeUnit]):尝试获取锁,带上时间就是定时锁

  3.可中断的锁获取操作

    lock.lockInterruptibly();

二、公平性

  ReentrantLock可以创造公平锁(已请求顺序获取锁)和非公平锁(可插队)。

    插队:当一个线程请求非公平锁,如果在发出请求的同时该锁的状态可用,那么这个线程不会放入队列,会跳过队列中所有的等待线程并获得锁;

    注意:非公平锁并不提倡插队,但无法防止插队;而公平锁则是会放入队列中顺序执行

    非公平锁在竞争激烈时速度比公平锁快:原因是在恢复一个在队列中的线程与该线程开始运行之间存在严重的延迟

三、读-写锁

  ReentrantLock是标准的互斥锁,但是在某些场景如:读读可并行无法实现

  ReadWriteLock读写锁:实现ReentrantReadWriteLock:方法readLock读锁和writeLock写锁

  1、交互和实现方式

    释放优先:当一个写锁被释放,而队列中同时存在读和写,那么应该优先选择读,写,还是最先发出请求的线程?

    读线程插队:当前读锁,有写锁在等待,那么后面来的读锁要不要插队直接读?如果直接读会提高并发但是会可能造成写饥饿获取不到

    重入性:读锁和写锁是否可重入?

    降级:写锁,能否在不释放锁情况下获取读锁,使该线程的锁降级?

    升级:读锁能否优先于其他等待线程升级为写锁?如果两个线程试图同时升级为写锁,那么容易造成死锁

  适用于:读取操作为主的数据结构

 

Atas ialah kandungan terperinci java并发编程之显式锁详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Penyelesaian Masalah dengan Python: Buka Kunci Penyelesaian Berkuasa sebagai Pengekod Pemula Penyelesaian Masalah dengan Python: Buka Kunci Penyelesaian Berkuasa sebagai Pengekod Pemula Oct 11, 2024 pm 08:58 PM

Pythonmemperkasakan pemula dalam menyelesaikan masalah.Sintaksnya yang mesra pengguna, perpustakaan luas, dan ciri-ciri seperti pembolehubah, pernyataan bersyarat, dan pembangunan kod yang cekap boleh dilonggarkan. Daripada mengurus data untuk mengawal aliran program dan melaksanakan tugasan berulang, Pythonprovid

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Kunci Pengekodan: Membuka Kunci Kuasa Python untuk Pemula Kunci Pengekodan: Membuka Kunci Kuasa Python untuk Pemula Oct 11, 2024 pm 12:17 PM

Python ialah bahasa pengenalan pengaturcaraan yang ideal untuk pemula melalui kemudahan pembelajaran dan ciri yang berkuasa. Asasnya termasuk: Pembolehubah: digunakan untuk menyimpan data (nombor, rentetan, senarai, dll.). Jenis data: Mentakrifkan jenis data dalam pembolehubah (integer, titik terapung, dll.). Operator: digunakan untuk operasi matematik dan perbandingan. Aliran kawalan: Kawal aliran pelaksanaan kod (penyataan bersyarat, gelung).

Lepaskan Pengaturcara Dalaman Anda: C untuk Pemula Mutlak Lepaskan Pengaturcara Dalaman Anda: C untuk Pemula Mutlak Oct 11, 2024 pm 03:50 PM

C ialah bahasa yang sesuai untuk pemula untuk mempelajari pengaturcaraan, dan kelebihannya termasuk kecekapan, serba boleh dan mudah alih. Mempelajari bahasa C memerlukan: Memasang pengkompil C (seperti MinGW atau Cygwin) Memahami pembolehubah, jenis data, pernyataan bersyarat dan pernyataan gelung Menulis program pertama yang mengandungi fungsi utama dan fungsi printf() Berlatih melalui kes praktikal (seperti mengira purata) C pengetahuan bahasa

Demystifying C: Laluan Yang Jelas dan Mudah untuk Pengaturcara Baharu Demystifying C: Laluan Yang Jelas dan Mudah untuk Pengaturcara Baharu Oct 11, 2024 pm 10:47 PM

C ialah pilihan ideal untuk pemula untuk mempelajari pengaturcaraan sistem Ia mengandungi komponen berikut: fail pengepala, fungsi dan fungsi utama. Program C mudah yang boleh mencetak "HelloWorld" memerlukan fail pengepala yang mengandungi pengisytiharan fungsi input/output standard dan menggunakan fungsi printf dalam fungsi utama untuk mencetak. Program C boleh disusun dan dijalankan dengan menggunakan pengkompil GCC. Selepas anda menguasai asas, anda boleh beralih kepada topik seperti jenis data, fungsi, tatasusunan dan pengendalian fail untuk menjadi pengaturcara C yang mahir.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

Kuasa Python, Dipermudahkan: Pendekatan Mesra Pemula untuk Pengaturcaraan Kuasa Python, Dipermudahkan: Pendekatan Mesra Pemula untuk Pengaturcaraan Oct 11, 2024 pm 04:53 PM

Bermula dengan Pengaturcaraan Python Pasang Python: Muat turun dan pasang dari tapak web rasmi. HelloWorld!: Gunakan print("HelloWorld!") untuk mencetak baris pertama kod. Kes praktikal: Kira luas bulatan: Gunakan π (3.14159) dan jejari untuk mengira luas bulatan. Pembolehubah dan jenis data: Gunakan pembolehubah untuk menyimpan data Jenis data dalam Python termasuk integer, nombor titik terapung, rentetan dan nilai Boolean. Ungkapan dan tugasan: Gunakan operator untuk menyambungkan pembolehubah, pemalar dan fungsi, dan gunakan operator penugasan (=) untuk menetapkan nilai kepada pembolehubah. Aliran kawalan: pernyataan if-else: laksanakan blok kod yang berbeza berdasarkan keadaan, tentukan ganjil

Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Cipta Masa Depan: Pengaturcaraan Java untuk Pemula Mutlak Oct 13, 2024 pm 01:32 PM

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.

See all articles