1、自旋锁
线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁切换上下文不值得。jvm使线程在没有获得锁的时候,执行空循环,循环几次之后,如果还没获得锁,再被挂起。
2、阻塞锁
改变了线程的运行状态,让线程进入阻塞状态进行等待,当获得相应的信号(唤醒或者时间)时,才可以进去线程的准备就绪状态,转为就绪状态的所有线程,通过竞争,进去运行状态。
3、重入锁
支持线程再次进入的锁。
4、读写锁
两把锁,读锁和写锁,写写互斥、读写互斥、读读共享
5、互斥锁
同一时刻,只能有一个线程进入。
6、悲观锁
总是假设最坏的情况,每次拿数据的时候都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会被阻塞知道它拿到锁。synchronized是悲观锁。
7、乐观锁
每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,使用版本号等机制。mysql乐观锁,使用version标记。
8、公平锁
大家都排队。
9、非公平锁
一部分人排队,新来的可能会插队。
10、偏向锁
一直持有锁,等到竞争出现才释放锁的机制,当其他线程尝试竞争偏向锁机制时,持有偏向锁的线程才会释放锁。
11、独占锁
每次只有一个线程能持有锁,与互斥锁一样
12、共享锁
允许多个线程同时获取锁,并发访问,共享资源。读锁。