悲观锁
乐观锁
公平锁
非公平锁
独占锁
共享锁
可重入锁
自旋锁
1. 悲观锁
悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其余线程修改,因此在数据被处理前先对数据进行加锁,
并在整个数据处理过程当中,使数据处于锁定状态。
悲观锁主要分为共享锁和排他锁
1. 共享锁【Shared lock】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据能够共享一把锁,
都能访问到数据,可是只能读不能修改。
2. 排他锁【Exclusive lock】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其余锁并存,
若是一个事务获取了一个数据行的排他锁,其余事务就不能再获取该行的其余锁,包括共享锁和排他锁,
可是获取排他锁的事务是能够对数据行读取和修改。
例如:java中的synchronized关键字、接口Lock的实现类、mysql的select...for update等
2. 乐观锁
乐观锁是相对悲观锁来讲的,它认为数据在通常状况下不会形成冲突,因此在访问记录前不会加排它锁,
而是在进行数据提交更新时,才会正式对数据冲突与否进行检测。
例如:使用数据版本(Version++)记录机制实现、使用时间戳、java中Atomic的CAS等
3. 公平锁
公平锁表示线程获取锁的顺序是按照线程请求锁的时间迟早来决定的,也就是最先请求锁的线程将最先获取到锁
例如:ReentrantLock pairLock = new ReentrantLock(true);
4. 非公平锁
非公平锁表示线程获取锁的顺序不必定是先到先得。
例如:ReentrantLock unpairLock = new ReentrantLock(false)。若是构造函数不传递参数,则默认是非公平锁。
5. 独占锁
独占锁是任什么时候候都只有一个线程能获得锁。
例如:Java的ReentrantLock
6. 共享锁
共享锁是能够同时由多个线程持有,它容许一个资源能够被多线程同时进行读操做。
例如:ReentrantReadWriteLock的读锁
7. 可重入锁
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。原理是在锁内部维护一个线程标示,用来标示该锁目前被哪一个线程占用,而后关联一个计数器。一开始计数器值为0,说明该锁没有被任何线程占用。当一个线程获取了该锁时,计数器的值会变成1,这时其余线程再来获取该锁时会发现锁的全部者不是本身而被阻塞挂起。
例如:
public sychrnozied void test() {
xxxxxx;
test2();
}
public sychronized void test2() {
yyyyy;
}
8. 自旋锁
自旋锁是线程获取锁的时候,若是锁被其余线程持有,则当前线程将循环等待,直到获取到锁。