https://www.jianshu.com/p/c6a602be4994
首先是reentrantlock会更灵活一些。参考网上的:
首先他们的相似之处在于,都是加锁方式同步,而且都是阻塞式同步,也就是说当一个线程获得对象锁之后,进入同步块,其他访问该同步块的线程都必须阻塞在该同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态和核心态之间来回切换)
功能上的区别:
synchronized是java语言的关键词,他是需要jvm实现的,并且可以修饰方法,也可以修饰代码块 :
public synchronized void test()
synchronized(this)
ReentrantLock是jdk1.5之后提供的API层面的互斥锁,需要用 lock()和unlock()并配合 try/catch /finally语句来完成
便利性:
synchronized肯定是更便利的,主要在于当出现异常的时候,就会自动解锁,而reentrantLock则相对不方便一点,需要手动声明加锁和释放锁的方法,而且为了避免忘记手动释放锁,一般会在finally中声明释放锁
锁的颗粒度和灵活度:
网上说
很明显ReenTrantLock优于synchronized,更灵活能理解,因为他可以手动的设置开锁和闭锁吧。灵活体现在:1.可以使用trylock来尝试锁定,不管锁定与否,方法都继续执行2.可以根据trylock的返回值来判定是否锁定3.可以指定
trylock的时间,由于trylcok(time)会抛出异常,而又不能通过异常直接解锁,使用要注意unlock的处理,必须放在finally中4.设置interrupt来进行打断5.还可以设置为公平锁
公平锁的概念:
有好多线程在争夺一个被占据资源,当这个资源释放出来之后,这些线程就会竞争这个资源,如果是公平竞争,是看谁等的时间长谁就得到这个资源,这个锁就是公平锁,。而默认的synchronized是非公平锁,不用计算谁等的时间更长,所以相对的效率会高一点。