Rumah Java javaTutorial Pemahaman mendalam tentang prinsip berbilang benang Java: daripada mekanisme penjadualan kepada pengurusan sumber yang dikongsi

Pemahaman mendalam tentang prinsip berbilang benang Java: daripada mekanisme penjadualan kepada pengurusan sumber yang dikongsi

Feb 22, 2024 pm 11:42 PM
java multithreading Mekanisme penyegerakan Sumber perkongsian berbilang benang prinsip benang java

Pemahaman mendalam tentang prinsip berbilang benang Java: daripada mekanisme penjadualan kepada pengurusan sumber yang dikongsi

Pemahaman mendalam tentang prinsip berbilang benang Java: daripada mekanisme penjadualan kepada pengurusan sumber dikongsi

Pengenalan:
Dalam pembangunan aplikasi komputer moden, pengaturcaraan berbilang benang telah menjadi corak pengaturcaraan biasa. Sebagai bahasa pengaturcaraan yang biasa digunakan, Java menyediakan API yang kaya dan mekanisme pengurusan benang yang cekap dalam pengaturcaraan berbilang benang. Walau bagaimanapun, pemahaman mendalam tentang prinsip multithreading Java adalah penting untuk menulis program multithreading yang cekap dan boleh dipercayai. Artikel ini akan meneroka prinsip Java multi-threading daripada mekanisme penjadualan kepada pengurusan sumber dikongsi, dan mendalami pemahaman melalui contoh kod tertentu.

1. Mekanisme penjadualan:
Dalam pengaturcaraan berbilang benang Java, mekanisme penjadualan adalah kunci untuk mencapai pelaksanaan serentak. Java menggunakan strategi penjadualan awalan Apabila berbilang utas dijalankan pada masa yang sama, CPU akan menentukan masa yang diperuntukkan kepada setiap utas berdasarkan faktor seperti keutamaan, potongan masa dan masa menunggu utas.

Mekanisme penjadualan thread Java boleh dikawal melalui kaedah kelas Thread, seperti tetapan keutamaan thread, tidur dan bangun, dsb. Berikut ialah contoh mudah:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();
        thread1.setPriority(Thread.MIN_PRIORITY);
        thread2.setPriority(Thread.MAX_PRIORITY);
        thread1.start();
        thread2.start();
    }
}
Salin selepas log masuk

Dalam contoh di atas, dua objek utas dicipta, keutamaan berbeza ditetapkan masing-masing, dan kemudian utas dimulakan melalui kaedah mula(). Memandangkan urutan larian benang tidak pasti, keputusan setiap larian mungkin berbeza.

2. Penyegerakan benang dan pengecualian bersama:
Dalam pengaturcaraan berbilang benang, terdapat masalah akses kepada sumber yang dikongsi. Apabila berbilang rangkaian mengakses sumber yang dikongsi pada masa yang sama, masalah seperti keadaan perlumbaan dan ketidakkonsistenan data mungkin berlaku. Oleh itu, Java menyediakan pelbagai mekanisme untuk memastikan penyegerakan benang dan pengecualian bersama akses kepada sumber yang dikongsi.

2.1 kata kunci disegerakkan:
Kata kunci disegerakkan boleh digunakan untuk mengubah suai kaedah atau blok kod untuk menyediakan akses selamat kepada sumber kongsi dalam persekitaran berbilang benang. Apabila benang melaksanakan kaedah disegerakkan atau mengakses blok kod disegerakkan, ia memperoleh kunci objek dan benang lain perlu menunggu kunci dilepaskan.

Berikut ialah contoh mudah:

class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }
    
    public synchronized int getCount() {
        return count;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        thread1.start();
        thread2.start();
        
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("Count: " + counter.getCount());
    }
}
Salin selepas log masuk

Dalam contoh di atas, kelas Kaunter ditakrifkan yang mengandungi kaedah untuk menambah kiraan dan mendapatkan kiraan. Kedua-dua kaedah diubah suai dengan kata kunci yang disegerakkan untuk memastikan akses selamat kepada pembolehubah kiraan. Dalam kelas Utama, dua utas dicipta untuk melaksanakan operasi meningkatkan kiraan masing-masing, dan akhirnya mengeluarkan hasil kiraan.

2.2 Antara muka kunci:
Selain kata kunci yang disegerakkan, Java juga menyediakan antara muka Lock dan kelas pelaksanaannya (seperti ReentrantLock) untuk mencapai penyegerakan benang dan pengecualian bersama. Berbanding dengan disegerakkan, antara muka Lock menyediakan kawalan benang yang lebih fleksibel dan boleh mencapai keperluan penyegerakan yang lebih kompleks.

Berikut ialah contoh penggunaan ReentrantLock:

class Counter {
    private int count = 0;
    private Lock lock = new ReentrantLock();
    
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
    
