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 }

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

自定义Lock实现的更多相关文章

  1. J.U.C剖析与解读1(Lock的实现)

    J.U.C剖析与解读1(Lock的实现) 前言 为了节省各位的时间,我简单介绍一下这篇文章.这篇文章主要分为三块:Lock的实现,AQS的由来(通过演变的方式),JUC三大工具类的使用与原理剖析. L ...

  2. 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础

    欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...

  3. libev学习(一)

    一.libev简介 Libev是一个事件循环:你注册感兴趣的特定事件(比如一个文件可以读取时或者发生超时时),它将管理这些事件源,将这些事件反馈给你的程序.为了实现这些,至少要在你的进程(或线程)中执 ...

  4. libev 学习使用

    libev 简单的I/O库.  a high performance full featured event loop written in c libev 的大小也比 libevent 小得多并且自 ...

  5. Libev库学习

    Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...

  6. 深入学习c++--多线程编程(二)【当线程间需要共享非const资源】

    1. 遇到的问题 #include <iostream> #include <thread> #include <chrono> #include <futu ...

  7. JetCache 源码分析

    一.简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用. JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL.两级缓存.分布 ...

  8. ZooKeeper分布式锁的实现

    ZooKeeper分布式锁的实现. 在分布式的情况下,sychornized 和 Lock 已经不能满足我们的要求了,那么就需要使用第三方的锁了,这里我们就使用 ZooKeeper 来实现一个分布式锁 ...

  9. c#自定义日志记录

    废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可. 默认保存在:项目/temp/log /// <summary> /// 日志类 /// & ...

  10. Asp.Net 自定义储存Session方式

    介绍 由于针对于自定义Session存储方式比较少,所以整理了使用自定义Session的方式.用于构建自定义会话存储提供程序代码,而不是使用默认的 SessionStore 介绍 背景 本文使用的是m ...

随机推荐

  1. flutter 设置Appbar上面的电池显示的状态栏的背景与颜色

    写代码,修改了一下Appbar后,发现这个顶部颜色不对劲 找到这个文件lib\main.dart import 'dart:io'; import 'package:flutter/services. ...

  2. 12.ThreadLocal的那点小秘密

    大家好,我是王有志.关注王有志,一起聊技术,聊游戏,聊在外漂泊的生活. 好久不见,不知道大家新年过得怎么样?有没有痛痛快快得放松?是不是还能收到很多压岁钱?好了,话不多说,我们开始今天的主题:Thre ...

  3. java基础:方法

    方法 方法是解决一类问题的步骤的有序组合 包含于类/对象中 设计原则 方法的原子性:一个方法只实现一个功能 定义与调用 方法的组成: 方法的调用 若方法返回值为空 System.out.println ...

  4. immutable.js学习笔记(八)----- immutable.js对象 和 原生对象的相互转换

    一.原生对象转换为immutable.js对象 fromJS 栗子一: 栗子二: 如果数组里面有对象,对象里面有数组,怎么转换呢 复杂结构的转换 二.immutable.js对象转换为原生对象 toJ ...

  5. drf-day1——web应用模式、API接口、接口测试工具postman

    目录 学习资料 一.web 应用模式 二.API接口 API概念 三.接口测试工具postman postman介绍 postman下载与使用 四.如何在浏览器中测试 学习资料 # 个人博客:http ...

  6. FreeBSD 安装 fcitx5的配置

    link: Chinese Pinyin Package for typing Chinese sudo pkg install -y zh-CJKUnifonts sudo pkg install ...

  7. @mapper注解

    1.标记这是一个映射接口,这样子写还是需要写xml文件 package com.atguigu.springcloud.dao; import com.atguigu.springcloud.enti ...

  8. 精美的web前端源码的特效

    1.JS自定义烟花特效 这是一款基于JS和Canvas的自定义烟花特效,初始化界面的时候特效是不带声效的绽放,当你点击顶部中间的播放,即可以看到美丽的烟火也可以听到烟花绽放的声音,让你脑海浮现过年团圆 ...

  9. 代码随想录算法训练营day12 | leetcode 239. 滑动窗口最大值 347.前 K 个高频元素

    基础知识 ArrayDeque deque = new ArrayDeque(); /* offerFirst(E e) 在数组前面添加元素,并返回是否添加成功 offerLast(E e) 在数组后 ...

  10. 开源分布式任务调度系统就选:DolphinScheduler

    分布式任务调度这个话题是每个后端开发和大数据开发都会接触的话题.因为应用场景的广泛,所以有很多开源项目专注于解决这类问题,比如我们熟知的xxl-job. 那么今天要给大家推荐的则是另一个更为强大的开源 ...