java 自旋_java自旋锁的代码实现
自旋锁:spinlock
是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环耗用CPU
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
public class SpinLockTest {
/**
* 自旋锁:
* 是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环耗用CPU
* 而在一个多核的机器中,多个线程是可以并行执行的。如果当后面请求锁的线程没拿到锁的时候,不挂起线程,而是继续占用处理器的执行时间,
* 让当前线程执行一个忙循环(自旋操作),
* 也就是不断在盯着持有锁的线程是否已经释放锁,那么这就是传说中的自旋锁了。
* @param args
*/
/**
* 1.6 版本后使用了自适应自旋锁:
* 自旋次数通常由前一次在同一个锁上的自旋时间及锁的拥有者的状态决定。如果线程【T1】自旋成功,自旋次数为17次,那么等到下一个线程【T2】自旋时,
* 也会默认认为【T2】自旋17次成功,
如果【T2】自旋了5次就成功了,那么此时这个自旋次数就会缩减到5次。
自适应自旋锁随着程序运行和性能监控信息,从而使得虚拟机可以预判出每个线程大约需要的自旋次数
* @param args
*/
public static void main(String[] args) {
SpinLockTest sl= new SpinLockTest();
// 给线程赋予AA名称
new Thread(()->{
sl.myLock();
try {
// 休眠5 秒
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sl.unMyLock();
},"AA").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(()-> {
sl.myLock();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sl.unMyLock();
},"BB").start();
}
// AtomicReference 原子方式更新对象引用 ,保证多线程下操作该对象进行更新时,避免出现脏读,只要有一个线程改变 ,
//其他现场不会在改变该值
AtomicReference atomicReference = new AtomicReference<>();
// null 表示锁未被线程持有, atomicReference.compareAndSet(t,null); 线程的持有状态改变为null
public void myLock() {
Thread t=Thread.currentThread();
System.out.println(t.currentThread().getName()+ "come in");
while (!atomicReference.compareAndSet(null, t)) {
}
}
public void unMyLock() {
Thread t=Thread.currentThread();
atomicReference.compareAndSet(t,null);
System.out.println(t.currentThread().getName()+ "invoked unMyLock() ");
}
}
java 自旋_java自旋锁的代码实现相关推荐
- java排他_Java排他锁实现的代码详解
这篇文章主要介绍了Java编程实现排他锁的相关内容,叙述了实现此代码锁所需要的功能,以及作者的解决方案,然后向大家分享了设计源码,需要的朋友可以参考下. 一 .前言 某年某月某天,同事说需要一个文件排 ...
- java短_Java中的最短代码和最低延迟
如何编写以最快速度执行的代码,同时仍将编码保持在最低限度? 最短代码和最低延迟 谁能编写具有最低延迟的最短Java代码,以及使用了哪些工具? 更具体地说,目标是开发一个Java应用程序,使用通用解决方 ...
- java泛型编程_Java编程泛型限定代码分享
泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中, 越是单一越好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 ...
- java 持久_Java持久锁总结 -解道Jdon
并发主题 Java与持久相关的锁总结 本文总结Java中有关数据库保存持久数据的锁机制,不只是纯粹数据库自身的锁,本文主要就Java持久层三个技术数据库.JPA和Hibernate的锁应用进行了总结. ...
- cdate在java中_Java Calendar.add方法代码示例
本文整理汇总了Java中java.util.Calendar.add方法的典型用法代码示例.如果您正苦于以下问题:Java Calendar.add方法的具体用法?Java Calendar.add怎 ...
- java 秒表_JAVA计时器秒表程序代码
<JAVA计时器秒表程序代码>由会员分享,可在线阅读,更多相关<JAVA计时器秒表程序代码(7页珍藏版)>请在人人文库网上搜索. 1.Java计时器(秒表)功能:能实现计时,暂 ...
- java 搜索_Java实现搜索功能代码详解
首先,我们要清楚搜索框中根据关键字进行条件搜索发送的是Get请求,并且是向当前页面发送Get请求 //示例代码 请求路径为当前页面路径 "/product" 当我们要实现多条件搜索 ...
- 游侠怎么设置java路径_Java获取当前路径的代码
1.利用System.getProperty()函数获取当前路径: System.out.println(System.getProperty("user.dir"));//use ...
- Java commit()_Java XAResource.commit方法代码示例
import javax.transaction.xa.XAResource; //导入方法依赖的package包/类 public void testSuspendableTx() throws E ...
最新文章
- Ubuntu下makefile及gcc生成静态库动态库的简单使用举例
- Tensorflow 读取XML文件内容并对图片等比例缩放
- webpack [记录]
- Python为什么这么厉害? 不想成为专业码农? 来学习Python吧!
- Inside Class Loaders
- android 在指定位置添加布局,Android 如何动态添加 View 并显示在指定位置。
- C++---堆代码实现
- latex中pdflatex与xelatex的区别
- 引入外部less_CSS扩展语言sass和less应该选哪个?
- 【程序人生】Web前端工程师岗位分析报告
- 信息安全管理体系--文件的等级划分
- 微信小程序(一):微信小程序与服务器的简单链接
- CRM管理系统源码PHP开源系统源码
- [11g](ALTER SYSTEM SUSPEND)Suspending and Resuming a Database
- abstract 抽象学习
- 红帽linux安装intel(R) wifi link 5100 AGN总结
- js学习笔记(1)之document.write()方法使用总结
- 2020中国新基建409家细分领域龙头企业全名单!
- 昔日金屋中的女人,谁都难免面对帝王决然的背影
- 如何下载网站中的blob:https:// 视频
热门文章
- python爬虫论文参考文献格式_Python爬虫进阶必备 | XX文学加密分析实例
- Telegram附近的人功能存在安全风险,可被用于探测用户位置
- 扫地机器人自动回充原理
- Leetcode 781 森林里的兔子(C++)
- 挑选微信h5开发制作公司的标准是什么?
- [Solved] Splunk: Cannot get username when all users are selected“
- iOS系统越狱研究现状梳理
- Windows上架设Turn服务器
- Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)
- HP服务器booting embedded lom 1 port 1 hpe ethernet 1gb 4-port 331i adapter处理