1.悲观锁
采取一种悲观的态度,默认只要有操作都是会对当前状态进行修改的,所以无一例外都先加锁。
2.乐观锁
采取一种乐观的态度,一般情况下认为大部分情况是不进行修改操作的,但是最终会判断当前是否做了修改,如果不一致就进行加锁操作。
3.自旋锁
自旋锁实际上是一种乐观锁的实现,通过CAS原理来进行相应操作,在对当前状态做完操作时,对原有状态做保存,修改前会比较再读取到的值是否和我保存的值一致,一致就更新,结束操作;不一致,继续重新自旋,比较交换,直到成功为止。
如果存在 ABA问题(是指状态值在并发时从0-8-0的问题),可以通过加版本号解决。
4.读写锁
读锁:允许其他线程并发读,但阻塞其他线程的写操作。
写锁:在进行操作时,除了不允许其他线程进行写操作,也不允许其他线程读操作。
5.排它锁&共享锁
排它锁:只允许一个线程访问代码。
共享锁:可以允许多个线程访问代码。
6.统一锁
大粒度的锁,解决死锁的场景。
7.分段锁
小粒度的锁(经典实现:jdk1.7的ConcurrentHashMap的实现)。