JAVA并发编程:Synchronized 与 ReentrantLock 区别

生活

周末,难得睡爽一次。真舒服。

————

今天来聊聊Synchronized与ReentrantLock的区别。

JAVA在编写多线程程序时,为了保证线程安全,需要对数据进行同步,常用的同步方式就是Synchronized和ReentrantLock两种。

相似点

两者的相似点在于,都是可重入互斥锁,都是阻塞式同步。在多线程环境下,当有多个线程竞争同一块资源时,其中一个线程已经获取资源进入同步块,其他线程只能在同步块外等待,而进行线程阻塞的唤醒的代价是比较高的(操作系统需要在用户态和内核态之间不断转换,代价很高,但是可以通过锁优化来改善)。

区别

区别1:实现方式
Synchronized是JAVA中一个关键字,是java原生语义层面的互斥,是通过JVM来实现的,在同步块前后加monitorenter和monitorexit来实现。
而ReentrantLock是在JDK1.5之后出现的,是通过lock()/unlock()/配合try{}finally{}来实现的。

区别2:等待可中断
等待可中断是指当持有锁的线程长期不释放时,正在等待的线程可以选择放弃不等待,改为处理其他事情。等待可中断特性对处理时间很长的同步块很有帮助。
假设在多线程环境下,有两个线程竞争同一块资源,当一个线程获取了资源进入同步块,如果没有释放资源,另一个线程将等待前面的线程释放资源。
使用synchronized时,如果thread1没有释放资源,thread2将一直等待,不能被中断。
使用ReetrantLock时,如果thread1没有释放资源,thread2可以中断等待。

区别3:公平锁
公平锁时指多个线程在等待一个锁时,必须按照申请的时间顺序依次获得锁。在非公平锁被释放时,其他的在等待锁的线程都有机会获得锁。
synchronized是一个非公平锁
ReentrantLock默认是一个非公平锁,可以指定fair为true,创建公平锁。

区别4:锁绑定多个条件
ReentrantLock可以实现多个条件的绑定,只需调用newCondition方法即可绑定一个条件。
在synchronized下,锁对象的wait()/notify()只能实现一个条件。要想对多个条件进行绑定,只能是多个锁来实现。

区别5:性能
JDK 1.5中,synchronized还有很大的优化余地。JDK 1.6 中加入了很多针对锁的优化措施,synchronized与ReentrantLock性能方面基本持平。

后记

JDK1.6对synchronized做了什么优化。后面再聊~

猜你喜欢

转载自blog.csdn.net/qq_28605513/article/details/84481242