java锁名词解释

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

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

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

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

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

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

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

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

相关文章
相关标签/搜索