利用atimicInteger cas的特性实现一个锁
利用atimicInteger cas的特性实现一个锁
主要是使用的是 atomicIntegerAPI 的compareAndSet()方法,让线程不在阻塞,获取不到直接失败.
我们先定义一个异常类
public class GetLockException extends Exception { public GetLockException() {
super();
} public GetLockException(String message) {
super(message);
}
}
锁实现类:
compareAndSet 主要就是对比,前面一个是期望值 后面一个是你要设置的值.
public class TryLockAtomic {
private static AtomicInteger value = new AtomicInteger(0); private Thread lockThread; public void tryLock() throws GetLockException {
boolean success = value.compareAndSet(0, 1);
if(!success){
throw new GetLockException("get lock failed");
}
lockThread = Thread.currentThread(); } public void unlock(){
if(0 == value.get()){return;} if(lockThread == Thread.currentThread()){
value.compareAndSet(1,0);
}
}
}
测试类
public static TryLockAtomic tryLockAtomic = new TryLockAtomic(); public static void main(String[] args) { for (int i = 0; i <2 ; i++) { new Thread(()->{
try {
dosomething2();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (GetLockException e) {
e.printStackTrace();
} }).start();
} } public static void dosomething() throws InterruptedException { synchronized (AtomicIntegerTest2.class){
System.out.println(Thread.currentThread().getName()+"---sleep");
Thread.sleep(1000000);
} } public static void dosomething2() throws InterruptedException, GetLockException { try { tryLockAtomic.tryLock();
System.out.println(Thread.currentThread().getName()+"---sleep");
Thread.sleep(1000000);
} finally {
//获取不到也会执行unlock 所以在这unlock 里判断是不是获取到锁的那个线程
tryLockAtomic.unlock(); }
}
利用atimicInteger cas的特性实现一个锁的更多相关文章
- 【漫画】CAS原理分析!无锁原子类也能解决并发问题!
本文来源于微信公众号[胖滚猪学编程].转载请注明出处 在漫画并发编程系统博文中,我们讲了N篇关于锁的知识,确实,锁是解决并发问题的万能钥匙,可是并发问题只有锁能解决吗?今天要出场一个大BOSS:CAS ...
- CAS(Compare and Swap)无锁算法-学习笔记
非阻塞同步算法与CAS(Compare and Swap)无锁算法 这篇问题对java的CAS讲的非常透彻! 锁的代价 1. 内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的 ...
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 老板让只懂Java基本语法的我,基于AQS实现一个锁
10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...
- [JavaWeb]利用JSP的编码特性制作免杀后门
利用JSP的编码特性制作免杀后门 这里是借鉴了Y4stacker师傅的thinkings 待解决的问题 JSP解析 JSP"乱码"为什么还能被识别 "乱码"的J ...
- 2、利用蓝牙定位及姿态识别实现一个智能篮球场套件(二)——CC2540/CC2541基于广播的RSSI获得
CC2541一拖多例程中RSSI获得是通过一个事件回调函数实现的,前提是需要连接上蓝牙设备. 这个对于多点定位来说是不可行的,由于主机搜索蓝牙设备过程中也能获得当前蓝牙设备的RSSI等信息,因此可基于 ...
- 利用WCF的双工通讯实现一个简单的心跳监控系统 z
利用WCF的双工通讯实现一个简单的心跳监控系统 http://www.cnblogs.com/zuowj/p/5761011.html 何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态 ...
- MySQL · 引擎特性 · InnoDB 事务锁简介
https://yq.aliyun.com/articles/4270# zhaiwx_yinfeng 2016-02-02 19:00:43 浏览2194 评论0 mysql innodb lock ...
- 利用HTML5与jQuery技术创建一个简单的自动表单完成
来源:GBin1.com 在线演示 在线下载 谷歌快速搜索自带大量自动完成插件——库中甚至还有一个附带的jQuery UI共享选项.然而今天我要寻找一个替代的解决方案.由DevBridge开发的j ...
随机推荐
- Template7学习记录
来源:http://idangero.us/template7/#.V2iXqJGF6Ul 测试用json数据: var jsonData = { people: [ { firstName: 'Jo ...
- React Native开源项目案例
(六).React Native开源项目: 1.Pober Wong_17童鞋为gank.io做的纯React Native项目,开源地址:https://github.com/Bob1993/Rea ...
- nDPI深度数据包检测
nDPI https://github.com/ntop/nDPI
- 全球数据库-->基金/管理产品-->基金分析/新闻/报告
加拿大共同基金 澳大利亚投资信托 美国ETF 美国共同基金 英国投资信托基金 名称 分析师名称 分析日期 晨星分析师评级 晨星简报
- pyspider示例代码一:利用phantomjs解决js问题
本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...
- K8S中RC与Deployment的区别
原文:http://fx114.net/qa-81-152379.aspx replication controller与deployment的区别 replication controller Re ...
- shllter自动和手动实例
加壳: wineconsole shellter A,选自动 将putty.exe移到/usr/share/shllter/目录,PE设置为putty.exe LHOST,LPORT 监视: use ...
- VS2010下连接Oracle数据库的方法
在vs2010下使用OleDB连接Oracle数据库 ——此方法不需要配置数据源. 1. 在“服务器资源管理器”中,选择“数据库连接”,右击,选择“添加连接”. 2. 出现下面的界面,并按图中选择“用 ...
- Codeforces768B Code For 1 2017-02-21 22:17 95人阅读 评论(0) 收藏
B. Code For 1 time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- npm是干什么的?
允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用. 其实npm ...