Rumah Java javaTutorial Bagaimana untuk menyelesaikan isu perbalahan benang dan perbalahan sumber di Java

Bagaimana untuk menyelesaikan isu perbalahan benang dan perbalahan sumber di Java

Oct 08, 2023 pm 01:21 PM
Pengurusan sumber kunci mutex Penyegerakan benang

Bagaimana untuk menyelesaikan isu perbalahan benang dan perbalahan sumber di Java

Cara menyelesaikan masalah persaingan benang dan pertikaian sumber dalam Java

Dalam pengaturcaraan berbilang benang, isu persaingan benang dan pertikaian sumber adalah perkara biasa jika tidak dikendalikan dengan betul, ia akan membawa kepada masalah keselamatan dan prestasi program. Artikel ini akan memperkenalkan beberapa penyelesaian biasa dan memberikan contoh kod khusus.

1. Gunakan kata kunci yang disegerakkan
Kata kunci yang disegerakkan ialah kaedah paling asas dalam Java untuk menyelesaikan masalah persaingan benang dan pertikaian sumber. Ia boleh menandakan blok kod atau kaedah sebagai disegerakkan supaya hanya satu utas boleh melaksanakannya pada satu masa.

  1. Gunakan kata kunci yang disegerakkan untuk mengubah suai kaedah:
public synchronized void synchronizedMethod(){
    // 同步代码块
}
Salin selepas log masuk
  1. Gunakan kata kunci yang disegerakkan untuk mengubah suai blok kod:
public void nonSynchronizedMethod(){
    synchronized (this){
        // 同步代码块
    }
}
Salin selepas log masuk

Dalam contoh di atas, kata kunci yang disegerakkan menandakan kaedah atau blok kod sebagai menyegerakkan bahawa terdapat penyegerakan hanya satu pada masa yang sama Benang boleh mengaksesnya, dengan itu mengelakkan perbalahan benang dan perbalahan untuk sumber.

2. Gunakan antara muka Lock dan kelas ReentrantLock
Selain kata kunci yang disegerakkan, Java juga menyediakan antara muka Lock dan kelas ReentrantLock untuk menyelesaikan masalah persaingan benang dan pertikaian sumber. Tidak seperti disegerakkan, antara muka Lock dan kelas ReentrantLock memberikan lebih fleksibiliti dan fungsi.

  1. Menggunakan antara muka Lock dan kelas ReentrantLock:
Lock lock = new ReentrantLock();

public void synchronizedMethod(){
    lock.lock();
    try{
        // 同步代码块
    }finally{
        lock.unlock();
    }
}
Salin selepas log masuk

Dalam contoh di atas, objek ReentrantLock pertama kali dicipta, kemudian kaedah lock() digunakan untuk memperoleh kunci, dan kaedah buka kunci() digunakan dalam percubaan -akhirnya kenyataan untuk melepaskan kunci. Ini memastikan bahawa hanya satu utas boleh melaksanakan blok kod disegerakkan pada masa yang sama.

3. Gunakan kelas Semaphore
Jika anda perlu mengawal bilangan utas yang mengakses sumber tertentu pada masa yang sama, anda boleh menggunakan kelas Semaphore untuk menyelesaikan masalah. Kelas Semaphore ialah semaphore mengira yang boleh menentukan berbilang benang untuk mengakses sumber yang dikongsi pada masa yang sama.

  1. Menggunakan kelas Semaphore:
Semaphore semaphore = new Semaphore(2); // 允许同时访问的线程数为2

public void synchronizedMethod(){
    try{
        semaphore.acquire(); // 获取许可
        // 同步代码块
    }catch(InterruptedException e){
        // 异常处理
    }finally{
        semaphore.release(); // 释放许可
    }
}
Salin selepas log masuk

Dalam contoh di atas, objek Semaphore pertama kali dicipta dan bilangan utas yang dibenarkan untuk mengakses secara serentak dinyatakan sebagai 2. Kemudian gunakan kaedah acquire() untuk mendapatkan kebenaran Jika kebenaran tidak tersedia, benang akan disekat sehingga kebenaran tersedia. Akhir sekali, gunakan kaedah release() dalam kenyataan akhirnya untuk melepaskan lesen.

Dengan cara ini, hanya bilangan utas yang ditentukan boleh melaksanakan blok kod disegerakkan pada masa yang sama, dan utas lain perlu menunggu kebenaran untuk masuk.

4. Gunakan antara muka Keadaan dan kelas ReentrantLock
Antara muka keadaan dan kelas ReentrantLock boleh digunakan bersama untuk mengawal persaingan benang dan isu perbalahan sumber dengan lebih fleksibel. Antara muka Keadaan menyediakan kaedah seperti await() dan signal() untuk melaksanakan operasi menunggu benang dan bangun.

  1. Menggunakan antara muka Keadaan dan kelas ReentrantLock:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

