比较ReentrantLock和synchronized和信号量Semaphore实现的同步性能

原创 2011年01月14日 14:21:00

为了比较一下ReentrantLock和synchronized的性能,做了一下性能测试:

参考http://zzhonghe.javaeye.com/blog/826162

 

得出结论:

(1)使用Lock的性能比使用synchronized关键字要提高4~5倍;

(2)使用信号量实现同步的速度大约比synchronized要慢10~20%;

(3)使用atomic包的AtomicInter速度是比Lock要快1一个数量级。

 

ReentrantLock 类
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。ReentrantLock 类实现了 Lock,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)

reentrant 锁意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放。这模仿了 synchronized 的语义;如果线程进入由线程已经拥有的监控器保护的 synchronized 块,就允许线程继续进行,当线程退出第二个(或者后续)synchronized 块的时候,不释放锁,只有线程退出它进入的监控器保护的第一个 synchronized 块时,才释放锁。

在查看清单 1 中的代码示例时,可以看到 Lock 和 synchronized 有一点明显的区别 —— lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!这一点区别看起来可能没什么,但是实际上,它极为重要。忘记在 finally 块中释放锁,可能会在程序中留下一个定时bomb,当有一天bomb爆炸时,您要花费很大力气才有找到源头在哪。而使用同步,JVM 将确保锁会获得自动释放。

 

  Test的源码

 

测试类ReentreLockTest 源码

  

 

 

结果

 

 

 

 

 

Java中的Semaphore和Lock区别

Java提供了一个类Semaphore来实现信号量,概念上讲,一个信号量相当于持有一些许可(permits),线程可以调用Semaphore对象的acquire()方法获取一个许可,调用release...
  • gengyiping18
  • gengyiping18
  • 2017年03月03日 16:38
  • 1570

多线程基础之五:Windows API提供的mutex和semaphore性能比较

Windows系统提供HANDLE WINAPI CreateSemaphore(xxx)和HANDLE WINAPI CreateMutex(xxx)直接提供Mutex和Semaphore两种内核对...
  • roger_ranger
  • roger_ranger
  • 2017年11月17日 23:15
  • 68

Java并发之Semaphore详解

一、入题        Semaphore是一种基于计数的信号量。它可以设定一个阈值,基于此,多个线程竞争获取许可信号,做完自己的申请后归还,超过阈值后,线程申请许可信号将会被阻塞。Semaphore...
  • lipeng_bigdata
  • lipeng_bigdata
  • 2016年08月09日 20:51
  • 15106

Semaphore的使用之方法tryAcquire()的使用

无参方法tryAcquire()的作用是尝试的获得1个许可,如果获取不到则返回false,该方法通常与if语句结合使用,其具有无阻塞的特点。无阻塞的特点可以使线程不至于在同步处一直持续等待的状态,如果...
  • ApatheCrazyFan
  • ApatheCrazyFan
  • 2017年03月19日 22:20
  • 2636

Semaphore和synchronized的差别

Semaphore和synchronized最主要的差别是Semaphore可以指定多个并发,而synchronized只能是一个!   import java.util.concurrent.E...
  • yangfanend
  • yangfanend
  • 2012年03月28日 22:46
  • 1262

使用Lock,wait/notify,Semaphore三种方式实现多线程通信

java的多线程通信有Lock,wait/notify,Semaphore三种方式,已一道常见面试题来简单演示这三种多线程通信方式。 两个线程循环间隔打印指定内容,一个打印从1到52的数字,一个打印从...
  • chjttony
  • chjttony
  • 2013年10月08日 14:56
  • 7021

比较ReentrantLock和synchronized和信号量Semaphore实现的同步性能

为了比较一下ReentrantLock和synchronized的性能,做了一下性能测试: public class ReentreLockTest { private static long...
  • arkblue
  • arkblue
  • 2011年01月14日 14:21
  • 6908

聊一聊Semaphore

原文链接:http://www.cnblogs.com/liuling/p/2013-8-20-03.html                     http://ifeve.com/conc...
  • zhushuai1221
  • zhushuai1221
  • 2016年08月04日 13:30
  • 492

java线程同步的三种方法[synchronized关键字,Lock加锁,信号量Semaphore]

java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题。java在处理线程同步时,常用方法有: 1、synchronized关键字。 2、Lock显示加锁。 3、信号量Semap...
  • zmx729618
  • zmx729618
  • 2017年04月01日 15:10
  • 641

java的两种同步方式, Synchronized与ReentrantLock的区别

java在编写多线程程序时,为了保证线程安全,需要同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同...
  • chenchaofuck1
  • chenchaofuck1
  • 2016年04月02日 19:37
  • 7738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较ReentrantLock和synchronized和信号量Semaphore实现的同步性能
举报原因:
原因补充:

(最多只允许输入30个字)