可重入锁与非可重入锁
可重入锁是指一个线程的外层代码在获取锁的时候,再进入该线程内层代码自动获取该锁,Java中ReentrantLock和Synchronized都是可重入锁,可重入锁在一定程度上可避免死锁。
非可重入锁反之。
线程在尝试获取一个锁的时候,可重入锁会先获取status的值,若status == 0,表示没被其他线程获得该锁,则status = 1;若status!= 0,判断当前线程是否已经获取到这个锁,若已获取到该所,则status = status+1,
且该线程可再次获取该所。 非可重入锁先获得status的值,若status != 0,则不可获得该锁。
线程释放非可重入锁时,若status - 1 == 0,才会真正释放可重入锁,否则只是status-1;非可重入锁释放锁时,status置零,然后释放该锁。