模仿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接口用于加锁和解锁限制,加锁后必须释放锁,其他的线程才能进入到里面执行, ... 
随机推荐
- Linux学习之分区自动挂载与fstab文件修复(九)
			linux分区自动挂载与fstab文件修复 在前面我们实现新添加硬盘,进行分区与格式化,然后手动挂载,这样做,在重启后,需要重新挂载才能使用. https://www.cnblogs.com/-wen ... 
- 图片裁切展示css
			.wen_photo{ overflow:hidden;}.wen_photo img{ margin:0; padding:0; width:100%; height: 100%; object-f ... 
- Flutter常用组件(Widget)解析-Scaffold
			实现一个应用基本的布局结构. 举个栗子: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); clas ... 
- JDBC fetch size
			make your java run faster A blog on java performance and optimization. On JDBC, Hibernate, caching, ... 
- 【11.9校内测试】【倒计时1天】【ak欢乐赛】【多项式计算模拟】
			然而AK失败了,就是因为这道摸你题:(最后一篇题解了吧?QAQ) Solution 模拟多项式乘法,其中的运算处理很像高精度,不过第$i$位代表的就是$x^i$前面的系数了. 好像去年的时候就讲了表达 ... 
- bzoj 3924 点分
			感谢asm.Definer清楚明了的题解: http://www.cnblogs.com/Asm-Definer/p/4470112.html 收获: 1. 关于重心, 对于一个无向图, 我们这样给 ... 
- LOJ6070 基因 分块+回文自动机
			这个在翁文涛的论文里有讲到 大概的就是一个子串的回文自动机是原串回文自动机的子图 于是每隔$\sqrt n$重新跑一个$(k \times \sqrt n,n)$的回文自动机 记录回文串个数和位置 并 ... 
- db2执行计划介绍
			在数据库调优过程中,SQL语句往往是导致性能问题的主要原因,而执行计划则是解释SQL语句执行过程的语言,只有充分读懂执行计划才能在数据库性能优化中做到游刃有余. 常见的关系型数据库中,虽然执行计划的表 ... 
- go自动补全
			安装: get -u github.com/posener/complete/gocomplete gocomplete -install 卸载: gocomplete -uninstall http ... 
- UVA 11613 Acme Corporation(不固定流量的最小费用流)
			题意好长....变量好多.... 增加源点跟汇点.然后将每个月份看成一个点,然后拆成两个点u 跟 u+n. 从s向每个u连一条<n[u], m[i]>的弧,表示最多生产量及价值. 从每个u ... 
