理解并解决Java中的线程同步问题示例
在Java中,线程同步主要是通过synchronized关键字或者Lock接口来实现的。以下是一个典型的线程同步问题示例:
问题描述:
有一个生产者(Producer)和多个消费者(Consumer),生产者负责生成商品,消费者负责从生产者那里获取商品并消费。
然而,当多个消费者同时尝试获取商品时,可能会导致数据不一致或者系统崩溃的问题。
解决方案:
synchronized关键字:
使用synchronized(this)
来锁定当前对象,这样同一时间只有一个线程可以访问对象的代码。class Product {
// ... 商品的属性和方法 ...
synchronized void generateProduct() {
// ... 生成商品的逻辑 ...
}
}
Lock接口:
Java 14引入了Lockable
接口和ReentrantLock
类,提供了更细粒度的锁管理。class Product {
// ... 商品的属性和方法 ...
Lock lock = new ReentrantLock();
void generateProduct() {
lock.lock(); // 请求锁
try {
// ... 生成商品的逻辑 ...
} finally {
lock.unlock(); // 释放锁
}
}
}
这样,生产者和消费者就可以在互不影响的情况下,安全地获取和使用共享资源了。
还没有评论,来说两句吧...