Rumah  >  Artikel  >  Java  >  Bagaimana untuk mencapai keselamatan benang dalam kaedah disegerakkan fungsi Java?

Bagaimana untuk mencapai keselamatan benang dalam kaedah disegerakkan fungsi Java?

王林
王林asal
2024-05-02 14:00:02496semak imbas

Fungsi Java selamat untuk benang melalui kaedah penyegerakan. Kaedah disegerakkan menggunakan kata kunci disegerakkan Apabila utas memanggil kaedah disegerakkan, ia mesti memperoleh kunci objek yang dimiliki kaedah itu terlebih dahulu sebelum melaksanakan badan kaedah. Utas lain yang cuba memanggil kaedah yang sama akan disekat sehingga utas pertama melepaskan kunci.

Java 函数的同步方法如何实现线程安全?

Bagaimana kaedah penyegerakan fungsi Java mencapai keselamatan benang

Dalam persekitaran berbilang benang, untuk memastikan ketekalan dan integriti data, sumber yang dikongsi perlu disegerakkan. Tujuan penyegerakan adalah untuk memastikan bahawa hanya satu utas boleh mengakses sumber yang dikongsi pada masa yang sama. Java menyediakan kaedah penyegerakan untuk melaksanakan ciri ini.

Kaedah disegerakkan

Kaedah dalam Java boleh diisytiharkan sebagai kaedah disegerakkan menggunakan kata kunci synchronized. Apabila kaedah yang disegerakkan dipanggil, benang mesti memperoleh kunci objek yang dimiliki oleh kaedah tersebut sebelum ia boleh melaksanakan badan kaedah. Jika utas lain cuba memanggil kaedah disegerakkan yang sama, ia akan disekat sehingga utas pertama melepaskan kunci. synchronized 关键字来声明为同步方法。当一个同步方法被调用时,线程必须先获取该方法所属对象的锁,才能执行方法体。如果另一个线程试图调用同一个同步方法,它将被阻塞,直到第一个线程释放锁。

示例

下面是一个示例,演示如何使用同步方法来保护共享资源:

public class Counter {
    private int count = 0;

    // 同步方法
    public synchronized void increment() {
        count++;
    }
}

increment() 方法被声明为同步方法,这意味着在同一时刻只能有一个线程执行此方法。

实战案例

下面的代码展示了一个实战案例,其中使用了同步方法来保护共享资源:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ConcurrentCounterDemo {

    public static void main(String[] args) throws InterruptedException {
        // 创建一个共享资源
        Counter counter = new Counter();

        // 创建一个线程池
        ExecutorService executor = Executors.newFixedThreadPool(10);

        // 提交任务到线程池
        for (int i = 0; i < 1000; i++) {
            executor.submit(() -> counter.increment());
        }

        // 等待所有任务完成
        executor.shutdown();
        executor.awaitTermination(1, TimeUnit.MINUTES);

        // 打印计数
        System.out.println("最终计数:" + counter.count);
    }
}

在这个示例中,increment() 方法被用于并发地对共享的 count 变量进行递增操作。如果没有使用同步方法,不同的线程可能会同时修改 count 变量,导致最终计数不正确。通过使用同步方法,我们可以确保同一时刻只有一个线程能够访问 count

🎜Contoh🎜🎜🎜Berikut ialah contoh yang menunjukkan cara menggunakan kaedah yang disegerakkan untuk melindungi sumber yang dikongsi: 🎜rrreee🎜 Kaedah increment() diisytiharkan sebagai kaedah yang disegerakkan, yang bermaksud bahawa pada masa yang sama sahaja Terdapat satu utas yang melaksanakan kaedah ini. 🎜🎜🎜Kes praktikal🎜🎜🎜Kod berikut menunjukkan kes praktikal di mana kaedah penyegerakan digunakan untuk melindungi sumber yang dikongsi: 🎜rrreee🎜Dalam contoh ini, kaedah increment() digunakan untuk Concurrency Increment pembolehubah count kongsi secara setempat. Jika penyegerakan tidak digunakan, urutan yang berbeza boleh mengubah suai pembolehubah count pada masa yang sama, menyebabkan kiraan akhir tidak betul. Dengan menggunakan kaedah penyegerakan, kami boleh memastikan bahawa hanya satu urutan boleh mengakses pembolehubah count pada masa yang sama, dengan itu memastikan ketekalan dan integriti data. 🎜

Atas ialah kandungan terperinci Bagaimana untuk mencapai keselamatan benang dalam kaedah disegerakkan fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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