synchronized和ReentrantLock的实 现描述、代码案例、
时间: 2023-11-30 10:04:50 浏览: 31
synchronized和ReentrantLock都是Java中用于实现线程同步的机制。它们的目的是为了保证多个线程之间的并发访问共享资源时的安全性。
1. synchronized:
synchronized是Java语言内置的关键字,可以用于方法或代码块上。它采用的是独占锁(也称为互斥锁)的机制,即同一时间只允许一个线程访问被synchronized保护的代码块或方法。
实现描述:
当一个线程进入synchronized代码块时,会尝试获取锁。如果锁没有被其他线程占用,则获取锁成功,该线程可以执行代码块中的逻辑。当线程执行完代码块后,会释放锁,以供其他线程获取。
代码案例:
```java
public class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public static void main(String[] args) {
SynchronizedExample example = new SynchronizedExample();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
example.increment();
}
}).start();
}
// 等待所有线程执行完毕
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(example.count); // 输出结果为10000
}
}
```
2. ReentrantLock:
ReentrantLock是Java.util.concurrent包下的类,它也提供了独占锁的机制,与synchronized相比,ReentrantLock提供了更高的灵活性和扩展性。
实现描述:
ReentrantLock使用的是显示锁(也称为可重入锁)的机制,它允许线程在获取锁之后再次获取同一个锁,并且支持将锁的获取与释放分开控制。
代码案例:
```java
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockExample {
private int count = 0;
private ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
ReentrantLockExample example = new ReentrantLockExample();
for (int i = 0; i < 10; i++) {
new Thread(() -> {
for (int j = 0; j < 1000; j++) {
example.increment();
}
}).start();
}
// 等待所有线程执行完毕
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(example.count); // 输出结果为10000
}
}
```
以上是synchronized和ReentrantLock的基本实现描述和代码案例。两者都可以保证多个线程对共享资源的安全访问,但ReentrantLock提供了更多的灵活性和扩展性,适用于更复杂的场景。