深入理解:Java线程安全问题实例
Java线程安全问题主要发生在多线程环境下,如果对共享资源的访问没有正确同步,就可能会引发竞态条件、死锁等问题。下面通过一个实例来深入理解:
实例:生产者-消费者模型
// 1. 生产者
public class Producer {
private final Object lock = new Object();
private int count;
public void produce() {
while (count < 5) { // 生产5个产品
synchronized (lock) {
if (count == 0) {
lock.notifyAll(); // 先通知消费者线程,避免死锁
}
count++;
lock.notify(); // 线程唤醒后继续执行
}
}
}
}
// 2. 消费者
public class Consumer {
private final Object lock = new Object();
private int count;
public void consume() {
while (true) { // 永远循环消费
synchronized (lock) {
if (count == 5) {
lock.notifyAll(); // 生产者已经生产完,通知消费者线程结束循环
}
count++;
lock.notify(); // 线程唤醒后继续执行
}
}
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
Producer producer = new Producer();
Consumer consumer = new Consumer();
new Thread(producer).start(); // 生产者线程
new Thread(consumer).start(); // 消费者线程
try {
Thread.sleep(5000); // 线程睡眠等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在这个例子中,生产者负责产生产品(count++
),而消费者负责消费产品(count--
)。如果没有正确同步锁(lock
),就可能导致生产者先于消费者完成5个产品的生产,这时消费者线程将无法接收到通知,从而引发问题。
还没有评论,来说两句吧...