我要因为锁占用的例子
时间: 2023-10-17 17:05:10 浏览: 22
以下是一个简单的例子,演示了锁的占用问题:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockUsageExample {
private Lock lock = new ReentrantLock();
public void foo() {
lock.lock();
try {
System.out.println("Start foo()");
Thread.sleep(5000); // 模拟耗时操作
System.out.println("End foo()");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void bar() {
lock.lock();
try {
System.out.println("Start bar()");
Thread.sleep(5000); // 模拟耗时操作
System.out.println("End bar()");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
LockUsageExample example = new LockUsageExample();
Thread t1 = new Thread(() -> example.foo());
Thread t2 = new Thread(() -> example.bar());
t1.start();
t2.start();
t1.join();
t2.join();
}
}
```
在上面的例子中,我们定义了一个类`LockUsageExample`,它有两个方法`foo`和`bar`。这两个方法都使用了同一个锁来保证互斥性。在`main`方法中,我们创建了两个线程分别执行`foo`和`bar`方法。当两个线程同时运行时,由于它们都试图获取同一个锁,因此其中一个线程必须等待另一个线程释放锁才能执行。
如果我们运行这个程序,我们会发现它会输出以下内容:
```
Start foo()
Start bar()
End foo()
End bar()
```
这是因为当`t1`线程执行`foo`方法时,它会获取锁并执行任务,`t2`线程尝试获取锁但被阻塞。当`t1`线程执行完成并释放锁后,`t2`线程获取锁并执行任务。
然而,如果我们修改`foo`方法和`bar`方法的顺序,即交换它们的位置,程序会进入死锁状态:
```java
public static void main(String[] args) throws InterruptedException {
LockUsageExample example = new LockUsageExample();
Thread t1 = new Thread(() -> example.bar()); // 交换方法
Thread t2 = new Thread(() -> example.foo()); // 交换方法
t1.start();
t2.start();
t1.join();
t2.join();
}
```
这是因为`t1`线程获取了锁并开始执行`bar`方法,但`t2`线程也要获取锁来执行`foo`方法。由于`t1`线程没有释放锁,因此`t2`线程一直处于阻塞状态,无法执行。同时,由于`t1`线程也在等待`t2`线程释放锁,因此它也无法继续执行,整个程序就陷入了死锁状态。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)