锁从乐观和悲观的角度可分为乐观锁和悲观锁,
从获取资源的公平性角度可分为公平锁和非公平锁,
从是否共享资源的角度可分为共享锁和独占锁
1.乐观锁
认为每次读取数据时都认为别人不会修改该数据,所以不会上锁
但在更新时会判断在此期间别人有没有更新该数据
比较当前版本号与上一次的版本号,如果版本号一致,则更新,如果版本号不一致,则重复进行读、比较、写操作。
2.悲观锁
认为每次读取数据时都认为别人会修改数据,所以每次在读写数据时都会上锁,这样别人想读写这个数据时就会阻塞、等待直到拿到锁。
synchronized属于悲观锁
3.公平锁和非公平锁
公平锁指锁的分配和竞争机制是公平的,即遵循先到先得原则。非公平锁指JVM遵循随机、就近原则分配锁的机制。
非公平锁虽然放弃了锁的公平性,但是执行效率明显高于公平锁。如果系统没有特殊的要求,一般情况下建议使用非公平锁。
4.共享锁和独占锁
独占锁:也叫互斥锁,每次只允许一个线程持有该锁,ReentrantLock为独占锁的实现。
共享锁:允许多个线程同时获取该锁,并发访问共享资源。ReentrantReadWriteLock中的读锁为共享锁的实现。