常见的锁策略
1.乐观锁vs悲观锁
乐观锁:简的来说就是预期锁的冲突概率很低。
悲观锁:与乐观锁相反,预期冲突率很高。
2.读写锁vs普通的互斥锁
读写锁:顾名思义,就是指使用这个锁的时候可以选择操作,对于读写锁来说,共有三个操作,加读锁,加写锁和解锁,前两个对别对读操作加锁和对写操作加锁,针对读锁和写锁之间并不存在互斥关系。
3.重量级锁vs轻量级锁
重量级锁:就是做了很多事情,开销很大,通常情况下可以认为,悲观锁一般都是重量级锁。
轻量级锁:做的事情很少,开销小,同理,一半对应轻量级锁。
在使用锁的过程中,如果锁是基于一些功能来实现的(比如调用了操作系统提供的mutex接口),此时,一般认为这里是重量级锁,(操作系统的锁会在内核中做许多事情,比如让线程阻塞等待等等) 如果锁是纯用户态实现的,此时一般认为这是轻量级锁(用户态的代码更可靠,也更高效)
4.挂起等待锁vs自旋锁
挂起等待锁:通常就是通过内核的一些机制来实现的,往往较重(重量级锁的一种典型实现)
自旋锁:往往就是通过用户态代码来实现的,往往较轻(轻量级锁的一种典型实现),
优点: 没有放弃 CPU, 不涉及线程阻塞和调度, 一旦锁被释放, 就能第一时间获取到锁.
缺点: 如果锁被其他线程持有的时间比较久, 那么就会持续的消耗 CPU 资源. (而挂起等待的时候是
不消耗 CPU 的)
5.公平锁vs非公平锁
公平锁:多个线程在等待一把锁的时候,谁先来的,谁就能获取到这个锁(遵循先来后到的原则)
非公平锁:多个线程等待一把锁的时候,不遵循先来后到原则(每个等待的线程获取到这把锁的概率都是均等的)
6.可重入锁vs不可重入锁
一个线程如果可以多次加锁,不会死锁,就是可重入锁,反之,就是不可重入锁。
看到这,我们就想到前面讲的synchronized,那他是属于什么锁呢?
synchronized
1.它既是一个乐观锁,也是一个悲观锁(根据锁竞争的激烈成都,自适应)
2.它不是读写锁,只是一个普通的互斥锁
3.它既是一个轻量级锁,也是一个重量级锁,同理,也是根据锁的竞争激烈成都来自适应
4.沁凉几所的部分基于自旋锁来实现,重量级的部分基于挂起等待锁来实现。
5.他是非公平锁
6.是可重入锁
CAS(campare and swap)
CAS要做的事情就是那寄存器中或者内存中的值,和另外一个内存中的值进行比较,如果值相同了,就把另一个寄存器或者内存中的值和当前的这个内存的进行交换
此处所谓的CAS指的是CPU提供了一个单独的CAS指令,通过这一条指令,就能完成上述操作,如此,我们知道CPU上面的指令时一条一条执行的,指令已经是不可分割的单位,这样这个指令就具有原子性,此时线程就安全了,CAS的最大意义就是让我们写这种多线程安全的代码,提供了一种全新的思路和方式。那么CAS能干些什么呢?我们下一章再来细细道来。