synchronized锁重入
时间: 2023-11-14 10:27:50 浏览: 41
synchronized关键字在Java中用于实现线程同步,保证多个线程对共享资源的安全访问。锁重入(也称为可重入锁)是指同一个线程可以多次获取同一个锁而不会造成死锁。
当线程获取到一个对象的锁后,该线程可以再次获取同一个锁而不会被阻塞,这就是锁的重入。每次重入锁时,锁的持有计数器会递增,每次释放锁时,计数器递减。只有当计数器为0时,锁才会完全释放。
这种机制使得线程可以在同一个锁上执行递归调用或者嵌套调用,而不会产生死锁。在Java中,synchronized关键字就具备了锁重入的特性。
下面是一个简单的示例代码:
```java
public class SynchronizedExample {
public synchronized void outer() {
inner();
}
public synchronized void inner() {
// do something
}
}
```
在上述代码中,`outer()`方法和`inner()`方法都使用了`synchronized`关键字修饰。当一个线程调用`outer()`方法时,会获取到该对象的锁,并且可以直接调用`inner()`方法而不会被阻塞,因为锁是可重入的。
需要注意的是,在使用`synchronized`关键字时,要确保锁定的对象是同一个,否则无法实现锁重入。
相关问题
synchronized 可重入锁
synchronized 是 Java 中的关键字,用于实现线程的同步,防止多个线程同时访问共享资源造成数据的不一致。可重入锁也是一种实现线程同步的机制,它允许同一个线程多次获得同一把锁。在 Java 中,synchronized 是一种可重入锁。
当一个线程多次执行 synchronized 代码块时,它会多次获得同一把锁,这就是 synchronized 可重入锁的特点。这种机制可以避免死锁的发生,因为同一个线程在多次获取锁时,不会将自己阻塞。
例如:
```
public synchronized void methodA() {
System.out.println("methodA start");
methodB();
System.out.println("methodA end");
}
public synchronized void methodB() {
System.out.println("methodB start");
// do something
System.out.println("methodB end");
}
```
在上面的代码中,当一个线程执行 methodA() 方法时,它会先获得 methodA() 方法所在的对象的锁,然后调用 methodB() 方法,此时它会再次获得同一把锁,然后执行 methodB() 方法中的代码。最后,它会释放锁并执行 methodA() 方法中剩余的代码。这个过程中,同一个线程多次获得同一把锁,但是不会发生死锁。
synchronized可重入锁原理
synchronized 是 Java 中用于实现线程同步的关键字,可以用来修饰方法或代码块。当 synchronized 关键字修饰的方法或代码块被执行时,会获取对象的锁,从而确保同一时刻只有一个线程可以执行该方法或代码块。
在 Java 中,每个对象都有一个与之关联的锁,也称为监视器锁或内部锁。当线程要访问 synchronized 方法或代码块时,需要先获得该对象的锁。如果该锁已经被其他线程持有,则当前线程会被阻塞,直到该锁被释放。
synchronized 关键字的重入机制指的是,一个线程在持有一个对象的锁时,可以再次获取该对象的锁,而不会导致死锁或其他异常情况。这种机制可以避免在同一线程中重复获取锁时出现问题。
总之,synchronized 关键字可以保证线程同步,避免多个线程同时访问共享资源而导致的问题。同时,它还提供了重入机制,确保在同一线程中多次获取锁时不会出现异常。