开发技能Java线程并发

不同锁的定义

独占锁与共享锁

  1. 独占锁:同一时间,一把锁只能被一个线程获取;
  2. 共享锁:同一时间,一把锁可以被多个线程获取。

公平锁与非公平锁

  1. 公平锁:线程获取锁的顺序,严格按照它们请求锁的时间顺序(FIFO)来分配。先请求的线程优先获得锁,后请求的必须排队。这种锁往往性能稍差,因为要保证申请时间上的顺序性;
  2. 非公平锁: 锁被释放后,后续线程获得锁的可能性随机,或者按照设置的优先级进行抢占式获取锁。
特性公平锁 ReentrantLock(true)非公平锁 synchronized / ReentrantLock(false)
锁分配顺序按请求时间 FIFO允许抢占,吞吐量通常更高
线程饥饿很少发生可能发生(某些线程长期得不到锁)
性能稍差(因为需要维护有序队列)更好

可重入锁

所谓可重入锁就是一个线程在获取到了一个对象锁后,线程内部再次获取该锁,依旧可以获得,即便持有的锁还没释放,仍然可以获得,不可重入锁这种情况下会发生死锁! 可重入锁在使用时需要注意的是:由于锁会被获取 n 次,那么只有锁在被释放同样的 n 次之后,该锁才算是完全释放成功。

可中断锁与不可中断锁

  1. 可中断锁:在获取锁的过程中可以中断获取,不需要非得等到获取锁后再去执行其他逻辑;
  2. 不可中断锁:一旦线程申请了锁,就必须等待获取锁后方能执行其他的逻辑处理。

ReentrantLock

ReentrantLock是一种同时拥有独占式、可重入、可中断、公平/非公平特性的同步器!

Built with LogoFlowershow