Java设计模式五 - 并发设计模式

当谈到并发设计模式时,我们通常是指那些用于处理多线程应用程序中并发问题的设计模式。这些模式可以帮助我们更有效地管理线程间的协作、共享资源、避免竞态条件等。现在让我们逐个并发设计模式进行详解并提供相应的示例代码。

1. 单例模式的并发实现

1.1 详解

单例模式确保一个类只有一个实例,并提供全局访问点。在多线程环境下,需要考虑线程安全问题,保证在多线程情况下仍然只创建一个实例。

1.2 示例代码(Java)
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // Private constructor to prevent instantiation.
    }

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

2. 生产者-消费者模式

2.1 详解

生产者-消费者模式是一种多线程设计模式,其中有生产者将数据放入共享的缓冲区,而消费者则从缓冲区中取出数据。这种模式用于解决生产者和消费者之间的同步和通信问题。

2.2 示例代码(Java)
import java.util.LinkedList;

class Buffer {
    private LinkedList<Integer> buffer = new LinkedList<>();
    private int maxSize;

    public Buffer(int maxSize) {
        this.maxSize = maxSize;
    }

    public synchronized void produce(int item) throws InterruptedException {
        while (buffer.size() == maxSize) {
            wait();
        }
        buffer.add(item);
        System.out.println("Produced: " + item);
        notifyAll();
    }

    public synchronized int consume() throws InterruptedException {
        while (buffer.isEmpty()) {
            wait();
        }
        int item = buffer.removeFirst();
        System.out.println("Consumed: " + item);
        notifyAll();
        return item;
    }
}

class Producer implements Runnable {
    private Buffer buffer;

    public Producer(Buffer buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                buffer.produce(i);
                Thread.sleep(100); // Simulate some work
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

class Consumer implements Runnable {
    private Buffer buffer;

    public Consumer(Buffer buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; i < 10; i++) {
                buffer.consume();
                Thread.sleep(200); // Simulate some work
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

3. 读写锁模式

3.1 详解

读写锁模式是一种锁设计模式,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这种模式在某些场景下可以提高程序的并发性能。

3.2 示例代码(Java)
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

class SharedData {
    private int data;
    private ReadWriteLock lock = new ReentrantReadWriteLock();

    public int readData() {
        lock.readLock().lock();
        try {
            return data;
        } finally {
            lock.readLock().unlock();
        }
    }

    public void writeData(int value) {
        lock.writeLock().lock();
        try {
            data = value;
        } finally {
            lock.writeLock().unlock();
        }
    }
}

4. 线程池模式

4.1 详解

线程池模式通过维护一定数量的线程来处理任务,避免了线程的频繁创建和销毁,提高了程序的性能和效率。

4.2 示例代码(Java)
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        for (int i = 0; i < 10; i++) {
            Runnable worker = new WorkerThread("Task " + i);
            executor.execute(worker);
        }

        executor.shutdown();
    }
}

class WorkerThread implements Runnable {
    private String task;

    public WorkerThread(String task) {
        this.task = task;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " processing " + task);
    }
}

5. 多线程协作模式

5.1 详解

多线程协作模式指的是多个线程之间相互协作,共同完成某个任务。这可能涉及线程的等待、通知、同步等机制。

5.2 示例代码(Java)
import java.util.concurrent.CyclicBarrier;

public class MultiThreadCollaborationExample {
    public static void main(String[] args) {
        CyclicBarrier barrier = new CyclicBarrier(3);

        Runnable task = () -> {
            try {
                System.out.println("Thread " + Thread.currentThread().getName() + " is waiting");
                barrier.await();
                System.out.println("Thread " + Thread.currentThread().getName() + " is released");
            } catch (Exception e) {
                e.printStackTrace();
            }
        };

        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);
        Thread thread3 = new Thread(task);

        thread1.start();
        thread2.start();
        thread3.start();
    }
}

以上是并发设计模式的详解和示例代码。每种模式都有其特定的用途和适用场景,根据具体的开发需求选择合适的模式来提高代码质量和效率。

版权声明: 闲者 发表于 2024-08-08
转载请注明: Java设计模式五 - 并发设计模式 | Java设计模式五 - 并发设计模式 - 无界文档,Java设计模式五 - 并发设计模式

评论区

暂无评论...