网站首页 > 文章精选 正文
Locks
在Java中,除了使用synchronized关键字外,我们还可以使用
java.util.concurrent.locks包中的Lock接口和其实现类(如ReentrantLock)来创建锁。使用Lock可以提供比synchronized更高的灵活性。
实例代码:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final Lock lock = new ReentrantLock();
public void performTask() {
lock.lock();
try {
// critical section
System.out.println("Task performed");
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
LockExample example = new LockExample();
example.performTask();
}
}
讲解:
在上面的代码中,我们使用ReentrantLock来替代synchronized块。当进入临界区时,我们调用lock()方法来获得锁,完成后使用unlock()方法释放锁。使用Lock的好处是它提供了更细粒度的控制,如尝试获取锁、定时锁等。
Condition
与传统的Object的wait()和notify()/notifyAll()方法相比,Condition接口提供了更丰富的线程同步操作。
实例代码:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionExample {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void awaitCondition() throws InterruptedException {
lock.lock();
try {
System.out.println("Waiting for the condition...");
condition.await();
System.out.println("Condition met!");
} finally {
lock.unlock();
}
}
public void signalCondition() {
lock.lock();
try {
System.out.println("Signaling condition...");
condition.signal();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
ConditionExample example = new ConditionExample();
Thread thread1 = new Thread(() -> {
try {
example.awaitCondition();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread thread2 = new Thread(example::signalCondition);
thread1.start();
Thread.sleep(1000); // Just to ensure thread1 starts before thread2
thread2.start();
}
}
讲解:
在上面的代码中,我们使用Condition来同步两个线程。线程1等待条件满足,而线程2发出条件已满足的信号。这与使用wait()和notify()类似,但Condition提供了更多的灵活性。
ReadWriteLock
ReadWriteLock是一个接口,它包含了两个锁,一个用于读操作,另一个用于写操作。这允许多个线程同时读,但只允许一个线程写。
实例代码:
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockExample {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private int data = 0;
public int readData() {
rwLock.readLock().lock();
try {
System.out.println("Read data: " + data);
return data;
} finally {
rwLock.readLock().unlock();
}
}
public void writeData(int value) {
rwLock.writeLock().lock();
try {
System.out.println("Write data: " + value);
data = value;
} finally {
rwLock.writeLock().unlock();
}
}
public static void main(String[] args) {
ReadWriteLockExample example = new ReadWriteLockExample();
Thread writer = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.writeData(i);
}
});
Thread reader = new Thread(() -> {
for (int i = 0; i < 5; i++) {
example.readData();
}
});
writer.start();
reader.start();
}
}
讲解:
在上述代码中,我们使用ReentrantReadWriteLock来实现ReadWriteLock。当我们只读取数据时,可以有多个读线程同时进行,但当我们写数据时,只有一个线程可以写,同时不允许其他线程读。
猜你喜欢
- 2025-07-10 Java基础——Java多线程(Lock接口详解)
- 2025-07-10 高并发环境下诡异的加锁问题(你加的锁未必安全)
- 2025-07-10 你真正了解synchronized关键字吗?
- 2025-07-10 Java 并发之 ReentrantReadWriteLock 深入分析
- 2025-07-10 ReentrantLock源码解析:ReentrantLock 的实现原理与 AQS 机制
- 2025-07-10 「Java多线程」内置锁(Synchronized)的前世今生
- 2025-07-10 面试:如何保证接口的幂等性?常见的实现方案有哪些?
- 2025-07-10 聊聊并发编程: Lock(并发编程的三大特性)
- 2025-07-10 对volatile,synchronized,AQS的加锁解锁原理的一些理解
- 2025-07-10 深入剖析 Java 中 Synchronized 锁的原理
- 最近发表
-
- Vue3+Django4全新技术实战全栈项目|高清完结
- 工厂模式+策略模式消除 if else 实战
- 每天一个 Python 库:httpx异步请求,让接口测试飞起来
- 如何高效实现API接口的自动化测试?
- 前端工程化:从“手忙脚乱”到“从容协作”的进化记
- 使用C#创建服务端Web API(c#开发web服务器)
- SpringBoot之旅第四篇-web开发(springboot做web项目)
- 一文读懂SpringMVC(一文读懂新型政策性金融工具)
- Rust Web编程:第十二章 在 Rocket 中重新创建我们的应用程序
- Apache Druid 数据摄取——本地数据和kafka流式数据 一篇文章看懂
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)