自定义Lock实现

复制代码
 1 package com.wyt.lock.test;
 2 
 3 import java.util.concurrent.LinkedBlockingQueue;
 4 import java.util.concurrent.TimeUnit;
 5 import java.util.concurrent.atomic.AtomicReference;
 6 import java.util.concurrent.locks.Condition;
 7 import java.util.concurrent.locks.Lock;
 8 import java.util.concurrent.locks.LockSupport;
 9 
10 public class MyLock implements Lock {
11     //锁的持有者
12     private final static AtomicReference<Thread> owner = new AtomicReference<>();
13     //等待队列
14     private LinkedBlockingQueue<Thread> queue = new LinkedBlockingQueue<>();
15 
16     @Override
17     public void lock() {
18         //如果cas失败,则将当前线程添加至阻塞队列
19         while (!owner.compareAndSet(null, Thread.currentThread())) {
20             queue.add(Thread.currentThread());
21             LockSupport.park();//阻塞当前线程
22             // 如果当前线程处于非阻塞状态时,可执行下面一行,
23             // 执行下面一行的目的是为了防止oom
24             queue.remove(Thread.currentThread());
25         }
26     }
27 
28     @Override
29     public void unlock() {
30         //如果cas成功,遍历阻塞队列,唤醒所有的线程
31         if (owner.compareAndSet(Thread.currentThread(), null)) {
32             for (Thread thread : queue) {
33                 LockSupport.unpark(thread);
34             }
35         }
36     }
37 
38     @Override
39     public void lockInterruptibly() throws InterruptedException {
40 
41     }
42 
43     @Override
44     public boolean tryLock() {
45         return false;
46     }
47 
48     @Override
49     public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
50         return false;
51     }
52 
53     @Override
54     public Condition newCondition() {
55         return null;
56     }
57 }
View Code
复制代码

youtube:P19 AQS源码深度解读  ---   P26 AQS源码深度解读 

 

 

 

posted @   骑驴晒太阳  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示