首页 > 其他分享 >Synchronized和Lock的区别

Synchronized和Lock的区别

时间:2023-05-29 16:12:04浏览次数:34  
标签:释放 return Synchronized 区别 Lock 获取 线程

本文参考自:https://blog.51cto.com/u_15651175/5545001

什么是Lock接口

Lock接口是JDK1.5提供的一个锁接口,让程序员可以更灵活地实现锁或者可以使用JDK自带的实现Lock接口的一些锁。与Synchronized相比,Lock接口是显式获取、释放锁,交由程序员去控制什么时候获取和释放锁,除此之外还增加了很多特性,比如非阻塞性获取锁,非阻塞超时获取锁,可响应中断获取锁,自定义阻塞条件等。而Synchronized是重量级锁,获取和释放锁都是隐式的,是JVM来实现的;那是不是Lock接口就比Synchronized性能高很多呢,在JDK1.5之前确实是这样,但是在JDK1.5之后,对Synchronized进行了优化,有了锁升级的概念,偏向锁-自旋锁-重量级锁,具体的锁升级过程我就不详细展开了,有兴趣的话可以自行去了解下。我的理解是,Lock接口更灵活,能满足不同需求,解决不同情形下的问题。

JDK提供的Lock接口

    /**
     * 阻塞性地获取锁
     */
    @Override
    public void lock() {

    }

    /**
     * 能够相应中断地获取锁
     * @throws InterruptedException
     */
    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    /**
     * 非阻塞性地获取锁
     * @return
     */
    @Override
    public boolean tryLock() {
        return false;
    }

    /**
     * 非阻塞性地超时获取锁
     * @param time
     * @param unit
     * @return
     * @throws InterruptedException
     */
    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }

    /**
     * 释放锁
     */
    @Override
    public void unlock() {

    }

    /**
     * 定义阻塞条件
     * @return
     */
    @Override
    public Condition newCondition() {
        return null;
    }

1.lock(),获取锁,如果锁内其他线程获取则进行等待,需要和unlock方法配合主动释放锁。发生异常时,不会主动释放锁,所以释放锁的操作放在finally块中

2.lockInterruptibly()方法,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能响应中断,即中断线程的等待状态。也就是说,当两个线程同时通过ock.lockInterruptibly()想获取某个锁时,假如线程A获取到了锁,线程B等待,那么对线程B调用threadB.interrupt()方法能够中断线程B

的等待过程

3.tryLock方法,用来尝试获取锁,会立即返回,不管是否成功获取锁

4.tryLock(long time, TimeUnit unit)方法,非阻塞超时获取锁,如果获取到锁,则立即返回,否则继续获取锁,一旦超过指定时间还未成功,就会返回

5.Condition可以配合锁使用,类似于wait()/notify()/notifyAll()这种等待通知模型,等价于await()/signal()

总结

1.ReentrantLock支持非阻塞性地获取锁、可响应中断,而Synchronized不行

2.ReentrantLock显示获取和释放锁,而Synchronized是隐式获取和释放锁,是通过JVM实现的

3.ReentrantLock可以支持公平锁和非公平锁(非公平锁会马上去竞争锁,如果不成功则会返回到阻塞队列,而公平锁则是先去阻塞队列等待),而Synchronizred是非公平锁

4.Synchronized在发生异常的时候会自动释放锁,而ReentrantLock发生异常时,不会自动释放锁,所以一般要用try/finally包起来,在finally释放锁

5.Synchronized和ReentrantLock都是可重入锁

 

标签:释放,return,Synchronized,区别,Lock,获取,线程
From: https://www.cnblogs.com/mojianheng/p/17439638.html

相关文章

  • C++-条件变量/互斥锁/lock_guard
    条件变量参考C++Reference对于条件变量的解释和例程:https://en.cppreference.com/w/cpp/thread/condition_variable条件变量和互斥锁一般结合使用。因为线程处于等待状态中,一般需要查看一个全局变量或共享的变量的状态,来决定是否停止等待继续运行程序。对于此全局变量,必须要......
  • 交换机、集线器、路由器和网桥的区别
    交换机、集线器、路由器和网桥是计算机网络中常见的网络设备,它们在网络中发挥不同的作用并位于不同的层次。下面是它们的区别和各自所在的层次:1.集线器(Hub)区别:集线器是一种简单的网络设备,用于将多个计算机连接在一起形成一个局域网。它的主要功能是将接收到的数据包广播到所有......
  • SQL中join后的on和where的过滤条件的区别
     1、原理1.1连接基本概念(1)内连接(innerjoin、join):必须完全满足连接运算(natural、using、on)的左右表数据行。(2)左外连接(leftouterjoin、leftjoin):仅保留左表在连接运算之前的数据行,无匹配的右表列填充null。(3)右外连接(rightouterjoin、rightjoin):仅保留右表在连接运算之前......
  • DNN-HMM和GMM-HMM的简单区别
    GMM-HMM:给定MFCC特征X时,计算每一个状态产生x的概率p(x|a)、p(x|b)....,然后最大的概率就是其对应的状态DNN-HMM:给定MFCC特征X时,直接计算x属于每一个状态的概率p(s|x),最大值就是对应的状态。p(a)是训练集中每个状态出现的概率。 ......
  • Week1.图文并茂解释开源许可证GPL, BSD, MIT, Mozilla, Apache和LGPL的区别
    许可证由松到严排序:MITBSDApacheLGPLGPL图片源自乌克兰程序员PaulBagwell,由阮一峰汉化。MIT(MIT)来源于大学,MIT许可证是史上最为简洁和慷慨(permissive)的开源协议之一。作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你......
  • vue this.$route.query 和this.$route.params的使用与区别
    一:this.$route.query的使用#1、传参数:this.$router.push({path:'/index/detail',query:{itemId:item.id}});#2、获取参数this.$route.query.itemId#3、url的表现形式http://localhost:8080/#/index/detail?itemId=22二:this.$route.params的使......
  • java中fail-fast 和 fail-safe的区别
     在我们详细讨论这两种机制的区别之前,首先得先了解并发修改。1.什么是并发修改?当一个或多个线程正在遍历一个集合Collection,此时另一个线程修改了这个集合的内容(添加,删除或者修改)。这就是并发修改。 2.什么是fail-fast机制?fail-fast机制在遍历一个集合时,当集合结构被修改,会抛......
  • Java中的堆和栈的区别
    当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(LastInFirstOut)的顺序的数据结构,这就是java.util.Stack。这种情况下,不免让很多人更加......
  • libjingle 0.4和0.5版本之间的区别
    我所知道的主要的区别是:1.Build方式的区别.0.4在Windows上用VisualC++Express来build的,而0.5用的SCons来build的(一种跨平台的build工具)2.在0.5上去掉了fileshare的实现代码以及例子.我当前最关注的就是文件传输这一部分,所以决定从0.4版本......
  • MySQL中时间函数NOW()和SYSDATE()的区别
    mysql中日期函数还是比较常用的。主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别。NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间。因为NOW()取自mysql的一个变量”TIMESTAMP”,而这个变量在语句开始执行的时候就设定好了,因此在整个语句......