• 可重入锁介绍、使用


    1、什么是可重入锁?

    可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后 ,内层递归函数仍然可以获取该锁的代码,但不受影响。

    可重入锁使用示例

    public class SynchronizedSample implements Runnable {
        public synchronized void funA() { // 执行funA方法,需要获取对象锁
            // synchronized属于可重入锁,进入funA方法后,拥有了对象锁,所以执行方法funB方法时不受影响。
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
            funB();
        }
        public synchronized void funB() { // 执行funB方法,需要获取对象锁
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
        }
        @Override
        public void run() {
            funA();
        }
        public static void main(String[] args) {
            SynchronizedSample ss = new SynchronizedSample();
            new Thread(ss).start();
            new Thread(ss).start();
            new Thread(ss).start();
        }
    }
    
    public class ReentrantLockSample implements Runnable {
        ReentrantLock lock = new ReentrantLock();
        public void funA() { // 执行funA方法,需要获取对象锁
            lock.lock(); // 第一次获取锁
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
            funB(); // 该方法会第二次获取锁
            lock.unlock();
        }
        public void funB() { // 执行funB方法,需要获取对象锁
            lock.lock();
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
            lock.unlock();
        }
        @Override
        public void run() {
            funA();
        }
        public static void main(String[] args) {
            ReentrantLockSample rs = new ReentrantLockSample();
            new Thread(rs).start();
            new Thread(rs).start();
            new Thread(rs).start();
        }
    }
    

    程序输出结果

    Thread-1 14
    Thread-1 14
    Thread-2 15
    Thread-2 15
    Thread-0 13
    Thread-0 13
    

    2、可重入锁作用及使用场景?

    1. 可重入锁最大作用是避免死锁。
    2. 当一个线程执行一个带锁的代码块或方法,同时代码块或方法里也获取同一个锁。为了避免死锁,此时就可以用可重入锁。

    3、在内置锁sychronized和ReentrantLock类之间进行选择

    相同点

    1. 两种方式在加锁和内存上提供的语义相同。

    不同点

    1. ReentrantLock提供了其他的功能,包括定时的锁等待、可中断的锁等待、公平与非公平锁。而sychronized没有这些功能。
    2. ReentrantLock的性能比sychronized要高一些。
    3. sychronized锁使用方式简单,代码表达直接紧凑,使用范围广,被许多开发人员所熟悉。
    4. sychronized在线程转储中能给出在哪些调用帧中获得了哪些锁,并能够检测和识别发生死锁的线程。而java6之后ReentrantLock提供了管理和调试的接口弥补了这一点。
    5. 未来的情况下,可能会提升sychronized而不是ReentrantLock的性能。因为sychronized是JVM的内置属性,优化可能性很大。

    使用建议

    在一些内置锁sychronized无法满足需求的情况下,ReentrantLock可作为高级工具使用。否则,应该优先考虑使用sychronized。

    /**
     * 欢迎评论、留言、发表看法。谢谢!
     */
    
  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/mengHeJiuQIan/p/11158012.html
Copyright © 2020-2023  润新知