分布式锁与同步锁
发布人:shili8
发布时间:2024-12-23 01:04
阅读次数:0
**分布式锁与同步锁**
在多线程或多进程环境中,共享资源的访问控制是一个重要的问题。为了避免数据竞争和保证程序的正确性,我们需要使用锁机制来保护共享资源。在本文中,我们将讨论分布式锁和同步锁两种常见的锁机制。
**1.什么是同步锁**
同步锁(Synchronized Lock)是一种传统的锁机制,用于保护共享资源在多线程环境下的一致性。它通过使用内置的锁对象来实现,这个锁对象可以被多个线程共享,但只有一个线程可以持有这个锁。
**1.1什么是ReentrantLock**
ReentrantLock是一种可重入(Reentrant)的锁,它允许同一线程在不释放锁的情况下,重新获得该锁。这种设计使得ReentrantLock比传统的synchronized锁更灵活和高效。
**示例代码**
javaimport java.util.concurrent.locks.ReentrantLock; public class SynchronizedExample { private final Object lock = new Object(); public void synchronizedMethod() { // 获取锁 synchronized (lock) { System.out.println("线程" + Thread.currentThread().getName() + "正在执行..."); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("线程" + Thread.currentThread().getName() + "完成!"); } } public void reentrantLockMethod() { ReentrantLock lock = new ReentrantLock(); // 获取锁 lock.lock(); try { System.out.println("线程" + Thread.currentThread().getName() + "正在执行..."); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("线程" + Thread.currentThread().getName() + "完成!"); } finally { //释放锁 lock.unlock(); } } public static void main(String[] args) { SynchronizedExample example = new SynchronizedExample(); // 使用synchronized方法 Thread thread1 = new Thread(example::synchronizedMethod); Thread thread2 = new Thread(example::synchronizedMethod); thread1.start(); thread2.start(); // 使用ReentrantLock方法 Thread thread3 = new Thread(example::reentrantLockMethod); Thread thread4 = new Thread(example::reentrantLockMethod); thread3.start(); thread4.start(); } }
**2.什么是分布式锁**
分布式锁(Distributed Lock)是一种用于保护共享资源在多进程或多机器环境下的一致性。它通过使用分布式存储系统来实现,这样可以避免单点故障和提高可用性。
**2.1什么是Redis分布式锁**
Redis分布式锁是一种基于Redis的分布式锁机制,利用Redis的原子性操作特性来实现锁的获取和释放。这种设计使得Redis分布式锁比传统的synchronized锁更高效和可靠。
**示例代码**
javaimport redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class RedisDistributedLockExample { private final JedisPool jedisPool = new JedisPool(); public void distributedLockMethod() { // 获取Redis连接 Jedis jedis = jedisPool.getResource(); try { // 设置锁的key和值 String lockKey = "distributed_lock"; String lockValue = "lock_value"; // 检查是否已经持有锁 if (jedis.setnx(lockKey, lockValue) ==1) { System.out.println("线程" + Thread.currentThread().getName() + "获得了分布式锁!"); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } System.out.println("线程" + Thread.currentThread().getName() + "完成!"); } else { System.out.println("线程" + Thread.currentThread().getName() + "已经获得了分布式锁!"); } } finally { //释放Redis连接 jedis.close(); } } public static void main(String[] args) { RedisDistributedLockExample example = new RedisDistributedLockExample(); // 使用分布式锁方法 Thread thread1 = new Thread(example::distributedLockMethod); Thread thread2 = new Thread(example::distributedLockMethod); thread1.start(); thread2.start(); } }
**总结**
在本文中,我们讨论了同步锁和分布式锁两种常见的锁机制。通过使用synchronized方法和ReentrantLock类,可以实现线程安全的共享资源访问控制。在多进程或多机器环境下,分布式锁可以提供更高效和可靠的锁机制。通过使用Redis分布式锁,可以避免单点故障和提高可用性。