公平锁

相信很多人都知道在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----获得锁

很明显,也是公平的抢占资源

posted @   飞航之梦  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示