乐观锁:不加锁的并发操作是安全的,使用CAS机制,例如原子类,通过CAS自旋实现原子操作更新。
悲观锁:不加锁的并发操作一定不安全。ReentrantLock,synchronized。
ReentrantLock
当一个线程进入到一个同步方法中,然后在此方法中要调用另一个同步方法,
而且两个方法公用同一把锁
此时线程是可以进入到另一个同步方法中的。
ReentrantReadWriteLock
读读共享,读写互斥、写写互斥
jdk8之后,去除了真正的分段锁,concurrentHashMap内有给方法加锁;
把锁进一步细粒度化提高并发效率。
获取锁的一种方式,例如原子类,当抢锁失败后,重试几次,抢到了就继续,抢不到线程阻塞。因
不断地进行尝试,会消耗cpu资源,因此适合时间短的线程,提高效率。
公平锁:按照获取锁的顺序分配,ReentrankLock底层可以设置公平锁,默认是非公平锁? ? ? ? ?
构造方法参数为true设置公平锁。??
共享锁:多个线程共享同一把锁,读写锁中的读读操作
独占锁:synchronized ReentrankLock,读写锁中的写操作
1.无锁
2.偏向锁:一段同步代码被一个线程一直访问,该线程就会自动获取锁,降低获取锁的代价。
3.轻量级锁:在偏向锁的基础上,如果有其他线程访问,将会升级为轻量级锁,让线程以自旋的方式获取锁,线程不会阻塞。
4.重量级锁:当锁为轻量级锁时,自旋不会一直持续下去,达到一定次数后,还没有获取到锁,就会进入阻塞状态,该锁膨胀为重量级锁。当高并发时,获取不到锁的进入阻塞状态,等待操作系统调度。