自定义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 }
youtube:P19 AQS源码深度解读 --- P26 AQS源码深度解读 

自定义Lock实现的更多相关文章
- J.U.C剖析与解读1(Lock的实现)
J.U.C剖析与解读1(Lock的实现) 前言 为了节省各位的时间,我简单介绍一下这篇文章.这篇文章主要分为三块:Lock的实现,AQS的由来(通过演变的方式),JUC三大工具类的使用与原理剖析. L ...
- 并发王者课-铂金1:探本溯源-为何说Lock接口是Java中锁的基础
欢迎来到<并发王者课>,本文是该系列文章中的第14篇. 在黄金系列中,我们介绍了并发中一些问题,比如死锁.活锁.线程饥饿等问题.在并发编程中,这些问题无疑都是需要解决的.所以,在铂金系列文 ...
- libev学习(一)
一.libev简介 Libev是一个事件循环:你注册感兴趣的特定事件(比如一个文件可以读取时或者发生超时时),它将管理这些事件源,将这些事件反馈给你的程序.为了实现这些,至少要在你的进程(或线程)中执 ...
- libev 学习使用
libev 简单的I/O库. a high performance full featured event loop written in c libev 的大小也比 libevent 小得多并且自 ...
- Libev库学习
Libev库学习 https://www.cnblogs.com/wunaozai/p/3950249.html Libev库学习(1)https://www.cnblogs.com/wunaozai ...
- 深入学习c++--多线程编程(二)【当线程间需要共享非const资源】
1. 遇到的问题 #include <iostream> #include <thread> #include <chrono> #include <futu ...
- JetCache 源码分析
一.简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用. JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL.两级缓存.分布 ...
- ZooKeeper分布式锁的实现
ZooKeeper分布式锁的实现. 在分布式的情况下,sychornized 和 Lock 已经不能满足我们的要求了,那么就需要使用第三方的锁了,这里我们就使用 ZooKeeper 来实现一个分布式锁 ...
- c#自定义日志记录
废话不多说,直接上代码: 很简单:将类复制到项目中,最后在配置文件上配置一下:logUrl即可. 默认保存在:项目/temp/log /// <summary> /// 日志类 /// & ...
- Asp.Net 自定义储存Session方式
介绍 由于针对于自定义Session存储方式比较少,所以整理了使用自定义Session的方式.用于构建自定义会话存储提供程序代码,而不是使用默认的 SessionStore 介绍 背景 本文使用的是m ...
随机推荐
- java 入门与进阶P-6.5+P-6.6
字符串操作 字符串是对象,对它的所有操作都是通过" . " 这个运算符来进行的 字符串.操作 他表示对.左边的这个字符串做右边的那个操作 这里的字符串可以是变量也可以是常量 Str ...
- postgresql添加mysql_fdw测试过程
请先确认已经安装好mysql_fdw,如果没有配置好点这:https://www.cnblogs.com/ohsolong/p/13041989.html 1.切换至postgres用户,输入密码登录 ...
- vulnhub靶场之DIGITALWORLD.LOCAL: VENGEANCE
准备: 攻击机:虚拟机kali.本机win10. 靶机:digitalworld.local: VENGEANCE,下载地址:https://download.vulnhub.com/digitalw ...
- 聊一聊js中元素定位的方法
在做selenium web自动化的时候,有时通过selenium定位不到,或无法操作元素,这个时候就需要通过js来 定位/操作元素,然后通过selenium自带的execute_script()方法 ...
- get请求与post请求的区别
大小限制 get请求一般通过url传输的数据量时比较少的,最多传3~5个参数,如果要传递多个参数,要在url地址中利用"&"符号拼接多个参数, 栗子:/test/demo. ...
- 真正“搞”懂HTTP协议10之缓存控制
HTTP缓存相关的问题好像是前端面试中比较常见的问题了,上来就会问什么cache-control字段有哪些,有啥区别啥的.嗯--说实话,我觉得至少在本篇来说,HTTP缓存还算不上复杂,只是字段稍微多了 ...
- GDOI 2021 PJ 总结
Day 0.5 在门口等了好久,终于进去了. Day 1 下午来到考场,发现自己承诺书没有拿,然后就跑到宿舍去拿,回来发现只要身份证. T1一眼是个博弈,发现不太好打,先跳. T2发现最多消耗4320 ...
- P23_列表渲染
列表渲染 wx:for 通过 wx:for 可以根据指定的数组,循环渲染重复的组件结构,语法示例如下: 默认情况下,当前循环项的索引用 index 表示:当前循环项用 item 表示. 手动指定索引和 ...
- TCP/IP协议(1): IP 地址和寻址方式 —— IP 协议的基础
TCP/IP协议(1): IP 地址和寻址方式 -- IP 协议的基础 最近在重学计算机网络,给自己立一个 flag,有感而发的时候写关于 TCP/IP 协议栈的系列博客. IP 地址 IP 地址(I ...
- 基于pytorch实现模型剪枝
一,剪枝分类 1.1,非结构化剪枝 1.2,结构化剪枝 1.3,本地与全局修剪 二,PyTorch 的剪枝 2.1,pytorch 剪枝工作原理 2.2,局部剪枝 2.2.1,局部非结构化剪枝 2.2 ...