公平锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jeekmary/article/details/81583643

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

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

猜你喜欢

转载自blog.csdn.net/jeekmary/article/details/81583643