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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 域名备案信息修改(未备案域名解析到国内服务器)

    域名备案后修改服务器内容精选换一换PHPWind(简称:PW)是一个基于PHP和MySQL的开源社区程序,是国内较受欢迎的论坛之一。轻架构,高效易开发,使用户可快速搭建并轻松管理。本文档指导用户使用华为云市场镜像“PHPWind论坛社区系统(LAMP)”部署PHPWind论坛系统。弹性云服务器所在安全组添加了如表1所示的安全组规则,具体步骤参见为安全组添加安全组规则。MWordPress简称W…

    2022年4月16日
    76
  • 如何设置eclipse代码自动补全「建议收藏」

    如何设置eclipse代码自动补全「建议收藏」打开Eclipse->Window->Perferences找到Java下的 Editor下的 ContentAssist, 右边出现的选项中,有一个AutoactivationtriggersforJava:可以看到在默认情况下只有一个".“存在。表示:只有输入”."之后才会有代码提示在AutoactivationtriggersforJ…

    2022年5月6日
    44
  • 阿里云搭建svn服务器_如何搭建家用云服务器

    阿里云搭建svn服务器_如何搭建家用云服务器最近买了华为云服务器(ubuntuserver14.04),准备玩玩云,本文就是记录一下如何在华为云上搭建SVN服务器,跟阿里云上搭建SVN服务器还是有点区别的。第一次登录或第一次用SSH远程登录,需要跟客服要文档。华为云的安全策略,第一次使用apache2服务,需要看如何修改安全策略,增加80端口的公网访问,80端口是Apache2服务的默认端口。修改安全策略帮助帮助(1)安装软件

    2022年10月17日
    3
  • fileinput的使用

    fileinput的使用BootstrapFileInput中文API整理这段时间做项目用到bootstrapfileinput插件上传文件,在用的过程中,网上能查到的api都不是很全,所以想着整理一份比较详细的文档,方便自己今后使用,也希望能给大家带来帮助,如有错误,希望大家积极指正。一、    引入文件二、    初始化设置:$(“#uplo

    2022年6月7日
    85
  • springboot和springframework以及jdk版本的对应关系

    springboot和springframework以及jdk版本的对应关系Springboot版本 SpringFramework jdk版本 maven版本 1.2.0版本之前 6 3.0 1.2.0 4.1.3+ 6 3.2+ 1.2.1 4.1.3+ 7 3.2+ 1.2.3 4.1.5+ 7 3.2+ 1.3.4 4.2.6+ 7 3.2+ 1.3.6 4.2.7+ 7 3.2+ 1.3.7 4.2.

    2022年5月16日
    258
  • 递归改成循环_递归比循环效率高吗

    递归改成循环_递归比循环效率高吗Java递归,递归改循环为什么大家都说不建议用递归?递归容易造成栈溢出,在jdk1.5前虚拟机给每个栈桢的运行空间128kb,在1.5以后为1m的运行空间.递归是指先进后出,也就是说第一进栈的对象会最后一个出站,然后栈桢的空间只有1m,生产环境的数据需要递归的深度,一般情况下我们无法通过测试来进行模拟。所以对于递归的深度不可把控的情况下,是有栈溢出的风险。一个简单的例子测试递归的深度递…

    2022年9月17日
    2

发表回复

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

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