说说java中常用的锁
时间: 2024-08-15 20:05:38 浏览: 46
Java 中常用的锁主要分为两大类:内置锁和自定义锁。
### 1. 内置锁
#### **synchronized关键字**
`synchronized`是最常见的锁机制之一,在 Java 中它主要用于线程同步,允许对共享资源访问的并发控制。它可以应用于方法级别(通过 `synchronized (object) {}`)或代码块级别(通过 `synchronized (lockObject) { ... }`)。当一个线程进入一个 synchronized 代码块时,其他试图在同一对象上调用 synchronized 的线程会被阻塞,直到当前线程完成对该代码块的访问。这种方法简单直观,易于理解,但也可能导致一些性能问题,特别是对于高并发情况下的大量锁竞争。
#### **ReentrantLock**
`ReentrantLock`是一个非公平锁,意味着当有多个线程等待获取锁时,会按照线程的等待顺序依次释放锁。其优点在于可以通过 `tryLock()` 来尝试立即获取锁而不阻塞,同时支持公平性和非公平性策略。这意味着在非公平模式下,如果有一个线程正在等待获取锁,则新到达的线程需要排队等待。这使得 ReentrantLock 更适合于需要精确控制锁等待队列的应用场景。
### 2. 自定义锁
**自定义锁(Custom Lock)**
有时,开发者需要基于特定的场景定制锁的行为。这种情况下,可以设计和实现自己的锁类,以满足特定的性能、互斥性和并发控制需求。例如,可以在某些应用中使用基于信号量的自定义锁来控制并发执行的数量,或者基于原子变量的自定义锁来实现轻量级的同步。
### 示例代码
以下是使用 `ReentrantLock` 的一个例子:
```java
import java.util.concurrent.locks.ReentrantLock;
public class CustomCounter {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;
public void increment() {
lock.lock(); // 获取锁
try {
count++;
} finally {
lock.unlock(); // 释放锁
}
}
public int getCount() {
lock.lock(); // 获取锁
try {
return count;
} finally {
lock.unlock(); // 释放锁
}
}
}
```
在这个例子中,我们使用了一个 `ReentrantLock` 来保证线程安全地对共享计数器的操作。
---
相关问题:
1. 在哪些场景下选择使用 `synchronized` 或者 `ReentrantLock` 更合适?
2. 自定义锁的主要优势是什么?何时需要自定义锁?
3. 解释一下 Java 并发库中 `ReadWriteLock` 和 `Semaphore` 分别是如何使用的?
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![md](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)