概念简述
重入锁简单点说就是一个线程可以重复拥有同一把锁,如下代码示例
public class TestReetrantLock {
/*创建锁*/
private static Lock lock = new ReentrantLock();
public static void test() {
/*第一次获取锁*/
lock.lock();
for (int i = 0; i < 10; i++) {
/*第二次获取锁*/
lock.lock();
System.out.println(i);
/*第一次释放锁*/
lock.unlock();
}
/*第二次释放锁*/
lock.unlock();
}
/*测试*/
public static void main(String[] args) {
for (int i = 0; i < 2;i++){
new Thread(new Runnable() {
public void run() {
test();
}
}).start();
}
}
}哪些是重入锁
①关键字synchronized
②ReentrantLock
特点
线程获取多少次锁,那么就需要释放多少次锁,否则锁未释放,导致线程阻塞。
如下代码所示
public class TestReetrantLock {
/*创建锁*/
private static Lock lock = new ReentrantLock();
public static void test() {
/*第一次获取锁*/
lock.lock();
for (int i = 0; i < 10; i++) {
/*第二次获取锁*/
lock.lock();
System.out.println(i);
/*不对第二把锁进行释放*/
// lock.unlock();
}
/*第二次释放锁*/
lock.unlock();
}
/*测试*/
public static void main(String[] args) {
for (int i = 0; i < 2;i++){
new Thread(new Runnable() {
public void run() {
test();
}
}).start();
}
}
}执行结果会导致线程阻塞。
总结
在线程多次使用同一把锁的时候,如果使用的关键字synchronized,则不用各位理会,锁机制交给了jvm去管理,但是如果是使用的ReentrantLock那么一定注意释放锁。
318

被折叠的 条评论
为什么被折叠?



