【多线程】问题四:线程间互斥的方法(synchronized、ReentrantLock)及其区别

本文详细解析了Java中的线程互斥方法synchronized与ReentrantLock的区别,包括其实现方式、加锁解锁机制、效率对比以及作用范围。同时介绍了Linux系统中的互斥锁、读写锁和自旋锁,并对其效率进行了比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

问题四:线程间互斥的方法(synchronized、ReentrantLock)及其区别

(一)线程间互斥

(1)synchronized:

(2)ReentrantLock:

(二)synchronized和ReentrantLock的区别

(1)实现:

(2)加锁解锁:

(3)效率:

(4)范围:

(三)Linux系统编程

效率:


问题四:线程间互斥的方法(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(自旋锁)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值