Java并发问题:线程同步死锁示例
在Java中,线程同步和死锁是两个重要的并发概念。下面是一个简单的死锁示例:
```java
// 定义资源(锁)
Lock lock1 = new ReentrantLock();
Lock lock2 = new ReentrantLock();
// 两个线程,各自获取一个锁
Thread thread1 = new Thread(() -> {
try {
// 获取lock1
lock1.lock();
System.out.println(“Thread 1 locked resource 1”);
// 延迟释放lock1,以便等待资源2
Thread.sleep(500);
// 获取lock2
lock2.lock();
System.out.println("Thread 1 locked resource 2");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 无论是否成功获取资源,都需要释放锁
try {
lock1.unlock();
lock2.unlock();
} catch (Exception e) {
e.printStackTrace();
}
}
}));
Thread thread2 = new Thread(() -> {
try {
// 获取lock2
lock2.lock();
System.out.println(“Thread 2 locked resource 2”);
// 延迟释放lock2,以便等待资源1
Thread.sleep(500);
// 获取lock1
lock1.lock();
System.out.println("Thread 2 locked resource 1");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 无论是否成功获取资源,都需要释放锁
try {
lock1.unlock();
lock2.unlock();
} catch (Exception e) {
e.printStackTrace();
}
}
}));
// 启动线程
thread1.start();
thread2.start();
// 注意这里可能会发生死锁,因为两个线程都试图先获取资源2再获取资源1。
// 如果资源2的获得依赖于资源1的拥有,而资源1的获得又依赖于资源2的拥有,
// 这就形成了”环状等待”,即每个线程都在等待对方释放资源,从而导致死锁。
在实际编程中,要避免这种情况的发生,通常需要使用一些线程同步机制,如synchronized
关键字、Lock
接口等。
还没有评论,来说两句吧...