java中锁的定义

分类

  1. 公平锁、非公平锁:算法不同而已,公平锁是先来先服务
  • 公平锁是多个进程间,先来先服务
  • 非公平锁是多个进程间,抢占式。
  1. 可重入锁:就是一个进程获得了该锁后,该进程调用其自己的方法,该方法内有访问了这个被自己锁住的资源,此时,可以放行,可以访问。Java ReentrantLock就是了。
  2. 乐观锁、悲观锁
  • 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。
  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。
  1. 独享锁、共享锁
  • 独享锁:不允许多个进程共同访问的锁。互斥量问题,只有一个人可以拥有该资源。
  • 共享锁:允许多个进程共同访问的锁。多线的读写问题,可以多个同时读。
  1. 分段锁:concurrenthashmap的实现,其实是对一个map进行了细粒度的上锁(上的锁是synchronized,还有修改值是CAS操作,1.8之前前是重入锁。)
  2. 偏向锁/轻量级锁/重量级锁:这三种锁是指锁的状态,并且是针对Synchronized。这三种锁的状态是通过对象监视器在对象头中的字段来表明的。
  • 偏向锁:偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。即下次自动先申请资源,而不是到了要用的时候再申请。
  • 轻量级锁:轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。也是乐观锁,自旋锁
  • 重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞
  1. 自旋锁:是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。底层实现也是依靠CAS加信号量理论。

自旋锁的两种实例

  1. 多个进程操作一个原子量的时候,用CAS。直接对一个原子量操作的话,体现的虽然也是自旋(循环),但是,只能操作一个原子量而已。代码块还是要自己实现自旋锁,或者使用synchronized之类的。参考1参考2
  2. 利用一个原子量作为信号量,给多个进程上自旋锁。即:自旋锁的实现,需要依赖一个原子量的CAS()方法。两者关系是底层原理和实现效果的关系。自旋锁的实现(好文,易懂)
发布了54 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42031483/article/details/105332115