    public int getCount() {
        lock.lock();
        try {
            return count;
        } finally {
            lock.unlock();
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        thread1.start();
        thread2.start();
        
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("Count: " + counter.getCount());
    }
}
Salin selepas log masuk

Dalam contoh di atas, kelas Counter menggunakan ReentrantLock untuk mencapai akses segerak kepada pembolehubah kiraan. Dalam kaedah increment() dan getCount(), dapatkan kunci dengan memanggil kaedah lock() dan kemudian panggil kaedah buka kunci() dalam blok akhirnya untuk melepaskan kunci.

3 Pengurusan sumber dikongsi:
Dalam pengaturcaraan berbilang benang, pengurusan sumber dikongsi adalah kunci untuk memastikan keselamatan benang. Java menyediakan pelbagai mekanisme untuk mengurus sumber yang dikongsi, seperti kata kunci yang tidak menentu, kelas atom, dsb.

3.1 kata kunci meruap: Kata kunci
meruap digunakan untuk mengubah suai pembolehubah yang dikongsi untuk memastikan setiap bacaan atau tulis beroperasi secara langsung pada memori dan bukannya membaca atau menulis daripada cache. Pembolehubah yang diubah suai dengan kata kunci yang tidak menentu kelihatan kepada semua urutan.

Berikut ialah contoh mudah:

class MyThread extends Thread {
    private volatile boolean flag = false;
    
    public void stopThread() {
        flag = true;
    }
    
