11 redis中分布式锁的实现

  1. 单机锁代码
java 复制代码
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;

public class AloneLock implements Lock {
    AtomicReference<Thread> owner = new AtomicReference<>();
    //队列--存放哪些没有抢到锁的线程
    LinkedBlockingQueue<Thread> waiters = new LinkedBlockingQueue<>();
    //实现加锁
    @Override
    public void lock() {
        while (!owner.compareAndSet(null,Thread.currentThread())){
            waiters.add(Thread.currentThread());
            LockSupport.park();//让当前线程阻塞
            waiters.remove(Thread.currentThread());//解锁了,就需要把线程从等待列表中删除
        }
    }
    //实现解锁
    @Override
    public void unlock() {
        if(owner.compareAndSet(Thread.currentThread(),null)){
            for (Object  object:waiters.toArray()){
                Thread  next= (Thread) object;
                LockSupport.unpark(next);
            }
        }
    }

    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    @Override
    public boolean tryLock() {
        return false;
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }
    @Override
    public Condition newCondition() {
        return null;
    }
}
  1. 分布式锁
相关推荐
nbwenren1 分钟前
MySQL中日期和时间戳的转换:字符到DATE和TIMESTAMP的相互转换
数据库·mysql
SPC的存折10 分钟前
10、Docker容器故障排查
linux·运维·数据库·docker·容器
heRs BART18 分钟前
Redis简介、常用命令及优化
数据库·redis·缓存
NiKick39 分钟前
MySql中的事务、MySql事务详解、MySql隔离级别
数据库·mysql·adb
gmaajt1 小时前
mysql如何检查数据库表是否存在损坏_使用CHECK TABLE命令修复
jvm·数据库·python
xuefeiniao1 小时前
使用宝塔安装RabbitMQ,启动不起来
分布式·rabbitmq·ruby
heRs BART1 小时前
【Flask】四、flask连接并操作数据库
数据库·python·flask
Lucifer三思而后行1 小时前
一次 Oracle RAC 归档告警排查
数据库·oracle
zhuiyisuifeng1 小时前
PostgreSQL常用时间函数与时间计算提取示例说明
数据库·postgresql
wellc1 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql