并发编程题目通常涉及多线程的同步、互斥、通信等问题。下面是一个简单的并发编程题目的示例,以及如何使用Java语言解决它。
题目描述
实现一个线程安全的计数器类,该计数器需要支持并发访问。计数器需要提供以下操作:
`increment()`: 增加计数器的值
`getCount()`: 获取计数器的当前值
要求:
`increment()` 操作不应该阻塞 `getCount()` 操作。
提供可靠的原子操作。
示例代码
```java
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadSafeCounter {
private AtomicInteger counter = new AtomicInteger(0);
public void increment() {
counter.incrementAndGet();
}
public int getCount() {
return counter.get();
}
public static void main(String[] args) throws InterruptedException {
ThreadSafeCounter counter = new ThreadSafeCounter();
// 创建两个线程,一个用于增加计数器,一个用于获取计数器的值
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
System.out.println("Current count: " + counter.getCount());
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("Final count: " + counter.getCount());
}
}
```
解释
AtomicInteger : `AtomicInteger` 是 Java 提供的原子整数类,它提供了原子操作,确保在多线程环境下对整数的增加操作是线程安全的。
increment():
使用 `incrementAndGet()` 方法来增加计数器的值,这个方法内部是原子的。
getCount():
使用 `get()` 方法来获取计数器的当前值,这个方法也是原子的。
main() 方法:
创建两个线程,一个用于增加计数器,一个用于获取计数器的值。通过 `join()` 方法确保主线程等待两个子线程执行完毕后再继续执行。
建议
在编写并发程序时,了解并掌握 `java.util.concurrent` 包下的类和方法,如 `AtomicInteger`、`ReentrantLock`、`Semaphore` 等,这些工具类可以帮助你更高效地实现线程安全的代码。
在设计并发程序时,要特别注意线程安全和性能之间的平衡,避免过度使用锁和等待,以免影响程序的性能。