可重入锁与不可重入锁
简单点理解
- 可重入锁:如果同一个线程加两把锁,不会出现问题的叫 可重入锁;
- 不可重入锁:而会出现问题的叫 不可重入锁。
正常情况下,线程 A 加了锁 1,然后又要加锁 2,但是线程 A 要加锁 2 就必须释放锁 1,但是释放锁 1 就达不到沃目的(目的是加锁 1 和 锁 2),因此这里就出现了矛盾,也就是传说中的死锁。
在 Java 中,synchronized 是可重入锁,synchronized
中有一个变量记录了锁的数量,也就是说每当一个线程加一个锁,那么这个变量++,如果释放了一个锁,那么变量- -,当这个变量为 0 的时候,最开始的锁就释放了。 而并不是真的给这个线程加锁了。