synchronized和ReentrantLock区别

一.什么是sychronizedjava

sychronized是java中最基本同步互斥的手段,能够修饰代码块,方法,类.函数

在修饰代码块的时候须要一个reference对象做为锁的对象.spa

在修饰方法的时候默认是当前对象做为锁的对象.线程

在修饰类时候默认是当前类的Class对象做为锁的对象.对象


synchronized会在进入同步块的先后分别造成monitorenter和monitorexit字节码指令.在执行monitorenter指令时会尝试获取对象的锁,若是此没对象没有被锁,或者此对象已经被当前线程锁住,那么锁的计数器加一,每当monitorexit被锁的对象的计数器减一.直到为0就释放该对象的锁.由此synchronized是可重入的,不会出现本身把本身锁死.同步


二.什么ReentrantLockit

以对象的方式来操做对象锁.相对于sychronized须要在finally中去释放锁 io

三.synchronized和ReentrantLock的区别构造函数

除了synchronized的功能,多了三个高级功能.方法

等待可中断,公平锁,绑定多个Condition.

1.等待可中断

在持有锁的线程长时间不释放锁的时候,等待的线程能够选择放弃等待.   tryLock(long timeout, TimeUnit unit)

2.公平锁

按照申请锁的顺序来一次得到锁称为公平锁.synchronized的是非公平锁,ReentrantLock能够经过构造函数实现公平锁.    new RenentrantLock(boolean fair)

3.绑定多个Condition

经过屡次newCondition能够得到多个Condition对象,能够简单的实现比较复杂的线程同步的功能.经过await(),signal();

相关文章
相关标签/搜索