Rumah  >  Artikel  >  Java  >  Apakah strategi pelaksanaan yang berbeza untuk keselamatan benang fungsi Java?

Apakah strategi pelaksanaan yang berbeza untuk keselamatan benang fungsi Java?

王林
王林asal
2024-05-03 21:33:02961semak imbas

Strategi pelaksanaan untuk keselamatan benang fungsi Java termasuk: 1. Kaedah disegerakkan, membenarkan hanya satu utas untuk dilaksanakan 2. Menggunakan blok kod disegerakkan untuk mengisytiharkan objek kunci sebagai bahagian kritikal, dan hanya utas yang memperoleh objek kunci boleh melaksanakan; kod; 3. Menggunakan koleksi selamat-benang dan struktur data yang disediakan oleh perpustakaan konkurensi Java 4. Buat objek tidak boleh diubah yang sememangnya selamat untuk benang. Strategi ini memastikan ketekalan data dan ketepatan program dalam persekitaran berbilang benang.

Java 函数线程安全性的不同实现策略有哪些?

Strategi pelaksanaan yang berbeza untuk memastikan keselamatan benang bagi fungsi Java

Dalam persekitaran berbilang benang, keselamatan benang adalah penting untuk mengelakkan perlumbaan data dan ralat program. Untuk keselamatan benang fungsi Java, terdapat strategi pelaksanaan yang berbeza seperti berikut:

1 Kaedah disegerakkan

Kaedah disegerakkan hanya membenarkan satu utas untuk dilaksanakan pada masa yang sama, dengan itu mencapai keselamatan benang.

public class SafeCounter {
    private int count = 0;

    public synchronized int increment() {
        return ++count;
    }
}

2. Gunakan blok kod disegerakkan

segerak (lockObject) { ... } pernyataan untuk mengisytiharkan objek kunci sebagai bahagian kritikal. Dalam bahagian kritikal, hanya benang yang memperoleh objek kunci boleh melaksanakan kod.

public class SafeCounter {
    private int count = 0;
    private final Object lock = new Object();

    public void increment() {
        synchronized (lock) {
            count++;
        }
    }
}

3. Gunakan Java Concurrency Library

java.util.concurrent pakej menyediakan koleksi dan struktur data selamat benang seperti ConcurrentHashMap dan AtomicInteger.

import java.util.concurrent.ConcurrentHashMap;

public class SafeCounter {
    private ConcurrentHashMap<String, Integer> counts = new ConcurrentHashMap<>();

    public int increment(String key) {
        return counts.computeIfAbsent(key, k -> 0) + 1;
    }
}

4. Objek Kekal

Objek tidak berubah tidak boleh diubah suai selepas penciptaan, jadi ia sememangnya selamat untuk benang.

public final class ImmutableCounter {
    private final int count;

    public ImmutableCounter(int count) {
        this.count = count;
    }

    public int getCount() {
        return count;
    }
}

Kes praktikal

Katakan kita mempunyai aplikasi berbilang benang di mana berbilang benang perlu mengemas kini kaunter kongsi. Dengan menggunakan strategi keselamatan benang ini, kami boleh membuat pelaksanaan kaunter selamat benang:

public class Main {
    public static void main(String[] args) {
        // 使用不同策略创建线程安全的计数器
        SafeCounter counter1 = new SafeCounter();
        SafeCounter counter2 = new SafeCounter();
        SafeCounter counter3 = new SafeCounter();

        // 创建多个线程并发地更新计数器
        Thread[] threads = new Thread[10];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter1.increment();
                    counter2.increment();
                    counter3.increment();
                }
            });
        }

        // 启动线程并等待它们完成
        for (Thread thread : threads) {
            thread.start();
        }

        // 线程安全策略确保所有线程完成时,计数器包含正确的计数
        System.out.println("Counter1: " + counter1.increment());
        System.out.println("Counter2: " + counter2.increment());
        System.out.println("Counter3: " + counter3.increment());
    }
}

Atas ialah kandungan terperinci Apakah strategi pelaksanaan yang berbeza untuk keselamatan benang 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