java锁名词解释


一.公平锁/非公平锁(FairSync/NonfairSync):
  公平锁: 公平锁是指多个线程按照申请锁的顺序来获取锁。(先尝试获取锁, 失败进队列)
  非公平锁: 非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。

二.悲观锁/乐观锁(锁的类型):
  悲观锁:悲观锁认为写操作频繁,所以每次读写都会上锁。sycchronized 就是悲观锁的一种实现,同时也是一种重量级锁。
      悲观锁认为对于同一个数据的并发操作一定是会发生修改。因此对于同一个数据的并发操作,悲观锁采取加锁的形式。悲观的认为不加锁的并发操作一定会出问题。
  乐观锁:乐观锁认为读多写少(并发写的可能性低),所以不上锁。每次更新前读取版本号,并比较版本号,如果一致则认为没有其他线程的写操作而完成更新,

      若版本号不一致则放弃此次更新,并重复此次更新(读版本号,比较,更新)操作。
     乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据。乐观的认为不加锁的并发操作没有问题。

三.自旋锁:
  自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,等待竞争锁的线程不需要做内核态和用户态之间的切换进入阻塞挂起状态
  缺点是循环会消耗CPU,如果持有锁的线程执行的时间超过自旋等待的最大时间扔没有释放锁,就会导致其它争用锁的线程在最大等待时间内还是获取不到锁,这时争用线程会停止自旋进入阻塞状态.

四.独享锁/共享锁:
  独享锁(排它锁,互斥锁)是指该锁一次只能被一个线程所持有,例:ReentrantLock
  共享锁是指该锁可被多个线程所持有,例:ReadLock
  独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享

五.读写锁:
  ReadWriteLock--ReadLock读锁(共享锁),WriteLock写锁(独享锁)

六.分段锁:
  分段锁并不是锁的名称,是指锁的设计方式,java中的例子(ConcurrentHashMap),锁单个Node(数组的单个元素)

七.偏向锁/轻量锁/重量锁
  这三种锁是指锁的状态,并且是针对Synchronized。在Java 5通过引入锁升级的机制来实现高效Synchronized。这三种锁的状态是通过对象监视器在对象头中的字段来表明的。
  偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
  轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
  重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低.


作者:jiabei,发布于:2019/01/14
原文:https://www.cnblogs.com/jia-bei/p/10254055.html