📜  共享锁和排他锁的区别(1)

📅  最后修改于: 2023-12-03 15:22:33.583000             🧑  作者: Mango

共享锁和排他锁的区别

在多线程和并发编程中,锁是一种基本的同步机制。而共享锁和排他锁则是最常用的锁类型。本文将对二者的区别进行详细介绍。

共享锁

共享锁是一种比较宽松的锁类型,多个线程可以同时持有共享锁。

在SQL中,SELECT操作会自动获取一种共享锁,也称为"读锁"。当多个事务需要同时读取同一个数据行时,它们可以同时获得共享锁,以确保读取的数据是一致的。

在Java中,也可以使用共享锁进行线程同步,可以通过ReentrantReadWriteLock类实现。具体代码如下:

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class SharedLockExample {
    private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void read() {
        lock.readLock().lock();
        try {
            // 读取数据
        } finally {
            lock.readLock().unlock();
        }
    }

    public void write() {
        lock.writeLock().lock();
        try {
            // 修改数据
        } finally {
            lock.writeLock().unlock();
        }
    }
}

在上述代码中,ReentrantReadWriteLock类提供了读写锁,读锁和写锁可以并发执行,但写锁与其他锁都互斥。

排他锁

排他锁是一种非常严格的锁类型,同时只能有一个线程持有排他锁。

在SQL中,UPDATEDELETE等操作会自动获取一种排他锁,也称为"写锁"。当一个事务需要更新或删除一个数据行时,它必须先获取排他锁,以确保数据的一致性。

在Java中,可以使用synchronized关键字实现排他锁。具体代码如下:

public class ExclusiveLockExample {
    private final Object lock = new Object();

    public void update() {
        synchronized(lock) {
            // 更新数据
        }
    }
}

在上述代码中,synchronized关键字保证了同时只能有一个线程执行update()方法。

共享锁和排他锁的区别

共享锁和排他锁有很大的区别,主要可以从以下几个方面进行比较:

  • 多线程并发性:共享锁多个线程可以同时持有,而排他锁只能由一个线程持有。
  • 写操作:共享锁可以与其他共享锁并发,但不能与排他锁并发。排他锁在写操作时会锁定所有资源,直到完成写操作。
  • 锁阻塞:共享锁会阻塞其他的排他锁,但不会阻塞其他的共享锁。排他锁在锁住资源时会阻塞所有的共享锁和排他锁。

综上所述,共享锁适合多个线程读取同一数据行的场景,而排他锁适合单个线程修改或删除某些数据的场景。在实际应用中,需要根据场景以及业务逻辑进行选择。