公平锁
相信很多人都知道在java中存在锁这个东西,他就是为了防止有些数据被多个线程同时访问而导致的一种进制。
需求:要求两个线程间隔着访问同一个数据,或者执行某一段代码
技术点:安全锁
/**
* 参数true表示公平锁,这个ReentrantLock是重入锁,安全锁是冲入锁的一种特例,在构造函数中设置true即表明为安全锁
*/
public static ReentrantLock lock = new ReentrantLock(true);
public static class MyRunable implements Runnable{
@Override
public void run() {
while (true){
try{
lock.lock();
System.out.println(Thread.currentThread().getName()+"----获得锁");
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
public static void main(String[] args) {
MyRunable run = new MyRunable();
Thread t1 = new Thread(run);
Thread t2 = new Thread(run);
t1.start();
t2.start();
}
打印结果
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-1----获得锁
Thread-0----获得锁
从上面的打印结果来看,两个线程在执行的时候呈现交替执行的情况,当这个线程执行完成后下一个线程抢占资源,很公平
那么肯定有人问,这个是两个线程出现的情况,多个线程是不是也是公平的呢。答案是当然的,四个线程的时候出现以下结果
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁
Thread-0----获得锁
Thread-3----获得锁
Thread-2----获得锁
Thread-1----获得锁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)