并发编程---显式锁



1,Lock与ReentrantLock

  1.1,ReentrantLock不是替代内置加锁的方法,而是当内置加锁不适用时,作为一种可选的高级功能,如:可定时的、可轮询的,与可中断的锁获取操作,公平队列,以及非块结构的锁。一般应该优先使用synchronized。

  1.2,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,在Lock的实现中必须提供与内部锁相同的内存可见性语义,但在加锁语义、调度算法、顺序保证以及性能特性等方面可以有所不同

2,轮询锁与定时锁

  2.1,可定时的与可轮询的锁获取模式是由tryLock方法实现的,它具有更加完善的错误恢复机制。如果不能获得所有的锁,那么可定时的或者可轮询的锁获取方式会使你释放已经获取的锁,然后重新尝试获取所有的锁,从而避免死锁,并且降低活锁的可能性

  2.2,可中断的锁获取操作:lockInterruptibly方法能够在获得锁的同时保持对中断的响应
3,性能考虑因素
  3.1,公平性:在ReentrantLock的构造函数中提供了两种公平性选择,非公平锁(默认)和公平锁。公平性将由于在挂起线程和恢复线程时存在的开销而极大地降低性能。内置锁默认是非公平性的。在大多情况下,在锁的实现上实现统计上的公平性保证已经足够了。
4,读-写锁
  4.1,一个资源可以被多个读操作访问,或者被一个写操作访问,但两者不能同时进行
  4.2,ReentrantReadWriteLock对读-写锁都提供了可重入的加锁语义,构造函数提供了非公平(默认)和公平锁选项,写线程可以降级为读线程,但是读线程不可以升级为写线程
  4.3,当锁的持有时间较长,且大部分操作都不会修改被守护的资源时,读写锁能够提高程序的并发性,否则读写锁的性能劣与独占锁,因为读写锁的设计更加复杂

猜你喜欢

转载自blog.csdn.net/qq_40182703/article/details/80955639