ReentrantLock和Synchronized的区别

相同点:都是用加锁方式控制线程同步。并且都是阻塞式的同步,即当一个线程得到了对象的锁,进入同步块,其余访问该同步块的线程都必须阻塞在同步块外面等待。java

不一样点:synchronized是java语言的关键字,是原生语法层面的互斥,须要jvm实现。而ReentrantLock是Jdk 1.5以后提供的API层面的互斥锁,须要lock()和unlock()方法配合try/finally语句块来完成。便利性方面:synchronized使用比较方便简洁,而且由编译器保证锁的加锁和释放。而ReentrantLock须要手动加锁和释放锁。正式因为ReetrantLock手工加锁和释放,所以锁的灵活度和细粒度更高。jvm

synchronized优化之后,使用了偏向锁、轻量级锁(自旋锁)后,二者的性能就差很少了,在两种方法均可用的状况下,官方甚至建议使用synchronized。性能

synchronized会在同步块的先后分别造成monitorenter和monitorexit这两个字节码指令。在执行monitorenter指令是,首先要尝试获取锁对象。若是这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁的计算器减1。优化

相关文章
相关标签/搜索