模仿ReentrantLock类自定义锁
简介
临近过年了,没什么需求,今天模仿ReentrantLock自定义写了一个自己锁,在这里记录一下,前提是对AQS原理有所了解,分享给大家
1、自定义锁MyLock
package com.jacky; import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock; /**
* Created by jacky on 2018/2/12.
*/
public class MyLock implements Lock{
private final Sync sync; /**
* 创建公平锁或非公平锁
* @param fairFlag
*/
public MyLock(boolean fairFlag){
sync = fairFlag ? new FairSync() : new NonFairSync();
} /**
* 默认是公平锁
*/
public MyLock(){
sync = new FairSync();
} /**
* 获取锁
*/
@Override
public void lock() {
sync.acquire(1);
} /**
* 获取可中断锁
* @throws InterruptedException
*/
@Override
public void lockInterruptibly() throws InterruptedException {
sync.acquireInterruptibly(1);
} /**
* 它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,
* 也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待
* @return
*/
@Override
public boolean tryLock() {
return sync.nonfairTryAcquire(1);
} /**
* 获得可超时的锁
* @param time
* @param unit
* @return
* @throws InterruptedException
*/
@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
return sync.tryAcquireNanos(1,unit.toNanos(time));
} /**
* 释放锁
*/
@Override
public void unlock() {
sync.release(1);
} @Override
public Condition newCondition() {
return sync.new ConditionObject();
} abstract static class Sync extends AbstractQueuedSynchronizer {
/**
* 判断当前线程是否获得锁
* @return
*/
@Override
protected boolean isHeldExclusively() {
return Thread.currentThread() ==getExclusiveOwnerThread();
} /**
* 尝试释放锁
* @param arg
* @return
*/
@Override
protected boolean tryRelease(int arg) {
int newState =getState()-arg;
setState(newState < 0 ? 0:newState);
if (newState ==0){
setExclusiveOwnerThread(null);
} return true;
} final boolean nonfairTryAcquire(int arg) {
Thread thread = Thread.currentThread();
int state = getState();
if (state ==0){
compareAndSetState(0,state+arg);
//设置独占线程
setExclusiveOwnerThread(thread);
return true;
}
if (isHeldExclusively()){
setState(state+arg);
return true;
}
return false;
} }
static class FairSync extends Sync{
/**
* 尝试公平锁获得锁
* @param arg
* @return
*/
@Override
public boolean tryAcquire(int arg) {
Thread thread = Thread.currentThread();
int state = getState();
if (state ==0){
//判断队列是否有数据,有数据就返回获取锁失败(公平锁才会这么做)
if (hasQueuedPredecessors()){
return false;
}
compareAndSetState(0,state+arg);
//设置独占线程
setExclusiveOwnerThread(thread);
return true;
}
if (isHeldExclusively()){
setState(state+arg);
return true;
}
return false;
} } static class NonFairSync extends Sync{
@Override
public boolean tryAcquire(int arg) {
return nonfairTryAcquire(arg);
}
}
}
2、测试类
package com.jacky; import jdk.internal.org.objectweb.asm.tree.TryCatchBlockNode; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock; /**
* Created by jacky on 2018/2/12.
*/
public class MyLockDemo {
private final static MyLock lock = new MyLock(false);
//private final static ReentrantLock lock = new ReentrantLock(true);
private static int num = 0;
public static void main(String[] args) {
int count = 2000;
CountDownLatch countDownLatch = new CountDownLatch(count);
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
lock.lock();
Thread thread = Thread.currentThread();
System.out.println("--start--"+thread.getName());
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
num++;
System.out.println("--end--");
countDownLatch.countDown();
}finally {
lock.unlock();
} }
};
Thread thread = null;
for (int i = 0; i < count; i++) {
thread = new Thread(runnable,"t"+i);
thread.start();
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("--num--"+num);
}
}
模仿ReentrantLock类自定义锁的更多相关文章
- 模仿CountDownLatch类自定义倒时计时器
简介 这里模仿CountDownLatch类自定义到时计时器,利用AQS模板中的尝试获得共享和释放共享 1.MyCountDownLatch package com.jacky; import com ...
- 深入理解独占锁ReentrantLock类锁
ReentrantLock介绍 [1]ReentrantLock是一种基于AQS框架的应用实现,是JDK中的一种线程并发访问的同步手段,它的功能类似于synchronized是一种互斥锁,可以保证线程 ...
- 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...
- 浅谈 Android 自定义锁屏页的发车姿势
作者:blowUp,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577446&idx=2&sn= ...
- ReentrantLock类的基本结构
ReentrantLock类是一个可重入互斥锁,它具有与使用synchronized()方法和语句访问隐式监视器锁相同的基本行为和语义,但是它的功能更强大.ReentrantLock由最近成功获得锁但 ...
- 浅谈Android自定义锁屏页的发车姿势
一.为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功能,至今仍发挥着巨大作用,特别是触屏时代的到来,锁屏的功用被发挥到了极致.多少人曾经在无聊的时候每隔几分钟划开锁屏再关上,孜孜不倦,其酸 ...
- 【试验局】ReentrantLock中非公平锁与公平锁的性能测试
硬件环境: CPU:AMD Phenom(tm) II X4 955 Processor Memory:8G SSD(128G):/ HDD(1T):/home/ 软件环境: OS:Ubuntu14. ...
- [图解Java]ReentrantLock重入锁
图解ReentrantLock 0. demo 我先给出一个demo, 这样大家就可以根据我给的这段代码, 边调试边看源码了. 还是那句话: 注意"My" , 我把Reentran ...
- java中的 java.util.concurrent.locks.ReentrantLock类中的lockInterruptibly()方法介绍
在java的 java.util.concurrent.locks包中,ReentrantLock类实现了lock接口,lock接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ...
随机推荐
- 浅谈vue之动态路由匹配
在日常开发过程中,可能会遇到一些类似于新闻详情页的内容,需要把所有详情页映射到同一组件上,这是动态路由匹配的应用场景之一.在使用的过程中,也遇到过一些小坑,此篇做个简要的总结说明: 基本使用 { pa ...
- go语言学习-接口
Go语言中虽然没有传统面向对象语言中类.集成的概念,不过提供了接口的支持,可以使用接口来使用一些面向对象的特性. 在 go 语言中,的接口有下面几个特点: 可以包含0个或多个方法的签名 只定义方法的签 ...
- TCO 2015 1A Hard.Revmatching(Hall定理)
\(Description\) 给定一个\(n\)个点的二分图,每条边有边权.求一个边权最小的边集,使得删除该边集后不存在完备匹配. \(n\leq20\). \(Solution\) 设点集为\(S ...
- 洛谷.4234.最小差值生成树(LCT)
题目链接 先将边排序,这样就可以按从小到大的顺序维护生成树,枚举到一条未连通的边就连上,已连通则(用当前更大的)替换掉路径上最小的边,这样一定不会更差. 每次构成树时更新答案.答案就是当前边减去生成树 ...
- phpstorm在项目中查找某个字符串
如果项目过大,想在整个项目中找某个字符串,又不知道该字符串所在文件的路径,这时候就可以使用全局搜索了,ctrl+shift+F.在mac下,快捷键是command+shift+F:
- unity中尽量规避的C#写法
首先想到的也就是重名的问题. 创建C#脚本的时候,引擎会搜索所有的文件夹里已有的C#脚本,若已经存在这个名字的脚本文件,那么系统就会报错: 再者,类名和方法名不能相同,理解来就是,方法名和类名相 ...
- Oozie分布式工作流——Action节点
前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点.Action节点有一些比较通用的特性: Action节点是远程的 所有oozie创建的计算和处理任务都是异步的, ...
- webbench进行压力测试
参考原文:http://www.vpser.net/opt/webserver-test.html webbench是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力 ...
- 关于在win8系统下用VMware 9.0装系统导致物理机不断重启的解决办法
一.问题描述 前段时间将操作系统换成了Win8,安装上VMware 9.0英文版.然后在VMware中安装centos系统,结果每次到安装系统的时候,物理机系统就会莫名其妙地自动重启,毫无征兆地出现, ...
- FPGA系列之一:Cyclone V中的时钟资源
之前的项目中更多的是有师兄提供经验和帮助,追求的是快速上手,所以不管对于硬件电路设计,还是verilog电路编程,甚至是FPGA内部的资源,都没来得及系统地学习,最近在做算法到电路的实现,正好系统学习 ...