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