Jadual Kandungan
1. Pengenalan kepada kunci teragih
boleh membantu kita mencapai pengecualian bersama.
127.0.0.1:6379> uniqueValue EX 3 NX
4. 如何实现可重入锁
Rumah Java javaTutorial Bagaimana untuk melaksanakan kunci diedarkan Java

Bagaimana untuk melaksanakan kunci diedarkan Java

Apr 25, 2023 pm 06:19 PM
java

1. Pengenalan kepada kunci teragih

Mesin tunggal berbilang benang: Di Java, kami biasanya menggunakan kunci tempatan seperti kelas ReetrantLock dan kata kunci yang disegerakkan untuk mengawal berbilang benang dalam proses JVM untuk mengakses perkongsian setempat sumber. Jika berbilang proses JVM berkongsi sumber yang sama, tiada cara untuk mencapai akses eksklusif bersama kepada sumber menggunakan kunci tempatan. Oleh itu, kunci yang diedarkan dilahirkan.

Contohnya: Sebanyak 3 salinan perkhidmatan pesanan sistem digunakan, semuanya menyediakan perkhidmatan kepada dunia luar. Pengguna perlu menyemak inventori sebelum membuat pesanan Untuk mengelakkan penjualan berlebihan, kunci diperlukan untuk mencapai akses segerak kepada operasi semakan inventori. Memandangkan perkhidmatan pesanan terletak dalam proses JVM yang berbeza, kunci tempatan tidak akan berfungsi dengan betul dalam kes ini. Kita perlu menggunakan kunci yang diedarkan, supaya walaupun beberapa utas tidak berada dalam proses JVM yang sama, mereka boleh mendapatkan kunci yang sama, dengan itu mencapai akses eksklusif bersama kepada sumber yang dikongsi. Bagaimana untuk melaksanakan kunci diedarkan Java

Kunci teragih paling asas perlu dipenuhi:

Bagaimana untuk melaksanakan kunci diedarkan Java

Pengecualian bersama: pada bila-bila masa, kunci hanya boleh dipegang oleh satu utas Tahan;

  • Sangat tersedia: Perkhidmatan kunci sangat tersedia. Lebih-lebih lagi, walaupun terdapat masalah dengan logik kod pelanggan untuk melepaskan kunci, kunci itu akhirnya akan dilepaskan dan tidak akan menjejaskan akses utas lain kepada sumber yang dikongsi.

  • Pendaftar semula: Selepas nod memperoleh kunci, ia boleh memperoleh kunci itu semula.

  • 2. Laksanakan kunci teragih berdasarkan Redis

    1 Cara melaksanakan kunci teragih paling mudah berdasarkan Redis
Sama ada kunci tempatan. atau Teras kunci yang diedarkan terletak pada == "pengecualian bersama" ==.

Di Redis, perintah

boleh membantu kita mencapai pengecualian bersama.

Iaitu, SET if Not eXists (sepadan dengan kaedah setIfAbsent dalam Java Jika kunci tidak wujud, nilai kunci akan ditetapkan). Jika kunci sudah wujud, SETNX tidak melakukan apa-apa.

> SETNX lockKey uniqueValueSETNX(integer) 1SETNX> SETNX lockKey uniqueValue

(integer) 0


terus Padamkan kekunci yang sepadan melalui arahan DEL

> DEL lockKey
(integer) 1

Untuk mengelakkan pemadaman kunci lain secara tidak sengaja, kami mengesyorkan di sini Gunakan skrip Lua untuk menilai dengan nilai (nilai unik) yang sepadan dengan kunci.


Skrip Lua dipilih untuk memastikan keatoman operasi buka kunci. Kerana Redis boleh melaksanakan skrip Lua dengan cara atom, dengan itu memastikan keatoman operasi pelepasan kunci.

