zoukankan      html  css  js  c++  java
  • ReentrantLock锁简析

    ReentrantLock使用

    ReentrantLock是可以替代synchronized的,但是ReentrantLock需要手动加锁(lock.lock())和解锁(lock.unlock()),手动解锁一定要写在try...finally里边保证最好一定要解锁,不然上锁后中间执行的过程就有问题了,一旦死了,别人就永远也拿不到这把锁了。

    public class MyReentrantLock {
        /**初始化锁 */
        Lock lock =  new ReentrantLock();
        public void m1(){
            try {
                lock.lock(); //synchronized(this)
                for (int i = 0; i < 10; i++) {
                    TimeUnit.SECONDS.sleep(i);
                    System.out.println(i);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    
        public static void main(String[] args) {
            MyReentrantLock myReentrantLock = new MyReentrantLock();
            new Thread(myReentrantLock::m1).start();
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    ReentranLock使用优势

    1.ReentrantLock可以使用tryLock进行尝试锁定,不管锁定与否,方法都将继续执行,synchronized如果搞不定就阻塞了,但是ReentrantLock可以自己决定要不要wait

    2.ReentrantLock可以用lock.lockInterruptibly()这个类,对interrupt()方法做出响应,可以被打断的加锁

    3.Reentrantlock还可以指定为公平锁,公平锁的意思是当我们new一个ReentrantLock,可以传一个参数为true,这个true表示公平锁,公平锁的意思是谁在前面就先让谁执行,而不是说谁后来了之后就马上执行,ReentrantLock默认是非公平锁。

    当你发现自己的才华撑不起野心时,就请安静下来学习吧
  • 相关阅读:
    MySQL 中 where id in (1,2,3,4,...) 的效率问题讨论
    创建,增加,删除mysql表分区
    mysql分区及实例演示
    MySQL的表分区详解
    MySQL 存储过程传参之in, out, inout 参数用法
    MySQL里面的子查询实例
    超详细mysql left join,right join,inner join用法分析
    MySQL force Index 强制索引概述
    MyISAM和InnoDB的索引在实现上的不同
    java中的守护线程
  • 原文地址:https://www.cnblogs.com/smallVampire/p/12831017.html
Copyright © 2011-2022 走看看