java 锁定 某属性写加锁,读不加锁
时间: 2024-02-28 16:55:08 浏览: 30
在 Java 中,如果只需要对某个属性的写操作进行加锁,而对读操作不加锁,可以使用 `ReadWriteLock` 接口和 `ReentrantReadWriteLock` 类来实现。
具体实现方式为,创建一个 `ReentrantReadWriteLock` 对象,然后使用 `writeLock()` 方法获取写锁,使用 `readLock()` 方法获取读锁。在写操作时,使用写锁进行加锁;在读操作时,则使用读锁进行加锁。
例如:
```java
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyClass {
private int myProperty;
private final ReadWriteLock lock = new ReentrantReadWriteLock();
public void setMyProperty(int value) {
lock.writeLock().lock();
try {
this.myProperty = value;
} finally {
lock.writeLock().unlock();
}
}
public int getMyProperty() {
lock.readLock().lock();
try {
return this.myProperty;
} finally {
lock.readLock().unlock();
}
}
}
```
在这个例子中,创建了一个 `ReentrantReadWriteLock` 对象 `lock`,并在 `setMyProperty` 方法中使用写锁,即调用 `lock.writeLock().lock()` 进行加锁,然后在 `finally` 块中调用 `lock.writeLock().unlock()` 进行解锁。在 `getMyProperty` 方法中使用读锁,即调用 `lock.readLock().lock()` 进行加锁,然后在 `finally` 块中调用 `lock.readLock().unlock()` 进行解锁。
这样,在写操作时会阻塞其他线程的写操作和读操作,但不会阻塞其他线程的读操作;而在读操作时,不会阻塞其他线程的读操作,但会阻塞其他线程的写操作。这种方式可以提高程序的并发性能。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.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)