目录
一.六种锁策略(重点)
锁策略是形容锁的特点的。
1.乐观锁---悲观锁
乐观锁:认为锁竞争不激烈,它在数据发生更新时,会检查是否发生并发冲突。
悲观锁:认为锁竞争很激烈,每次访问共享变量时都会真正地加锁。
2.轻量级锁---重量级锁
轻量级锁加锁解锁操作开销小,效率高。
重量级锁加锁解锁操作开销大,效率低。
3.自旋锁---挂起等待锁
自旋锁是一种轻量级锁,它加锁解锁开销小,会频繁地尝试获取锁,保证了第一时间可以获取到锁,响应速度很快,但是占用了大量的系统资源。
挂起等待锁是一种重量级锁,它如果无法获取到锁,就会等待,响应速度不如自旋锁,但是省下了对系统资源的占用。
4.互斥锁---读写锁
互斥锁提供了加锁和解锁操作,如果一个线程加锁,那么另一个线程像获取锁就会被阻塞。
读写锁针对特定的情形,提供了对读加锁、对写加锁、解锁三个操作,其中读锁和读锁不互斥,写锁和写锁互斥,读锁和写锁互斥。这样的处理方式就能大大提高对读写操作频繁的程序的效率。(基于多线程对同一变量读操作,没有线程安全问题,而一般开发场景中,读操作较写操作更加频繁,此时读写锁就很适合这种场景)
5.公平锁---非公平锁
公平锁:多个线程针对同一个对象加锁,遵循先来后到的原则,先请求加锁的线程可以优先获取到锁。
非公平锁:多个线程针对同一个对象加锁,阻塞等待的线程等可能地获取锁。(synchronized和操作系统实现的锁都是非公平锁)
6.可重入锁---不可重入锁
不可重入锁:一个线程针对一把锁,连续加锁两次,会发生死锁。
可重入锁:一个线程针对一把锁,连续加锁两次,不会发生死锁。(只要以Reentrant开头命名的锁都是可重入锁,JDK提供的所有现成的Lock实现类,包括synchronized关键字锁都是可重入锁,synchronized对重入特殊处理了,采取不加锁的策略)