目录
问题四:线程间互斥的方法(synchronized、ReentrantLock)及其区别
(二)synchronized和ReentrantLock的区别
问题四:线程间互斥的方法(synchronized、ReentrantLock)及其区别
(一)线程间互斥
(1)synchronized:
监视器锁,Java都有一个对象头,8个字节4个字节 + 方法表的地址。
(2)ReentrantLock:
并发锁,java.util.cincurrent并发包下。JDK 1.5及以前,synchronized的效率太低、锁太重。JDK 1.6以后,对synchronized做了很大的优化,可以实现轻量级锁、偏向锁、自旋锁。
(二)synchronized和ReentrantLock的区别
(1)实现:
synchronized是Java关键字,是语言级别的线程互斥。
ReentrantLock只是Java并发包concurrent包里面提供的一个类,通过相应的方法调用从而实现线程互斥。
(2)加锁解锁:
synchronized的加锁解锁是自动进行的,开发者不需要关心。
ReentrantLock必须手动调用lock()和unlock()方法,来进行加锁解锁操作。所以使用ReentrantLock一定要在try{}finally{}语句块中的finally{}块中调用unlock()方法来释放并发锁,防止死锁的发生。
(3)效率:
JDK1.5 synchronized效率太低,锁太重。从JDK1.6开始对synchronized做了很大的优化,可以实现轻量级锁、偏向锁、自旋锁。
(4)范围:
synchronized做线程互斥对读读、读写、写写都会进行互斥操作。
并发包中有提供一个专门的读写锁(ReentrantReadWriteLock),使得临界区代码段如果是读读操作,可以并发执行。但是读写和写写还是互斥执行。
(三)Linux系统编程
mutex(互斥锁)
rwLock(读写锁)
spinLock(自旋锁)
效率:
mutex(互斥锁)<rwLock(读写锁)<spinLock(自旋锁)