Java中一共有几种锁?

在Java开发中,锁是一种用于保护共享资源的机制。使用锁可以控制对共享资源的访问,保证同一时间只有一个线程可以对资源进行操作,从而避免并发访问带来的问题,例如数据不一致、竞态条件等。在Java中,有多种类型的锁可供选择,每种类型的锁都有其特定的用途和应用场景。本文将介绍Java中的几种常见的锁,并提供相应的代码示例。

1. synchronized关键字锁

synchronized关键字是Java中最常用的锁机制之一,它可以用来修饰方法或代码块。使用synchronized关键字修饰的方法或代码块在同一时间只能被一个线程执行,其他线程需要等待。下面是使用synchronized关键字修饰方法的示例代码:

public synchronized void synchronizedMethod() {
    // 代码块
}

2. ReentrantLock锁

ReentrantLock是Java.util.concurrent包提供的另一种锁机制,它提供了与synchronized关键字类似的功能,但具备更高的灵活性。ReentrantLock提供了可重入的特性,即同一个线程可以多次获得同一个锁。下面是使用ReentrantLock锁的示例代码:

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockExample {
    private ReentrantLock lock = new ReentrantLock();

    public void lockedMethod() {
        lock.lock();
        try {
            // 代码块
        } finally {
            lock.unlock();
        }
    }
}

3. ReadWriteLock读写锁

ReadWriteLock是一种特殊的锁机制,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。ReadWriteLock分为读锁和写锁两种,读锁是共享锁,写锁是独占锁。下面是使用ReadWriteLock读写锁的示例代码:

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class ReadWriteLockExample {
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void readMethod() {
        lock.readLock().lock();
        try {
            // 读取共享资源的代码
        } finally {
            lock.readLock().unlock();
        }
    }

    public void writeMethod() {
        lock.writeLock().lock();
        try {
            // 写入共享资源的代码
        } finally {
            lock.writeLock().unlock();
        }
    }
}

4. StampedLock锁

StampedLock是Java 8中引入的一种新型锁机制,它提供了一种乐观读的机制,可以提高读操作的性能。StampedLock使用了版本号的概念,每次读操作都会获得一个版本号,如果读操作完成后发现版本号发生变化,表示有写操作修改了共享资源,需要重新读取。下面是使用StampedLock锁的示例代码:

import java.util.concurrent.locks.StampedLock;

public class StampedLockExample {
    private StampedLock lock = new StampedLock();
    private int value;

    public void writeMethod(int newValue) {
        long stamp = lock.writeLock();
        try {
            value = newValue;
        } finally {
            lock.unlockWrite(stamp);
        }
    }

    public int readMethod() {
        long stamp = lock.tryOptimisticRead();
        int currentValue = value;
        if (!lock.validate(stamp)) {
            stamp = lock.readLock();
            try {
                currentValue = value;
            } finally {
                lock.unlockRead(stamp);
            }
        }
        return currentValue;
    }
}

5. Condition条件锁

Condition是Java中一种高级的锁机制,它可以让线程在特定条件下等待或唤醒。Condition需要和Lock一起使用,通过Condition可以实现线程的精确控制,例如让某个线程等待某个条件满足后再执行。下面是使用Condition条件锁的示例代码:

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionExample {
    private Lock lock = new ReentrantLock();
    private