总的来说,lock更加灵活。

主要同样点:Lock能完毕synchronized所实现的全部功能

不同:

1.ReentrantLock功能性方面更全面,比方时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。

在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活。一个ReentrantLock能够有多个Condition实例。所以更有扩展性。

2.ReentrantLock必须在finally中释放锁,否则后果非常严重,编码角度来说使用synchronized更加简单。不easy遗漏或者出错。

3.ReentrantLock 的性能比synchronized会好点。

4.ReentrantLock提供了可轮询的锁请求。他能够尝试的去取得锁,假设取得成功则继续处理,取得不成功,能够等下次执行的时候处理,所以不easy产生死锁。而synchronized则一旦进入锁请求要么成功,要么一直堵塞。所以更easy产生死锁。

转载:

http://houlinyan.iteye.com/blog/1112535

1、ReentrantLock 拥有Synchronized同样的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候

线程A和B都要获取对象O的锁定,如果A获取了对象O锁。B将等待A释放对O的锁定,

假设使用 synchronized ,假设A不释放,B将一直等下去,不能被中断

假设 使用ReentrantLock,假设A不释放。能够使B在等待了足够长的时间以后。中断等待,而干别的事情

ReentrantLock获取锁定与三种方式:

    a)  lock(), 假设获取了锁马上返回,假设别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

b) tryLock(), 假设获取了锁马上返回true,假设别的线程正持有锁,马上返回false;

c)tryLock(long timeout,TimeUnit unit),   假设获取了锁定马上返回true,假设别的线程正持有锁,会等待參数给定的时间,在等待的过程中。假设获取了锁定,就返回true,假设等待超时。返回false。

d) lockInterruptibly:假设获取了锁定马上返回,假设没有获取锁定,当前线程处于休眠状态。直到或者锁定。或者当前线程被别的线程中断

2、synchronized是在JVM层面上实现的,不但能够通过一些监控工具监控synchronized的锁定,并且在代码运行时出现异常,JVM会自己主动释放锁定。可是使用Lock则不行,lock是通过代码实现的。要保证锁定一定会被释放,就必须将unLock()放到finally{}中

3、在资源竞争不是非常激烈的情况下,Synchronized的性能要优于ReetrantLock,可是在资源竞争非常激烈的情况下,Synchronized的性能会下降几十倍。可是ReetrantLock的性能能维持常态。

參考文章:

  • http://houlinyan.iteye.com/blog/1112535
  • http://zhangjunhd.blog.51cto.com/113473/70300/
  • http://hi.baidu.com/ecspell/item/d9fa870a22eafa354bc4a3ae
  • http://my.oschina.net/u/1042978/blog/127207

ReentrantLock与synchronized的差别的更多相关文章

  1. Java中的ReentrantLock和synchronized两种锁定机制的对比

    问题:多个访问线程将需要写入到文件中的数据先保存到一个队列里面,然后由专门的 写出线程负责从队列中取出数据并写入到文件中. http://blog.csdn.net/top_code/article/ ...

  2. ReentrantLock和synchronized两种锁定机制

    ReentrantLock和synchronized两种锁定机制 >>应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicit ...

  3. java多线程之:Java中的ReentrantLock和synchronized两种锁定机制的对比 (转载)

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  4. Java中的ReentrantLock和synchronized两种锁机制的对比

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  5. Java中的ReentrantLock和synchronized两种锁定

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  6. Java中的ReentrantLock和synchronized两种锁定机制

    原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...

  7. ReentrantLock与synchronized

    1.ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候 线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O ...

  8. Java ReentrantLock和synchronized两种锁定机制的对比

    多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动 ...

  9. ReentrantLock和synchronized区别和联系?

    相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁. 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此 ...

随机推荐

  1. oracle系列索引

    今天终于把oracle入门的知识通篇过了一遍. 一篇文章没有写,先做个索引.把知识系统的梳理下. 数据库基本概念-oracle介绍 oracle安装,配置,启动 oracle工具 sqlplus 用户 ...

  2. linux shell获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用 ...

  3. git的使用方法总结

    一.创建版本库 $ cd D:   进入d盘 $ cd wamp/www 进入相应目录 $ mkdir test 创建目录 $ git init 把目录变为git可以管理的仓库 二.提交文件到版本库 ...

  4. 【python】二进制、八进制、十六进制表示方法(3.0以上)

    2进制是以0b开头的: 例如: 0b11 则表示十进制的3 8进制是以0o开头的: 例如: 0o11则表示十进制的9 (与2.0版本有区别) 16进制是以0x开头的: 例如: 0x11则表示十进制的1 ...

  5. Centos6.4配置Fedora EPEL源附配置hop5.in源

    查看系统版本 cat /etc/redhat-release 下载CentOS 版本所对应的EPEL 的版本 wget http://download.fedoraproject.org/pub/ep ...

  6. failure injection

    (1)malloc穷尽的情况: 假设下面的代码是测试代码,里面含有被测函数fmalloc,其中含有一个malloc语句,在一般情况下,是很难走到malloc失败的分支的,因为很难模拟系统内存耗尽的情况 ...

  7. vs2008生成的各种文件

    一.sln文件     .sln(Solution)解决方案文件,表示一个项目组,他通常包含一个项目中所有的工程文件信息.   二.suo文件     suo(Solution User Option ...

  8. Ipv6_Only-b

    网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧. 总的来说有三个方面需要进行检查和修改: 1 ...

  9. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊 動態樹

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 4055  Solved: 2172[Submi ...

  10. 几种交换两个数函数(swap函数)的写法和解析

    #include <iostream> using namespace std; /*值传递,局部变量a和b的值确实在调用swap0时变化了,当结束时,他们绳命周期结束*/ void sw ...