public void waitMethod(){
    lock.lock();
    try{
        while(conditionFlag){
            condition.await(); // 线程等待
        }
        // 同步代码块
    }catch(InterruptedException e){
        // 异常处理
    }finally{
        lock.unlock();
    }
}

public void signalMethod(){
    lock.lock();
    try{
        conditionFlag = false;
        condition.signal(); // 唤醒线程
    }finally{
        lock.unlock();
    }
}
Salin selepas log masuk

Dalam contoh di atas, objek ReentrantLock dan objek Keadaan mula-mula dicipta. Dalam kaedah waitMethod(), gunakan kaedah lock() untuk memperoleh kunci dan gunakan kaedah await() dalam gelung while untuk membuat benang menunggu sehingga conditionFlag adalah palsu. Dalam kaedah signalMethod(), gunakan kaedah lock() untuk memperoleh kunci, tetapkan conditionFlag kepada false dan gunakan kaedah signal() untuk membangkitkan benang.

Dengan cara ini, operasi menunggu benang dan bangun tidur dapat direalisasikan, dengan itu mengawal persaingan benang dan isu perbalahan sumber.

Ringkasan
Isu persaingan benang dan pertikaian sumber sering dihadapi dalam pengaturcaraan berbilang benang, dan penyelesaian yang sesuai perlu diguna pakai untuk memastikan keselamatan dan prestasi program. Artikel ini memperkenalkan penggunaan kata kunci yang disegerakkan, antara muka Lock dan kelas ReentrantLock, kelas Semaphore, antara muka Keadaan dan kelas ReentrantLock untuk menyelesaikan masalah persaingan benang dan pertikaian sumber serta menyediakan contoh kod yang sepadan. Saya berharap pembaca dapat memilih kaedah yang sesuai untuk menyelesaikan masalah berdasarkan keperluan sebenar.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan isu perbalahan benang dan perbalahan sumber di 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)

Bagaimana untuk menyelesaikan masalah penukaran tetingkap dalam Win10 Bagaimana untuk menyelesaikan masalah penukaran tetingkap dalam Win10 Jan 13, 2024 am 10:33 AM

Sistem win10 adalah sistem terkini, dan banyak perisian mungkin tidak disesuaikan dengannya. Pakej pemasangan sistem baharu juga mungkin mempunyai banyak pepijat yang boleh menyebabkan masalah. Bagaimana untuk menyelesaikan masalah bahawa kaedah input tidak boleh ditukar dalam sistem win10 1. Klik butang "Mula" untuk membuka "Panel Kawalan" 2. Klik "Nyahpasang program" 3. Klik "Lihat kemas kini yang dipasang" di tetingkap kiri 4. Cari "pakej kemas kini tetingkap KB3033889" Hanya nyahpasang dan mulakan semula

Bagaimana untuk memadamkan sandaran permulaan dalam Penjelajah Fail Windows 11 Bagaimana untuk memadamkan sandaran permulaan dalam Penjelajah Fail Windows 11 Feb 18, 2024 pm 05:40 PM

Jika anda ingin menyembunyikan pilihan "Mulakan Sandaran" dalam Penjelajah Fail Windows 11, inilah yang boleh anda lakukan. Terdapat beberapa cara untuk melumpuhkan atau menyembunyikan pilihan sandaran permulaan dalam File Explorer, dan kami akan menyenaraikan secara ringkas beberapa kaedah untuk membantu anda menyelesaikan tugas ini dengan cepat. Sebelum anda bermula, anda perlu memahami bahawa pilihan ini berkait rapat dengan OneDrive. Sebaik sahaja anda membuka folder pustaka (seperti Dokumen, Gambar, Muzik, dsb.), ia akan muncul serta-merta dalam laluan penjelajah fail. Bagaimana untuk memadamkan sandaran permulaan dalam Penjelajah Fail Windows 11 Untuk memadamkan sandaran permulaan dalam Penjelajah Fail Windows 11, ikut langkah di bawah

Kaedah pelaksanaan penyegerakan benang dan pengecualian bersama dalam bahasa Java Kaedah pelaksanaan penyegerakan benang dan pengecualian bersama dalam bahasa Java Jun 10, 2023 am 09:43 AM

Bahasa Java memperkenalkan multi-threading pada awalnya Penggunaan benang menjadikan bahasa Java bersinar dalam pemprosesan program serentak. Walau bagaimanapun, isu penyegerakan dan isu pengecualian bersama antara benang sentiasa menjadi kunci kepada proses pengaturcaraan. Dalam bahasa Java, terdapat banyak cara untuk melaksanakan penyegerakan benang dan pengecualian bersama Artikel ini akan memperkenalkan beberapa daripadanya. 1. Gunakan kata kunci yang disegerakkan untuk mencapai penyegerakan dan pengecualian bersama Disegerakkan ialah cara paling asas untuk mencapai penyegerakan dan pengecualian bersama dalam bahasa Java. di Jawa

