zoukankan      html  css  js  c++  java
  • synchronized 和ReentrantLock的区别

    历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了

    ReetrantLock (再入锁)

      1、位于java.util.concurrnt.locks 包    juc包

      2、和CountDownLatch、FutureTask、Semaphore一样基于AQS实现的

      3、能够实现比synchronized更细粒度的控制,如控制fairness(公平性)

      3、调用lock()之后,必须调用用unlock()释放锁

      4、性能未必比synchronized高,并且也是可重入

    ReetrantLock公平性的设置

      1、ReetrantLock fairLock = new ReetrantLock(true);

      2、参数为true时,倾向于将锁赋予等待时间最久的线程(减少线程饥饿的情况)

      3、公平锁:获取锁的顺序按先后调用lock方法的顺序(慎用)

      4、非公平锁:抢占的顺序不一定,看运气

      5、synchronized是非公平锁

    其实通用场景中,公平性未必有想象中的那么重要,java的默认调用策略,很少会导致饥饿的情况发生,同时保证公平性的话,会导致额外的开销,自然会导致吞吐量下降。

    public class ReentrantLockDemo implements  Runnable{
        private static ReentrantLock lock = new ReentrantLock(false);
        @Override
        public void run(){
            while (true){
                try{
                    lock.lock(); // 一般加上try finally去使用
                    System.out.println(Thread.currentThread().getName() + " get lock");
                    Thread.sleep(1000);
                } catch (Exception e){
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        }
    
        public static void main(String[] args) {
            ReentrantLockDemo rtld = new ReentrantLockDemo();
            Thread thread1 = new Thread(rtld);
            Thread thread2 = new Thread(rtld);
            thread1.start();
            thread2.start();
        }
    }
    

      

    ReetrantLock 将锁对象化 (下面的三种情况,可以自行去用代码去实现,也是synchronized无法做到的内存)

      1、判断是否有线程,或者某个特定线程,在排队等待获取锁

      2、带超时的获取锁的尝试

      3、感知有没成功获取锁

    是否能将wait notify notifyAll 对象化

      1、java.util.concurrent.locks.Condition

    总结:

      1、synchronized 是关键字,ReetrantLock是类

      2、ReentrantLock 可以对获取锁的等待时间进行设置,避免死锁

      3、ReentantLock可以获取各种锁的信息

      4、ReentrantLock可以灵活地实现多路通知

      5、机制:sync操作Mark Word , lcok调用Unsafe 类的park()方法

  • 相关阅读:
    C++中 结构体和类的异同
    c++sizeof大全
    10th week task -3 Arrow function restore
    10th week task -2 Object 的起源
    js 的起源故事
    10th week task -1
    9th week -the history of program 1950~2020
    javascript统计一个字符在一段字符串出现次数
    Grid layout
    BOM DOM区别 来源
  • 原文地址:https://www.cnblogs.com/vingLiu/p/10676128.html
Copyright © 2011-2022 走看看