实现原理

Java Lock底层是用 AQS + Cas + LockSupport实现的。

  • 思路
  • 使用原子类 AtomicInteger 定义锁的状态
  • 当一个线程修改状态之后,其他线程都处于等待状态
  • 当线程释放锁之后,其他线程被唤醒,重新竞争锁资源

核心代码


import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.LockSupport;public class CustomLock {// 0 上锁 1 释放锁private AtomicInteger lockState = new AtomicInteger(0);// 当前获得锁的线程private Thread getLockThread = null;// 阻塞线程队列private ConcurrentLinkedDeque<Thread> threadList = new ConcurrentLinkedDeque();public void lock(){acquire();}public boolean acquire(){for(;;) {if(compareAndSet(0, 1)) {// 获取锁成功getLockThread = Thread.currentThread();return true;}// 获取锁失败Thread thread = Thread.currentThread();threadList.add(thread);LockSupport.park();}}public boolean compareAndSet(int expect, int update){return lockState.compareAndSet(expect, update);}public boolean unLock(){if(getLockThread == null) {return false;}if(Thread.currentThread() == getLockThread) {boolean result = compareAndSet(1, 0);if(result) {// 公平锁唤醒Thread first = threadList.getFirst();LockSupport.unpark(first);// 非公平锁// 非公平锁的唤醒需要 使用循环把列表中的所有的 线程全部唤醒}return true;}return false;}
}

测试demo

 public static void main(String[] args) throws InterruptedException {CustomLock customLock = new CustomLock();customLock.lock();new Thread(() -> {System.out.println("start");customLock.lock();System.out.println("end");}).start();Thread.sleep(1000);customLock.unLock();System.out.println("hhh");}

java自定义lock锁相关推荐

  1. java中Lock锁的应用简介

    java中Lock锁的应用简介 整体描述 方法介绍 1. void lock() 2. boolean tryLock() 3. boolean tryLock(long timeout, TimeU ...

  2. java:lock锁

    synchronized锁效率比较低,不方便扩展,不能自定义.于是从jdk1.5之后,就引入了lock锁. lock可以手动上锁,手动释放锁,灵活性很高. Lock lock = new Reentr ...

  3. Java并发编程—JUC的Lock锁

    一.Lock (JUC锁) JUC 锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器. CountDownLatch,CyclicB ...

  4. 【java线程】锁机制:synchronized、Lock、Condition

    [Java线程]锁机制:synchronized.Lock.Condition 原创 2013年08月14日 17:15:55 标签:Java /多线程 74967 http://www.infoq. ...

  5. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  6. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...

  7. java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁

    jdk1.5后出现的 两个方法: void Lock() void unlock() 使用步骤: 1.在成员位置创建一个ReentrantLock对象 2.在可能出现安全问题的代码前调用Lock接口中 ...

  8. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  9. java并发,同步synchronize和lock锁的使用方法和注意,死锁案例分析

    1.什么是线程安全问题 多个线程同时共享同一个全局变量或者静态变量的时候,某个线程的写操作,可能会影响到其他线程操作这个变量.所有线程读一个变量不会产生线程安全问题. 实际场景就是火车站买票问题:剩余 ...

最新文章

  1. AR独角兽的死亡教训:融资3亿美元后,成投资人提线木偶,营销大于产品技术...
  2. 编程之美 2.4 1的数目
  3. WinForm应用只运行一次
  4. python selenium 元素定位_python3+selenium入门04-元素定位
  5. 如何出色的研究 RGSS3 (三) 形式的调整的细节
  6. ThreadPoolExecutor线程池详解
  7. 技术创作101训练营:从0到1教你搭建自己的技术品牌
  8. Kafka入门之分组的理解
  9. ZOJ 1904 海狸咬木
  10. spring mvc+mybatis ios android整合cms内容发布平台
  11. Ubuntu 命令手册
  12. eclipse上windowsbuilder 安装
  13. STATA软件进行meta分析,在界面显示meta分析
  14. ANC降噪耳机量产测试方案
  15. Android简易计算器的制作(源码)(两种方法)
  16. 【期末复习】网络攻击与防御
  17. 闲鱼SPU体系构建的背后
  18. 《聪明人用方格笔记本》读书笔记
  19. 有人对你说辛苦了要怎么回复
  20. RFNet:基于RGB-D数据的语义分割和意外障碍物检测的实时融合网络

热门文章

  1. 【Python】原来处理大文件也可以这么简单?
  2. 旅游攻略应该怎么做,你做对了吗?
  3. 计算机图形学第一次上机——中点线算法和中点圆算法
  4. 给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)
  5. 洛谷 P4720 【模板】扩展卢卡斯定理/exLucas
  6. Linux下普通用户使用强制位获取root权限
  7. JavaScript正负运算符
  8. java狼羊草过河_解决狼、羊、白菜过河问题的编程思路
  9. stm32驱动NRF24L01_原理+代码解析
  10. OpenAI发布ChatGPT:程序员瞬间不淡定了