Java并发中互斥锁与读写锁区别

互斥锁
所谓互斥锁指的是一次最多只能有一个线程持有的锁,在jdk 1.5之前,我们通常使用synchronized机制控制多个线程对共享资源的访问。而现在,Lock提供了比synchronized机制更广泛的锁定操作,Lock和synchronized机制的主要区别:
  • synchronized机制提供了对每个对象相关的隐式监视器锁的访问,并强制所有锁的获取和释放均要出现在一个块结构中,当获取了多个锁时,他必须以相反的顺序释放。synchronized机制对锁的释放是隐式的,只要线程运行的代码块超出了synchronized语句块范围,锁就会被释放。而Lock机制必须显示的调用Lock的对象unlock()方法才能释放锁,这为获取锁和释放锁不出现在同一个块结构中、以及更自由的顺序释放锁提供了可能。
 
读写锁
ReentrantReadWriteLock中定义了2个内部类,ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock,分别用来代表读取锁和写入锁,ReentrantReadWriteLock对象提供了readLock()和writeLock()方法,用于获取读取锁和写入锁
 
其中:
  • 读取锁允许多个reader线程同时持有,而写入锁最多只能有一个writer线程持有。
  • 读写锁的使用场合是:读取数据的频率远大于修改共享数据的频率。在上述场合下使用读写锁控制共享资源的访问,可以提高并发性能。
  • 如果一个线程已经持有了写入锁,则可以再持有读写锁。相反,如果一个线程已经持有了读取锁,则在释放该读取锁之前,不能再持有写入锁。
  • 可以调用写入锁的newCondition()方法获取与该写入锁绑定的Condition对象,此时与普通的互斥锁并没有什么区别,但是调用读取锁的newCondition()方法将抛出异常。
 
发布了633 篇原创文章 · 获赞 627 · 访问量 137万+

猜你喜欢

转载自blog.csdn.net/czh500/article/details/105010844