1.CountDownLatch倒计时锁,是一种共享锁,主要用于等待其他线程执行完,在继续执行的场景,类似于线程的join方法。
2.ReentrantLock可重入锁,是一种独占锁,存在公平锁和非公平锁场景,所谓公平与非公平,只不过是对于新来的线程是优先获取一次锁还是直接放入等待队列,可重入锁可以对锁进行累计+1,释放锁时每次减1。
3.Semaphore信号量,是一种共享锁,是对资源的并发访问的控制。
4.独享锁/共享锁:对于Java的ReentrantLock而言,其是独享锁。但是对于java的另一个实现类ReadWriteLock,其读锁是共享锁,其写锁是独享锁。
5.互斥锁/读写锁:互斥锁在Java中的具体实现就是ReentrantLock。读写锁在Java中的具体实现就是ReadWriteLock。
6.乐观锁/悲观锁:乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。悲观锁认为对于同一个数据的并发操作,一定会发生修改的,哪怕没有修改,也会认为修改。因此对于同一份数据的并发操作,悲观锁采取加锁的形式。悲观的认为,不加锁并发操作一定会出问题。
7.分段锁:分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。
8.自旋锁:自旋锁是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。
9.偏向锁/轻量级锁/重量级锁:这三种锁是指锁的状态,并且是针对Synchronized。
偏向锁:偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
轻量级锁:轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁:重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让他申请的线程进入阻塞,性能降低。