Ini adalah pelaksanaan kunci teragih Redis yang paling mudah Kaedah pelaksanaannya agak mudah dan prestasinya sangat cekap. Walau bagaimanapun, terdapat beberapa masalah dengan melaksanakan penguncian teragih dengan cara ini. Contohnya, jika aplikasi menghadapi beberapa masalah, seperti logik untuk melepaskan kunci tiba-tiba ditutup, kunci mungkin tidak dilepaskan dan sumber yang dikongsi tidak lagi boleh diakses oleh urutan/proses lain.
// 释放锁时,先比较锁对应的 value 值是否相等,避免锁的误释放
if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end
Salin selepas log masuk

2. Mengapakah kita perlu menetapkan masa tamat tempoh untuk kunci Bagaimana untuk melaksanakan kunci diedarkan Java

Terutamanya untuk mengelakkan kunci daripada dilepaskan

127.0.0.1:6379> uniqueValue EX 3 NX

OK


lockKey: nama kunci;

  • uniqueValue: rentetan rawak yang mengenal pasti secara unik kunci;

  • NX: SET hanya boleh berjaya apabila nilai kunci yang sepadan dengan lockKey tidak wujud; dalam saat) ) EX 3 menunjukkan bahawa kunci ini mempunyai masa tamat tempoh automatik selama 3 saat. Sepadan dengan EX ialah PX (dalam milisaat), kedua-duanya adalah tetapan masa tamat tempoh.

  • Pastikan anda memastikan bahawa menetapkan nilai dan masa tamat tempoh kunci yang ditentukan ialah operasi atom! ! ! Jika tidak, mungkin masih terdapat masalah bahawa kunci tidak boleh dilepaskan.

    Penyelesaian ini juga mempunyai kelemahan:
  • Jika masa untuk mengendalikan sumber yang dikongsi lebih besar daripada masa tamat tempoh, akan ada masalah tamat tempoh awal kunci , yang akan membawa kepada kunci teragih Kegagalan langsung

Jika tamat masa kunci ditetapkan terlalu lama, ia akan menjejaskan prestasi

  • 3 mencapai pembaharuan kunci yang anggun

    Redisson ialah klien Redis bahasa Java sumber terbuka yang menyediakan banyak ciri luar kotak, termasuk bukan sahaja pelaksanaan berbilang kunci teragih. Selain itu, Redisson juga menyokong berbilang seni bina penggunaan seperti Redis berdiri sendiri, Redis Sentinel dan Redis Cluster.
  • Kunci yang diedarkan dalam Redisson dilengkapi dengan mekanisme pembaharuan automatik Ia sangat mudah digunakan dan prinsipnya agak mudah. ​​Ia menyediakan Watch Dog yang digunakan khas untuk memantau dan memperbaharui kunci sumber yang dikongsi belum menyelesaikan pelaksanaannya, Watch Dog akan terus memanjangkan masa tamat tempoh kunci untuk memastikan bahawa kunci tidak akan dilepaskan kerana tamat masa.

    Bagaimana untuk melaksanakan kunci diedarkan Java

    使用方式举例:

    // 1.获取指定的分布式锁对象
    RLock lock = redisson.getLock("lock");
    // 2.拿锁且不设置锁超时时间,具备 Watch Dog 自动续期机制
    lock.lock();
    // 3.执行业务
    ...
    // 4.释放锁
    lock.unlock();

    只有未指定锁超时时间,才会使用到 Watch Dog 自动续期机制。

    // 手动给锁设置过期时间,不具备 Watch Dog 自动续期机制
    lock.lock(10, TimeUnit.SECONDS);
    Salin selepas log masuk

    总的来说就是使用Redisson,它带有自动的续期机制

    4. 如何实现可重入锁

    所谓可重入锁指的是在一个线程中可以多次获取同一把锁,比如一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法即可重入 ,而无需重新获得锁。像 Java 中的 synchronized 和 ReentrantLock 都属于可重入锁。

    可重入分布式锁的实现核心思路是线程在获取锁的时候判断是否为自己的锁,如果是的话,就不用再重新获取了。为此,我们可以为每个锁关联一个可重入计数器和一个占有它的线程。当可重入计数器大于 0 时,则锁被占有,需要判断占有该锁的线程和请求获取锁的线程是否为同一个。

    Atas ialah kandungan terperinci Bagaimana untuk melaksanakan kunci diedarkan 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)

