zoukankan      html  css  js  c++  java
  • 浅谈Synchronized和ReentrantLock

    Synchronized:

    关键字Synchronized可以保证在同一时刻,只有一个线程可以执行某一方法,或者某一代码块。可以理解为一种互斥的方式,即同步不仅可以阻止一个线程看到对象处于不一致的状态中;它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。(effective java 中文版 P229)

    这里有一个重要的概念。关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法(函数)当作锁,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁,其他线程都只能呈等待状态。但是这有个前提:既然锁叫做对象锁,那么势必和对象相关,所以多个线程访问的必须是同一个对象。如果多个线程访问的是多个对象,那么Java虚拟机就会创建多个锁,既然多个线程持有的是不同的锁,自然不会受到"等待释放锁"这一行为的制约。

     

    ReentrantLock:

    ReentrantLock是一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。(oracle官方文档

     

    对比:

    Synchonized是在jvm层面实现的,不能被中断,会自动释放锁。

    ReentrantLock依靠ReetrantLock对象,由代码实现,不能自己释放锁,要使得锁被释放,就必须在finally{}添加unLock()。

     

    在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好。

    ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。

     

    参考文档

    https://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html

     

  • 相关阅读:
    mvc:三
    mvc:二
    Linq分组,linq方法分组
    Linq 中按照多个值进行分组(GroupBy)
    Photoshop 字体
    报表Reporting S而vice是 错误的解决
    1*书籍装帧
    photoshop 魔术橡皮擦
    Photoshop 钢笔 双窗口显示
    数字格式化
  • 原文地址:https://www.cnblogs.com/stupid-chan/p/9427118.html
Copyright © 2011-2022 走看看