java 有哪些锁
Java 中的锁可以分为几种不同的类型,每种锁都有其特定的用途和使用场景。以下是一些常见的锁类型:
1. **synchronized 关键字**:
- 这是 Java 中最基本的同步机制,可以用来同步线程对共享资源的访问。
2. **ReentrantLock(可重入锁)**:
- `java.util.concurrent.locks.ReentrantLock` 提供了一种比 `synchronized` 更灵活的锁定机制,支持尝试非阻塞获取锁、可中断的锁获取、超时获取锁以及公平性(按照线程请求锁的顺序来获取锁)。
3. **ReadWriteLock(读写锁)**:
- `java.util.concurrent.locks.ReadWriteLock` 允许多个线程同时读取同一资源,但在写入时需要独占访问。
要注意写线程饥饿问题,可以通过公平锁解决,但是会降低性能。所以在jdk1.8引入了StampedLock
读写锁在读写分离数据库架构中保证了数据的一致性。
4. **StampedLock**:
- 一个相对于 `ReadWriteLock` 的改进版本,提供了乐观读锁和悲观写锁,可以减少锁争用。
StampedLock是不可重入锁
5. **CountDownLatch(倒计时锁)**:
- 允许一个或多个线程等待一组操作在其他线程中完成。
public class TestCountDownLatch {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
CountDownLatch countDownLatch = new CountDownLatch(5);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
System.out.println("游戏5秒后开始执行");
lock.notifyAll();
lock.wait();
countDownLatch.await();
System.out.println("游戏正式开始。。。。。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
System.out.println("-------------------");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 5; i &

浙公网安备 33010602011771号