Synchronized和Lock的区别

Synchronized和Lock的区别  1、Lock是java的一个interface接口,而synchronized是Java中的关键字,synchronized是由JDK实现的,不需要程序员编写代码去控制加锁和释放;Lock的接口如下:“`public interface Lock {    void lock();    void lockInterruptibly() throws InterruptedExcep…

大家好,又见面了,我是你们的朋友全栈君。

  1、Lock是java的一个interface接口,而synchronized是Java中的关键字,synchronized是由JDK实现的,不需要程序员编写代码去控制加锁和释放;Lock的接口如下:
“`
public interface Lock {

    void lock();
    void lockInterruptibly() throws InterruptedException;
    boolean tryLock();
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock();
    Condition newCondition();
}
“`
  2、synchronized修饰的代码在执行异常时,jdk会自动释放线程占有的锁,不需要程序员去控制释放锁,因此不会导致死锁现象发生;但是,当Lock发生异常时,如果程序没有通过unLock()去释放锁,则很可能造成死锁现象,因此Lock一般都是在finally块中释放锁;格式如下:
“`
Lock lock = new LockImpl; // new 一个Lock的实现类
lock.lock();  // 加锁
try{

    //todo
}catch(Exception ex){

     // todo
}finally{

    lock.unlock();   //释放锁
}
“`
  3、Lock可以让等待锁的线程响应中断处理,如tryLock(long time, TimeUnit unit),而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够中断,程序员无法控制;
  4、通过Lock可以知道有没有成功获取锁,tryLock()方法返回boolean值,因此可知道是否获得了锁,而synchronized却无法办到。
  5、Lock的实现类ReentrantReadWriteLock提供了readLock()和writeLock()用来获取读锁和写锁的两个方法,这样多个线程可以进行同时读操作。
  总体来讲,当并发量较小,资源竞争不激烈时,两者的性能是差不多的;当大量线程同时竞争,资源非常有限时,此时Lock的性能要远远优于synchronized。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149531.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python读取图像的几种方法_python图像识别教程

    python读取图像的几种方法_python图像识别教程python读取图像的几种方式本文介绍几种基于python的图像读取方式:基于PIL库的图像读取、保存和显示基于opencv-python的图像读取、保存和显示基于matplotlib的图像读取、保存和显示基于scikit-image的图像读取、保存和显示基于imageio的图像读取、保存和显示安装方式基本使用pip即可:pipinstallpillowpipinstallscikit-imagepipinstallmatplotlibpipinstallopen

    2025年10月31日
    2
  • poj 2689 巧妙地运用素数筛选

    poj 2689 巧妙地运用素数筛选

    2022年1月8日
    43
  • SQL 子查询 EXISTS 和 NOT EXISTS[通俗易懂]

    SQL 子查询 EXISTS 和 NOT EXISTS[通俗易懂]MySQLEXISTS和NOTEXISTS子查询语法如下:SELECT…FROMtableWHEREEXISTS(subquery)该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE或FALSE)来决定主查询的数据结果是否得以保留。MySQLEXISTS子查询实例下面以实际的例子来理解EXISTS子查询。下面是原始的数据表:art

    2025年6月11日
    3
  • free mobile sex java_Java 8中Stream API的这些奇技淫巧!你都Get到了吗?

    free mobile sex java_Java 8中Stream API的这些奇技淫巧!你都Get到了吗?原标题:Java8中StreamAPI的这些奇技淫巧!你都Get到了吗?作者:我是你的小眼睛儿链接:https://www.jianshu.com/p/9fe8632d0bc2Stream简介1、Java8引入了全新的StreamAPI。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同。2、stream是对集合对象功能的增强,它专注于对集合对象…

    2022年10月15日
    2
  • 事务隔离级别与锁的对应关系_速度级别H和速度级别S

    事务隔离级别与锁的对应关系_速度级别H和速度级别S隔离级别org.springframework.transaction.annotation.Isolationpublic enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8);}DEFAULT :这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是: READ_CO..

    2022年8月8日
    7
  • PCBlayout设计「建议收藏」

    PCBlayout设计「建议收藏」一、PCB设计流程一般来说PCB基本设计流程:前期准备->PCB结构设计->PCB布局->布线->布线优化和丝印->网络和DRC检查和结构检查->制板。1、前期准备包括准备元件库和原理图,在开始进行布板时,得先完成原理图的设计。我们公司基本是用Protel99画图,我们常用的元件库也都基本具备,也是我们公司常用的标准。对于一些元件没有元件库的,需要自己根据元件

    2025年7月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号