比较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...

Java三种锁机制初步分析总结(Synchronized Lock(ReentrantLock) Semaphore Atomic)

Java处理高并发,大数据,多线程,分布式这些都会产生一个严重的后果,如何保证线程安全和数据的一致性成为重中之重。为了实现这点就不得不使用到了锁机制,java提供了4种常见的锁机制,当然其中Synch...

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

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

ReentranLock内部机制

前言JDK给我们提供了可重入锁ReentrantLock,下面我就对它的可重入这一机制进行描述。开始使用ReentrantLock,如下就是一个很简单的例子。static final Reentran...
  • simonhc
  • simonhc
  • 2017年02月14日 18:40
  • 212

Java线程---锁机制:synchronized、Lock、Condition

1.synchronized—对象加锁synchronized方法包括两种,一是标注了synchronized关键字的方法,一种是synchronized代码块.而不论是同步代码块还是同步方法都具有了...

[Linux driver] Mutex, semaphore, spinlock的深度解析

转载一下  Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运...

并发编程:ReentranLock和Condition

并发编程:ReentranLock和Condition问题描述synchronized关键字是JVM层提供的同步机制,我们无需对其异常或它行为做处理(比如释放资源),可以说使用synchronized...

线程同步(互斥锁与信号量的作用与区别)

“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在semtake的时候,就阻塞在 哪里)。而互斥锁是用在多线程多任务互斥的,一个线程占用...
  • tietao
  • tietao
  • 2012年03月19日 10:38
  • 32378

synchronized的优缺点。

使用synchronized,当多个线程尝试获取锁时,未获取到锁的线程会不断的尝试获取锁,而不会发生中断,这样会造成性能消耗。 而ReentranLock的lockInterruptibly()可以...
  • ox_ooxx
  • ox_ooxx
  • 2015年11月18日 10:52
  • 950

为什么我们可以在非UI线程中更新UI

看到这样的标题……估计N多人会说我是逗比…………因为很多盆友在学习Android(特别是从4.0之后开始入门的)的时候都会常看见或听到别人说我们更新UI呢要在UI线程(或者说主线程)中去更新UI,不要...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:比较ReentrantLock和synchronized和信号量Semaphore实现的同步性能
举报原因:
原因补充:

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