1.1悲观锁与乐观锁
数据库中引入的名词,但是并发包里引用了类似的思想。
悲观锁直对数据被外界袖肥保持保守态度。认为数据很容易被其他线程修改,所以修改前加锁。在整个数据处理过程中处于锁定状态。悲观锁的实现依靠数据库的锁机制,在对数据库记录修改之前进行加排它锁。如果获取锁失败,说明数据被其他线程修改,当前线程则等待或跑出异常。
乐观锁是相对于悲观锁来说,认为数据一般不会造成冲突,所以访问记录时不会加排它锁,而是在进行数据更新时,才会对数据进行冲突检测。
1.2公平锁与非公平锁
根据线程的抢占机制,锁可以分为公平锁和非公平锁,公平锁表示线程获取锁的顺序是按照线程请求锁的时间早晚来的,也就是说最早请求锁的线程将最早获取到锁。而非公平锁则在运行时闯入,也就是说不一定先来先得。
1.3独占锁和共享锁
根据锁只能被单个线程和多个线程共同持有,锁可以分为独占锁和共享锁。独占锁保证只有一个线程持有,ReentrantLock就是以独占锁的实现方式实现的。共享锁则可以同时由多个线程持有,例如ReadWriteLock读写锁,它允许一个资源可以为多个线程同时进行读写操作。
独占锁是一种悲观锁,由于每次访问资源都先加上互斥锁,限制了并发性,因为读操作不会影响数据的一致性。共享锁是乐观锁,它放宽了加锁条件,允许多个线程同时进行读操作。