Lock lock = new ReentrantLock(); lock.lock(); 怎么使用
时间: 2024-06-03 15:12:37 浏览: 61
Lock lock = new ReentrantLock(); // 创建可重入锁
lock.lock(); // 获取锁
try {
// 执行需要同步的代码块
} finally {
lock.unlock(); // 释放锁
}
这段代码创建了一个可重入锁,并使用 lock() 方法获取锁,然后在 try-finally 代码块中执行需要同步的代码,最后使用 unlock() 方法释放锁。这样就可以保证同一时间只有一个线程可以执行该代码块,确保线程安全。
相关问题
Lock packageLock = new ReentrantLock(); Lock wareDetailLock = new ReentrantLock(); 使用2个这样的锁是否存在问题
使用两个ReentrantLock锁是没有问题的。每个锁都是独立的,可以在不同的代码块中使用。这样可以实现对不同资源的并发控制,避免多线程竞争导致的数据不一致或者死锁等问题。
以下是使用两个ReentrantLock锁的示例代码:
```java
Lock packageLock = new ReentrantLock();
Lock wareDetailLock = new ReentrantLock();
// 线程1
packageLock.lock();
try {
// 对package进行操作
} finally {
packageLock.unlock();
}
// 线程2
wareDetailLock.lock();
try {
// 对wareDetail进行操作
} finally {
wareDetailLock.unlock();
}
```
在上述代码中,packageLock和wareDetailLock是两个独立的锁对象,分别用于对不同的资源进行加锁和解锁操作。这样可以确保在多线程环境下,对package和wareDetail资源的操作是互斥的,避免了数据竞争和并发访问的问题。
package com.company.calcul; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class Thread1 { public static void main(String[] args) { ReentrantLock reentrantLock = new ReentrantLock(); Condition condition1 = reentrantLock.newCondition(); Condition condition2 = reentrantLock.newCondition(); Condition condition3 = reentrantLock.newCondition(); Thread threadA = new Thread(() -> { reentrantLock.lock(); try { condition1.await(); System.out.println("A"); condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } }); Thread threadB = new Thread(() -> { reentrantLock.lock(); try { condition2.await(); System.out.println("B"); condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } }); Thread threadC = new Thread(() -> { reentrantLock.lock(); try { condition3.await(); System.out.println("C"); } catch (InterruptedException e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } }); reentrantLock.lock(); try { threadA.start(); threadB.start(); threadC.start(); condition1.signal(); } finally { reentrantLock.unlock(); } } } 这个为什么没有输出ABC
这段代码没有输出ABC是因为在调用condition1.signal()之前,主线程已经释放了锁。
在代码中,主线程先获取了锁reentrantLock.lock(),然后启动了线程A、B、C,并调用condition1.signal()来唤醒线程A。但是,在调用signal()方法之前,主线程调用了reentrantLock.unlock()释放了锁。
由于线程A、B、C在启动后会尝试获取锁并进入等待状态,而此时主线程已经释放了锁,线程A无法获取到锁并继续执行,所以最终没有输出ABC。
为了修正这个问题,可以将reentrantLock.lock()方法的调用位置移动到condition1.signal()之前,确保在调用signal()方法之前保持锁的持有状态。
修正后的代码如下:
```java
package com.company.calcul;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Thread1 {
public static void main(String[] args) {
ReentrantLock reentrantLock = new ReentrantLock();
Condition condition1 = reentrantLock.newCondition();
Condition condition2 = reentrantLock.newCondition();
Condition condition3 = reentrantLock.newCondition();
Thread threadA = new Thread(() -> {
reentrantLock.lock();
try {
condition1.await();
System.out.println("A");
condition2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
});
Thread threadB = new Thread(() -> {
reentrantLock.lock();
try {
condition2.await();
System.out.println("B");
condition3.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
});
Thread threadC = new Thread(() -> {
reentrantLock.lock();
try {
condition3.await();
System.out.println("C");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
});
reentrantLock.lock();
try {
threadA.start();
threadB.start();
threadC.start();
condition1.signal();
} finally {
reentrantLock.unlock();
}
}
}
```
在修正后的代码中,主线程在启动子线程之前获取锁reentrantLock.lock(),然后启动子线程并调用condition1.signal()方法唤醒线程A,最后在finally块中释放锁reentrantLock.unlock()。这样可以确保线程A在调用signal()方法之前已经获取到了锁,并且其他线程也能正确执行并输出ABC。
阅读全文