并发编程题目的编写需要考虑以下几个方面:
明确需求
确定题目的具体要求,例如需要实现的功能、输入输出、性能要求等。
明确并发编程的核心概念,如线程安全、同步、互斥、阻塞队列、线程池等。
设计算法
设计合理的算法和数据结构来支持并发操作。
考虑并发控制机制,如锁、信号量、条件变量等。
编写代码
选择合适的编程语言和并发库。
实现题目要求的功能,确保代码的正确性和性能。
编写测试用例,验证并发编程的正确性。
1. 线程安全的计数器类
要求:支持并发访问,实现计数器的增加和获取当前值的操作,增加操作不阻塞获取操作,提供可靠的原子操作。
```java
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadSafeCounter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
```
2. 生产者-消费者模型
要求:有一个商品容器类,支持生产者放入商品和消费者取出商品,生产者和消费者在不同线程中运行,容器满时生产者等待,容器空时消费者等待。
```java
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProducerConsumer {
private final Queue private final Lock lock = new ReentrantLock(); private final int capacity; public ProducerConsumer(int capacity) { this.capacity = capacity; } public void produce(int item) throws InterruptedException { lock.lock(); try { while (queue.size() == capacity) { lock.wait(); } queue.add(item); lock.notifyAll(); } finally { lock.unlock(); } } public int consume() throws InterruptedException { lock.lock(); try { while (queue.isEmpty()) { lock.wait(); } int item = queue.poll(); lock.notifyAll(); return item; } finally { lock.unlock(); } } } ``` 3. 线程安全的阻塞队列类 要求:支持并发访问,提供入队和出队操作,队列为空时出队操作阻塞,队列满时入队操作阻塞。 ```java import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class ThreadSafeBlockingQueue private final BlockingQueue public ThreadSafeBlockingQueue(int capacity) { this.queue = new ArrayBlockingQueue<>(capacity); } public void enqueue(T item) throws InterruptedException { queue.put(item); } public T dequeue() throws InterruptedException { return queue.take(); } } ``` 4. 线程安全的缓存类 要求:支持并发访问,提供存储键值对的操作,获取键对应值的操作,如果值不存在则计算并存入缓存。 ```java import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ThreadSafeCache private final ConcurrentHashMap private final Lock lock = new ReentrantLock(); public V get(K key) { return cache.computeIfAbsent(key, k -> computeValue(k)); } private V computeValue(K key) { lock.lock(); try { // 计算值 return null; } finally { lock.unlock(); } } } ``` 5. 线程池 要求:支持自动调整线程数量,实现任务队列,支持任务提交和执行