解决Java并发控制不当的示例
在Java中,如果并发控制不当,可能会导致数据不一致、死锁等问题。以下是一个简单的示例,展示了如何通过不当的并发控制导致问题:
// 创建两个共享资源的线程
class ResourceThread extends Thread {
private int resource;
ResourceThread(String name, int resource) {
super(name);
this.resource = resource;
}
public synchronized void consumeResource() {
if (resource > 0) {
resource--;
notifyAll(); // 唤醒等待的线程
}
}
}
// 创建两个资源消耗线程
ResourceThread thread1 = new ResourceThread("Thread1", 10);
ResourceThread thread2 = new ResourceThread("Thread2", 5);
// 启动线程
thread1.start();
thread2.start();
// 在这里等待,直到资源都被消耗完
while (thread1.isAlive() || thread2.isAlive()) {
try {
// 线程会在这里睡眠,直到被唤醒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
在这个示例中,两个线程同时尝试消费资源。由于使用了synchronized
关键字来保护共享资源的访问,所以只有一个线程能成功消耗资源。
然而,在不恰当的情况下,如线程数量超过资源的数量,或者使用非公平锁(例如ReentrantLock
的默认行为)时,可能会导致死锁或者其他并发问题。
还没有评论,来说两句吧...