Topik panas

Tutorial Java
1657
14
Tutorial PHP
1257
29
Tutorial C#
1231
24
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

PHP: Bahasa utama untuk pembangunan web PHP: Bahasa utama untuk pembangunan web Apr 13, 2025 am 12:08 AM

PHP adalah bahasa skrip yang digunakan secara meluas di sisi pelayan, terutamanya sesuai untuk pembangunan web. 1.PHP boleh membenamkan HTML, memproses permintaan dan respons HTTP, dan menyokong pelbagai pangkalan data. 2.PHP digunakan untuk menjana kandungan web dinamik, data borang proses, pangkalan data akses, dan lain -lain, dengan sokongan komuniti yang kuat dan sumber sumber terbuka. 3. PHP adalah bahasa yang ditafsirkan, dan proses pelaksanaan termasuk analisis leksikal, analisis tatabahasa, penyusunan dan pelaksanaan. 4.Php boleh digabungkan dengan MySQL untuk aplikasi lanjutan seperti sistem pendaftaran pengguna. 5. Apabila debugging php, anda boleh menggunakan fungsi seperti error_reporting () dan var_dump (). 6. Mengoptimumkan kod PHP untuk menggunakan mekanisme caching, mengoptimumkan pertanyaan pangkalan data dan menggunakan fungsi terbina dalam. 7

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

PHP vs Bahasa Lain: Perbandingan PHP vs Bahasa Lain: Perbandingan Apr 13, 2025 am 12:19 AM

PHP sesuai untuk pembangunan web, terutamanya dalam pembangunan pesat dan memproses kandungan dinamik, tetapi tidak baik pada sains data dan aplikasi peringkat perusahaan. Berbanding dengan Python, PHP mempunyai lebih banyak kelebihan dalam pembangunan web, tetapi tidak sebaik python dalam bidang sains data; Berbanding dengan Java, PHP melakukan lebih buruk dalam aplikasi peringkat perusahaan, tetapi lebih fleksibel dalam pembangunan web; Berbanding dengan JavaScript, PHP lebih ringkas dalam pembangunan back-end, tetapi tidak sebaik JavaScript dalam pembangunan front-end.

PHP vs Python: Ciri dan Fungsi Teras PHP vs Python: Ciri dan Fungsi Teras Apr 13, 2025 am 12:16 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri dan sesuai untuk senario yang berbeza. 1.PHP sesuai untuk pembangunan web dan menyediakan pelayan web terbina dalam dan perpustakaan fungsi yang kaya. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan standard yang kuat. Apabila memilih, ia harus diputuskan berdasarkan keperluan projek.

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

Impak PHP: Pembangunan Web dan seterusnya Impak PHP: Pembangunan Web dan seterusnya Apr 18, 2025 am 12:10 AM

Phphassignificantelympactedwebdevelopmentandextendsbeyondit.1) itpowersmajorplatformslikeworderpressandexcelsindatabaseIntions.2) php'SadaptabilityAldoStoScaleforlargeapplicationFrameworksLikelara.3)

PHP: asas banyak laman web PHP: asas banyak laman web Apr 13, 2025 am 12:07 AM

Sebab mengapa PHP adalah timbunan teknologi pilihan untuk banyak laman web termasuk kemudahan penggunaannya, sokongan komuniti yang kuat, dan penggunaan yang meluas. 1) Mudah dipelajari dan digunakan, sesuai untuk pemula. 2) Mempunyai komuniti pemaju yang besar dan sumber yang kaya. 3) Digunakan secara meluas dalam platform WordPress, Drupal dan lain -lain. 4) Mengintegrasikan dengan ketat dengan pelayan web untuk memudahkan penggunaan pembangunan.

See all articles