当前位置:实例文章 » 其他实例» [文章]分布式锁与同步锁

分布式锁与同步锁

发布人: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分布式锁,可以避免单点故障和提高可用性。

相关标签:
其他信息

其他资源

Top