    @Override
    public void run() {
        while (!flag) {
            // do something
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        thread.stopThread();
        
        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
Salin selepas log masuk

Dalam contoh di atas, pembolehubah bendera dalam kelas MyThread diubah suai dengan kata kunci yang tidak menentu untuk memastikan pemberhentian selamat benang. Dalam kelas Utama, cipta objek utas, tunggu satu saat selepas memulakan utas, dan kemudian panggil kaedah stopThread() untuk menghentikan utas.

3.2 Kelas atom:
Java menyediakan satu siri kelas atom (seperti AtomicInteger, AtomicLong), yang boleh memastikan operasi atom selamat benang dan mengelakkan keadaan perlumbaan.

Berikut ialah contoh penggunaan AtomicInteger:

class Counter {
    private AtomicInteger count = new AtomicInteger(0);
    
    public void increment() {
        count.incrementAndGet();
    }
    
    public int getCount() {
        return count.get();
    }
}

public class Main {
    public static void main(String[] args) {
        Counter counter = new Counter();
        
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });
        
        thread1.start();
        thread2.start();
        
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("Count: " + counter.getCount());
    }
}
Salin selepas log masuk

Dalam contoh di atas, kelas Counter menggunakan AtomicInteger untuk memastikan pengiraan selamat benang. Dalam kaedah increment(), kiraan dinaikkan secara atom dengan memanggil kaedah incrementAndGet().

Kesimpulan:
Artikel ini meneroka dengan mendalam prinsip-prinsip Java multi-threading daripada mekanisme penjadualan kepada pengurusan sumber yang dikongsi. Memahami prinsip multithreading Java adalah penting untuk menulis program multithreading yang cekap dan boleh dipercayai. Melalui contoh kod di atas, pembaca boleh lebih memahami mekanisme penjadualan dan pengurusan sumber perkongsian Java multi-threading. Pada masa yang sama, pembaca juga boleh memilih mekanisme penyegerakan yang sesuai dan kaedah pengurusan sumber yang dikongsi mengikut keperluan sebenar untuk memastikan ketepatan dan prestasi program berbilang benang.

Atas ialah kandungan terperinci Pemahaman mendalam tentang prinsip berbilang benang Java: daripada mekanisme penjadualan kepada pengurusan sumber yang dikongsi. 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

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

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)

Hubungan ibu bapa-anak antara fungsi golang dan goroutine Hubungan ibu bapa-anak antara fungsi golang dan goroutine Apr 25, 2024 pm 12:57 PM

Terdapat hubungan ibu bapa-anak antara fungsi dan goroutine dalam Go Gooutine induk mencipta goroutine kanak-kanak, dan goroutine kanak-kanak boleh mengakses pembolehubah goroutine induk tetapi bukan sebaliknya. Buat goroutine kanak-kanak menggunakan kata kunci go, dan goroutine kanak-kanak dilaksanakan melalui fungsi tanpa nama atau fungsi bernama. Goroutine induk boleh menunggu goroutine anak selesai melalui penyegerakan.WaitGroup untuk memastikan program tidak keluar sebelum semua goroutine kanak-kanak selesai.

Perbandingan kelebihan dan kekurangan fungsi golang dan goroutine Perbandingan kelebihan dan kekurangan fungsi golang dan goroutine Apr 25, 2024 pm 12:30 PM

Fungsi digunakan untuk melaksanakan tugas secara berurutan dan mudah dan mudah digunakan, tetapi mereka mempunyai masalah dengan penyekatan dan kekangan sumber. Goroutine ialah utas ringan yang melaksanakan tugas secara serentak. Ia mempunyai keupayaan serentak, berskala dan pemprosesan acara yang tinggi, tetapi ia adalah rumit untuk digunakan, mahal dan sukar untuk dinyahpepijat. Dalam pertempuran sebenar, Goroutine biasanya mempunyai prestasi yang lebih baik daripada fungsi apabila melakukan tugas serentak.

Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Bagaimanakah fungsi PHP berkelakuan dalam persekitaran berbilang benang? Apr 16, 2024 am 10:48 AM

Dalam persekitaran berbilang benang, gelagat fungsi PHP bergantung pada jenisnya: Fungsi biasa: thread-safe, boleh dilaksanakan secara serentak. Fungsi yang mengubah suai pembolehubah global: tidak selamat, perlu menggunakan mekanisme penyegerakan. Fungsi operasi fail: tidak selamat, perlu menggunakan mekanisme penyegerakan untuk menyelaraskan akses. Fungsi operasi pangkalan data: Mekanisme sistem pangkalan data yang tidak selamat perlu digunakan untuk mengelakkan konflik.

Pengaturcaraan Serentak C++: Bagaimana untuk mengendalikan komunikasi antara benang? Pengaturcaraan Serentak C++: Bagaimana untuk mengendalikan komunikasi antara benang? May 04, 2024 pm 12:45 PM

Kaedah untuk komunikasi antara benang dalam C++ termasuk: memori dikongsi, mekanisme penyegerakan (kunci mutex, pembolehubah keadaan), paip dan baris gilir mesej. Contohnya, gunakan kunci mutex untuk melindungi pembilang yang dikongsi: mengisytiharkan kunci mutex (m) dan pembolehubah yang dikongsi (pembilang); untuk mengelakkan keadaan perlumbaan.

Apakah rangka kerja dan perpustakaan pengaturcaraan serentak dalam C++? Apakah kelebihan dan batasan masing-masing? Apakah rangka kerja dan perpustakaan pengaturcaraan serentak dalam C++? Apakah kelebihan dan batasan masing-masing? May 07, 2024 pm 02:06 PM

Rangka kerja pengaturcaraan serentak C++ menampilkan pilihan berikut: utas ringan (std::benang-benang Boost concurrency concurrency dan algoritma OpenMP untuk pemproses berbilang pemproses berprestasi tinggi (TBB); (cpp-Setuju).

Bagaimana untuk menggunakan volatile dalam java Bagaimana untuk menggunakan volatile dalam java May 01, 2024 pm 06:42 PM

Kata kunci yang tidak menentu digunakan untuk mengubah suai pembolehubah untuk memastikan semua utas dapat melihat nilai terkini pembolehubah dan untuk memastikan bahawa pengubahsuaian pembolehubah adalah operasi yang tidak terganggu. Senario aplikasi utama termasuk pembolehubah kongsi berbilang benang, halangan memori dan pengaturcaraan serentak. Walau bagaimanapun, perlu diingatkan bahawa tidak menentu tidak menjamin keselamatan benang dan boleh mengurangkan prestasi Ia hanya boleh digunakan apabila benar-benar perlu.

Apakah kaedah biasa untuk pengoptimuman prestasi program? Apakah kaedah biasa untuk pengoptimuman prestasi program? May 09, 2024 am 09:57 AM

Kaedah pengoptimuman prestasi program termasuk: Pengoptimuman algoritma: Pilih algoritma dengan kerumitan masa yang lebih rendah dan mengurangkan gelung dan pernyataan bersyarat. Pemilihan struktur data: Pilih struktur data yang sesuai berdasarkan corak akses data, seperti pepohon carian dan jadual cincang. Pengoptimuman memori: elakkan mencipta objek yang tidak diperlukan, lepaskan memori yang tidak lagi digunakan dan gunakan teknologi kumpulan memori. Pengoptimuman benang: mengenal pasti tugas yang boleh diselaraskan dan mengoptimumkan mekanisme penyegerakan benang. Pengoptimuman pangkalan data: Cipta indeks untuk mempercepatkan pengambilan data, mengoptimumkan pernyataan pertanyaan dan menggunakan pangkalan data cache atau NoSQL untuk meningkatkan prestasi.

Mekanisme penguncian dan penyegerakan fungsi C++ dalam pengaturcaraan serentak? Mekanisme penguncian dan penyegerakan fungsi C++ dalam pengaturcaraan serentak? Apr 27, 2024 am 11:21 AM

Kunci fungsi dan mekanisme penyegerakan dalam pengaturcaraan serentak C++ digunakan untuk mengurus akses serentak kepada data dalam persekitaran berbilang benang dan menghalang persaingan data. Mekanisme utama termasuk: Mutex (Mutex): primitif penyegerakan peringkat rendah yang memastikan bahawa hanya satu utas mengakses bahagian kritikal pada satu masa. Pembolehubah keadaan (ConditionVariable): membenarkan benang menunggu syarat dipenuhi dan menyediakan komunikasi antara benang. Operasi atom: Operasi arahan tunggal, memastikan kemas kini satu-benang pembolehubah atau data untuk mengelakkan konflik.

See all articles