自定义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 @ 2022-04-13 17:10  骑驴晒太阳  阅读(21)  评论(0)    收藏  举报