一、Lock锁
虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock
Lock实现提供比使用synchronized方法和语句更广泛的锁定操作
二、Lock中提供了获得锁和释放锁的方法
1.void lock():获得锁
2.void unlock();释放锁
Lock由于是接口,不能直接实例化,这里采用它的实现类ReentrantLock来实例化
三、ReentrantLock的构造方法
ReentrantLock():创建一个ReentrantLock的实例
例如:之前的卖票案例就可以这样写
public class SellTicket implements Runnable {
//定义总张数
private int tickets = 100;
//定义Lock锁,要用它的实现类完成
Lock lock=new ReentrantLock();
@Override
public void run() {
while (true) {
//判断车票是否大于0
//加锁
lock.lock();
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第" + tickets + "张车票");
tickets--;
//模仿出票
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//释放锁
lock.unlock();
}
}
}
为了避免出现有时候出现异常不能及时释放锁的情况,我们用try...finally来操作一下
package Demo041901;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import static java.lang.Thread.sleep;
public class SellTicket implements Runnable {
//定义总张数
private int tickets = 100;
//定义Lock锁,要用它的实现类完成
Lock lock=new ReentrantLock();
@Override
public void run() {
while (true) {
//判断车票是否大于0
try {
//加锁
lock.lock();
if (tickets > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第" + tickets + "张车票");
tickets--;
//模仿出票
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
break;
}
}finally {
//释放锁
lock.unlock();
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具