Penyelesaian tersekat proses Linux Penyelesaian tersekat proses Linux Jun 30, 2023 pm 12:49 PM

Cara menyelesaikan masalah lag proses dalam sistem Linux Apabila kami menggunakan sistem pengendalian Linux, kadangkala kami menghadapi lag proses, yang membawa kesulitan kepada kerja dan penggunaan kami. Selang proses mungkin disebabkan oleh pelbagai sebab, seperti sumber yang tidak mencukupi, kebuntuan, penyekatan IO, dsb. Dalam artikel ini, kita akan membincangkan beberapa kaedah dan teknik untuk menyelesaikan masalah terperangkap proses. Pertama, kita perlu mengenal pasti punca lag proses. Anda boleh menemui masalah dengan cara berikut: Gunakan alat pemantauan sistem: Anda boleh menggunakan alatan seperti atas,

Cara menangani penyegerakan benang dan isu akses serentak dalam pembangunan C# Cara menangani penyegerakan benang dan isu akses serentak dalam pembangunan C# Oct 08, 2023 pm 12:16 PM

Cara menangani masalah penyegerakan benang dan akses serentak dalam pembangunan C# memerlukan contoh kod khusus Dalam pembangunan C#, isu penyegerakan benang dan akses serentak adalah cabaran biasa. Oleh kerana berbilang rangkaian boleh mengakses dan beroperasi pada data yang dikongsi secara serentak, keadaan perlumbaan dan ketidakkonsistenan data boleh timbul. Untuk menyelesaikan masalah ini, kami boleh menggunakan pelbagai mekanisme penyegerakan dan kaedah kawalan konkurensi untuk memastikan kerjasama yang betul dan konsistensi data antara rangkaian. Kunci Mutex (Mutex) Kunci Mutex ialah mekanisme penyegerakan paling asas yang digunakan untuk melindungi sumber yang dikongsi. Lawati apabila diperlukan

Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C# Cara menangani penyegerakan benang dan isu dan penyelesaian akses serentak dalam pembangunan C# Oct 08, 2023 am 09:55 AM

Cara menangani penyegerakan benang dan masalah akses serentak dan penyelesaian dalam pembangunan C# Dengan pembangunan sistem komputer dan pemproses, populariti pemproses berbilang teras menjadikan pengkomputeran selari dan pengaturcaraan berbilang benang sangat penting. Dalam pembangunan C#, penyegerakan benang dan isu akses serentak merupakan cabaran yang sering kita hadapi. Kegagalan untuk mengendalikan isu ini dengan betul boleh membawa kepada akibat yang serius seperti perlumbaan data (DataRace), kebuntuan (Kebuntuan) dan pertikaian sumber (ResourceContention). Oleh itu, artikel ini akan

Pemahaman mendalam tentang prinsip pembangunan asas PHP: pengoptimuman memori dan pengurusan sumber Pemahaman mendalam tentang prinsip pembangunan asas PHP: pengoptimuman memori dan pengurusan sumber Sep 08, 2023 pm 01:21 PM

Pemahaman mendalam tentang prinsip pembangunan asas PHP: pengoptimuman memori dan pengurusan sumber Dalam pembangunan PHP, pengoptimuman memori dan pengurusan sumber adalah salah satu faktor yang sangat penting. Pengurusan memori dan penggunaan sumber yang baik boleh meningkatkan prestasi dan kestabilan aplikasi. Artikel ini akan menumpukan pada prinsip pengoptimuman memori dan pengurusan sumber dalam pembangunan asas PHP, dan menyediakan beberapa contoh kod untuk membantu pembaca memahami dan menggunakannya dengan lebih baik. Prinsip pengurusan memori PHP Pengurusan memori PHP dilaksanakan melalui pengiraan rujukan.

Bagaimana untuk mencapai penyegerakan benang menggunakan mekanisme kunci di Jawa? Bagaimana untuk mencapai penyegerakan benang menggunakan mekanisme kunci di Jawa? Aug 02, 2023 pm 01:47 PM

Bagaimana untuk mencapai penyegerakan benang menggunakan mekanisme kunci di Jawa? Dalam pengaturcaraan berbilang benang, penyegerakan benang adalah konsep yang sangat penting. Apabila berbilang rangkaian mengakses dan mengubah suai sumber dikongsi pada masa yang sama, ketidakkonsistenan data atau keadaan perlumbaan mungkin berlaku. Java menyediakan mekanisme penguncian untuk menyelesaikan masalah ini dan memastikan akses selamat benang kepada sumber yang dikongsi. Mekanisme penguncian dalam Java disediakan oleh kata kunci yang disegerakkan dan antara muka Kunci. Seterusnya, kita akan belajar cara menggunakan kedua-dua mekanisme ini untuk mencapai penyegerakan benang. Gunakan penyegerakan

See all articles