zoukankan      html  css  js  c++  java
  • ReentrantLock和Synchronized的区别

    1、区别:

    1)Lock是一个接口,synchronized是Java中的关键字,synchronized是内置的语言实现;
    2)synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁现象。Lock发生异常,若没有主动释放,极有可能造成死锁,故需要在finally中调用unLock方法释放锁;
    3)Lock可以让等待锁的线程响应中断,使用synchronized只会让等待的线程一直等待下去,不能响应中断
    4)通过Lock可以知道有没有成功获取到锁,synchronized就不灵
    5)Lock可以提高多个线程进行读操作的效率

    2、在锁概念上的区别:

    1)可中断锁
    响应中断的锁,Lock是可中断锁(体现在lockInterruptibly()方法),synchronized不是。如果线程A正在执行锁中代码,线程B正在等待获取该锁。时间太长,线程B不想等了,可以让它中断自己。

    也可设置超时时间:tryLock(long timeout,TimeUnit unit);

    2)公平锁
    尽量以请求锁的顺序获取锁。比如同时有多个线程在等待一个锁,当锁被释放后,等待时间最长的获取该锁,跟京牌司法拍卖一个道理。非公平锁可能会导致有些线程永远得不到锁,synchronized是非公平锁,ReentrantLock默认非公平锁,构造方法可以传入布尔值,true为公平锁,false为非公平锁。
    3)读写锁
    读写锁将对一个资源(如文件)的访问分为2个锁,一个读锁,一个写锁;读写锁使得多个线程的读操作可以并发进行,不需同步。而写操作就得需要同步,提高了效率,ReadWriteLock就是读写锁,是一个接口,ReentrantReadWriteLock实现了这个接口。可通过readLock()获取读锁,writeLock()获取写锁
    4)绑定多个条件
    一个ReentrantLock可以绑定多个Condition对象,仅需多次调用new Condition()即可;而在synchronized中锁锁对象的wait()、notify()/notifyAll()可以实现一个隐含的条件,如果要和多余的条件关联,就不得不额外的增加一个锁。所以ReentrantLock可以用来实现分组唤醒需要唤醒的线程们,可以精确唤醒,而不是像synchronized随机唤醒一个或者全部唤醒

    5)释放锁方式的区别

    synchronized不需要用户手动释放锁,synchronized代码块执行完或抛异常会自动让线程释放锁;而ReentrantLock则需要用户手动去释放锁,否则可能出现死锁。一般lock和unlock方法配置在try/finally语句块。

    3、性能比较:

    大量线程同时竞争,ReentrantLock要远胜于synchronized。
    JDK5中,synchronized是性能低效的,因为这是一个重量级操作,对性能的最大影响是阻塞的实现,挂起线程和恢复线程的操作,都需要转入内核态中完成,给并发带来了很大压力。
    JDK6中synchronized加入了自适应自旋、锁消除、锁粗化、轻量级锁、偏向锁等一系列优化,官方也支持synchronized,提倡在synchronized能实现需求的前提下,优先考虑synchronized来进行同步。

  • 相关阅读:
    OPENGL学习笔记整理(一)
    OPENGL学习笔记整理(二):纹理知多少?
    OPENGL学习笔记整理(三):缓冲区对象
    细节决定成败(基础知识收集)
    OPENGL学习笔记整理(四):几何图元渲染
    目标规划,利用业余时间。欢迎大家指导。
    微型通用程序框架
    COM在注册表中的相关键值及其意义
    C#编写基于.Net IOCP的高性能服务器(转)
    Java获取XML节点总结之读取XML文档节点
  • 原文地址:https://www.cnblogs.com/six-hc/p/14603252.html
Copyright © 2011-2022 走看看