不可重入锁案例
时间: 2023-12-15 21:06:22 浏览: 29
不可重入锁(Non-Reentrant Lock)是一种不能被同一个线程多次获取的锁。如果一个线程在持有这个锁时尝试再次获取该锁,那么该线程就会被阻塞,直到该锁被释放。下面是一个不可重入锁的例子:
```java
public class NonReentrantLock {
private boolean isLocked = false;
public synchronized void lock() throws InterruptedException {
while (isLocked) {
wait();
}
isLocked = true;
}
public synchronized void unlock() {
isLocked = false;
notify();
}
}
```
在上面的例子中,我们使用 synchronized 关键字来实现锁。如果一个线程在持有锁时再次尝试获取这个锁,它会在 while 循环中一直等待,直到锁被释放。这种实现方式是不可重入的,因为一个线程在持有锁时不能再次获取该锁,否则会导致死锁。
相关问题
不可冲入锁案例
以下是一个使用不可重入锁的简单案例:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class PrintJob {
private final Lock lock = new ReentrantLock(false);
public void print() {
lock.lock();
try {
System.out.println("Printing...");
} finally {
lock.unlock();
}
}
}
```
在这个案例中,PrintJob 类使用了 ReentrantLock 类来实现不可重入锁。print() 方法需要获取锁才能执行打印操作,而且该锁是不可重入的。也就是说,如果在 print() 方法中再次调用该方法,就会出现死锁的情况。因此,不可重入锁通常用于保护临界区,防止同一个线程多次进入该区域。
Redission 同步锁案例
Redisson 是一个基于 Redis 的 Java 类库,它提供了分布式锁、分布式集合、分布式对象等多种分布式数据结构和服务,方便 Java 开发者使用 Redis 实现分布式场景。
下面是一个使用 Redisson 分布式锁的示例:
```java
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonLockExample {
public static void main(String[] args) {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
RedissonClient redisson = Redisson.create(config);
RLock lock = redisson.getLock("mylock");
try {
lock.lock();
// 这里是需要同步执行的代码
} finally {
lock.unlock();
}
redisson.shutdown();
}
}
```
在这个示例中,我们首先创建一个 Redisson 客户端,然后获取一个名为 "mylock" 的分布式锁。接着,在 try 块中调用 lock() 方法来获取锁,然后执行需要同步执行的代码。最后,在 finally 块中调用 unlock() 方法来释放锁。
需要注意的是,Redisson 支持可重入锁和公平锁,可以根据不同的需求选择不同的锁类型。
总之,Redisson 提供了方便易用的分布式锁服务,可以帮助我们在分布式场景下实现同步锁功能。