- 乐观锁和悲观锁:
乐观锁指每次使用一个数据的时候都假设没有其他线程对其进行操作,只有在要修改数据的时候,java中采用CAS(compare and swap)原理来进行更新数据,先把数据放在内存中,然后将内存中的数据与现在的数据进行比较,如果数据没有被修改,则将自己要修改的新的值付给数据。优点是比较快,缺点是ABA,即数据是A被修改为B又被修改为A,这时候去比较,CAS会认为数据没有被更改,解决办法可以加上版本号。
悲观锁指的是,每次对数据进行任何操作,都需要加锁,禁止其他线程对数据进行的任何操作,比较耗时,但是相对比较安全
- 公平锁和非公平锁:
公平锁指的是大家都排队,先来的先获取锁,底层实现是线程在获取锁之前,判断自己是不是队列的第一个,如果是才能获取锁。
非公平锁指的是,如果有人来获取锁的时候,使用锁的上一个用户刚刚释放掉锁,这个人就可以直接将锁拿走,而不需要排队,如果时间不巧的是,锁正被使用,这个人就去队尾去排队
- 独享锁和共享锁:
如果一个线程对数据A加了独享锁,则其他线程不能再对数据A加任何形式的锁了。一般写锁就是独享锁,在写锁定的时候,不可以加读锁和写锁。
共享锁是很多个线程都可以对同一份数据加共享锁,但是一旦这份数据已经有共享锁了,就不能有其他线程对这份数据加独享锁了,一般读锁就是共享锁。
- 可重入锁和非可重入锁:
函数A需要调用函数B,他俩同时需要同一个锁,如果是可重入锁,当A锁住了之后,B还能获取该锁,而如果是非可重入锁,程序将会死锁,因为B永远也获取不到A持有的锁。