- 浏览: 498985 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
herofighter2008:
图呢?图呢?图呢?图呢?
BlockingQueue -
zy13608089849:
请问一下博主,文中几处提到的图,怎么都没有?是我这显示不出来还 ...
BlockingQueue -
swift911:
在短信的场景下很好用,感谢分享
BlockingQueue -
tony_0529:
学习了~谢谢分享。
BlockingQueue -
Master-Gao:
...
BlockingQueue
我们知道volatile修饰的变量可以实现基本的加载和赋值的原子性,但是对于像i++等操作就不能保证原子性了,在JDK1.5之前我们只能通过
synchronized(阻塞的方式)实现这些复合操作的原子性,在JDK1.5中java.util.concurrent.atomic
包提供了若干个类能实现对int,long,boolean,reference的几个特殊方法非阻塞原子性,这一系列类的主要基于以下两点
1.volatile修饰变量,保证get()/set()的原子性
2.利用系统底层的CAS原语来实现非阻塞的其它方法原子操作
compareAndSwap(memorylocation,expectedValue,newValue);该操作接受一个预计值和新的赋值,当预计值与实际值相符合时,就表明该变量在此期间没有被别的线程改变(可能有ABA问题),就把新值赋给该引用.
通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功
各个类的介绍
1.AtomicInteger
实现了对Int的各种操作的原子化,我们看看其中的方法
//实现atomic类的最大诀窍#####
public final boolean compareAndSet(int expect, int update) {
//如果内存位置的值与期望值相同则,赋予新值,并返回true
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
//该方法实现了i++的非阻塞的原子操作
public final int getAndIncrement() {
for (;;) { //循环,使用CAS的经典方式,这是实现non-blocking方式的代价
int current = get();//得到现在的值
int next = current + 1;//通过计算得到要赋予的新值
if (compareAndSet(current, next)) //关键点,调用CAS原子更新,
return current;
}
}
2.AtmoicLong
与AtomicInteger相似,只是是基于Long
3.AtmoicBoolean
与AtomimcInteger相似,基于boolean
4.AtomicReference
与上述三个类不同,该类是用于原子地更新某个引用,只提供操作保证某个引用的更新会被原子化,常用封装某个引用会被多个线程频繁更新的场景,保证线程安全性
public final V getAndSet(V newValue) {
while (true) {
V x = get();
if (compareAndSet(x, newValue))
return x;
}
}
======================================================================
5.AtomicIntegerArray
对数组中的制定int提供几种特定的原子操作,注意不是对这个数组对象进行原子操作
//对数组的第i个元素进行原子的i--操作
//注意该类的原子操作都是针对数组中的某个指定元素的
public final int getAndDecrement(int i) {
while (true) {
int current = get(i);
int next = current - 1;
if (compareAndSet(i, current, next))
return current;
}
}
6.AtomicLongArray
与AtomicIntegerArray相似,基于long的
7.AtomicReferenceArray
与AtomicIntegerArray相似,基于reference的
======================================================================
8.AtomicLongFieldUpdater
上述的7个类都是基于对类自身的volatile数据提供原子操作,但是如何对已经存在的类中的volatile数据提供原子支持呢,这个需求是很常见
的,因为我们在日常开发中经常要使用第三方的class.8#9#10这三个类就是利用反射机制对指定类的指定的volatile
field提供原子操作的工具类.这三个类在原子数据结构中被用到,可以参考源码.注意只对public volatile的非static 成员起作用
//工厂方法,给指定类的指定fild(必须是long)建立一个update,field必须是volatile的
public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass, String fieldName)
9.AtomicIntegerFieldUpdater
与上述类相似,只是基于int
10.AtomicReferenceFieldUpdater
基于Reference
======================================================================
11.AtomicMarkableReference
12.AtomicStampedReference
J2SE 5.0提供了一组atomic
class来帮助我们简化同步处理。基本工作原理是使用了同步synchronized的方法实现了对一个long, integer,
对象的增、减、赋值(更新)操作. 比如对于++运算符AtomicInteger可以将它持有的integer 能够atomic
地递增。在需要访问两个或两个以上
atomic变量的程序代码(或者是对单一的atomic变量执行两个或两个以上的操作)通常都需要被synchronize以便两者的操作能够被当作是
一个atomic的单元。
对array atomic变量来说,一次只有一个索引变量可以变动,并没有功能可以对整个array做atomic化的变动。
关于Atomic的几个方法
getAndSet() : 设置新值,返回旧值.
compareAndSet(expectedValue, newValue) : 如果当前值(current
value)等于期待的值(expectedValue), 则原子地更新指定值为新值(newValue), 如果更新成功,返回true,
否则返回false, 换句话可以这样说: 将原子变量设置为新的值,
但是如果从我上次看到的这个变量之后到现在被其他线程修改了(和我期望看到的值不符), 那么更新失败
从effective java (2)中拿来的一个关于AtomicReference的一个例子:
Java代码
- public class AtomicTest {
- private int x, y;
- private enum State {
- NEW, INITIALIZING, INITIALIZED
- };
- private final AtomicReference<State> init = new AtomicReference<State>(State.NEW);
- public AtomicTest() {
- }
- public AtomicTest( int x, int y) {
- initialize(x, y);
- }
- private void initialize( int x, int y) {
- if (!init.compareAndSet(State.NEW, State.INITIALIZING)) {
- throw new IllegalStateException( "initialize is error" );
- }
- this .x = x;
- this .y = y;
- init.set(State.INITIALIZED);
- }
- public int getX() {
- checkInit();
- return x;
- }
- public int getY() {
- checkInit();
- return y;
- }
- private void checkInit() {
- if (init.get() == State.INITIALIZED) {
- throw new IllegalStateException( "uninitialized" );
- }
- }
-
}
上面的例子比较容易懂, 不过貌似没什么价值, 而在实际的应用中, 我们一般采用下面的方式来使用atomic class:
Java代码
- public class CounterTest {
- AtomicInteger counter = new AtomicInteger( 0 );
- public int count() {
- int result;
- boolean flag;
- do {
- result = counter.get();
- // 断点
- // 单线程下, compareAndSet返回永远为true,
- // 多线程下, 在与result进行compare时, counter可能被其他线程set了新值, 这时需要重新再取一遍再比较,
- // 如果还是没有拿到最新的值, 则一直循环下去, 直到拿到最新的那个值
- flag = counter.compareAndSet(result, result + 1 );
- } while (!flag);
- return result;
- }
- public static void main(String[] args) {
- final CounterTest c = new CounterTest();
- new Thread() {
- @Override
- public void run() {
- c.count();
- }
- }.start();
- new Thread() {
- @Override
- public void run() {
- c.count();
- }
- }.start();
- new Thread() {
- @Override
- public void run() {
- c.count();
- }
- }.start();
- }
-
}
类似i++这样的"读-改-写"复合操作(在一个操作序列中, 后一个操作依赖前一次操作的结果), 在多线程并发处理的时候会出现问题,
因为可能一个线程修改了变量, 而另一个线程没有察觉到这样变化, 当使用原子变量之后, 则将一系列的复合操作合并为一个原子操作,从而避免这种问题,
i++=>i.incrementAndGet()
原子变量只能保证对一个变量的操作是原子的, 如果有多个原子变量之间存在依赖的复合操作, 也不可能是安全的,
另外一种情况是要将更多的复合操作作为一个原子操作, 则需要使用synchronized将要作为原子操作的语句包围起来.
因为涉及到可变的共享变量(类实例成员变量)才会涉及到同步, 否则不必使用synchronized
发表评论
-
HashMap的非线程安全
2013-11-25 16:06 932在平时开发中,我们经常采用HashMap来作为本地缓存的一种 ... -
SynchronousQueue
2012-08-11 23:30 13344SynchronousQueue是这样一种阻塞队列,其中每个 ... -
(转)ThreadPoolExecutor
2012-08-11 22:41 1349一、ThreadPoolExecutor使 ... -
ArrayList线程不安全分析
2012-04-22 17:49 8651一个 ArrayList ,在添加一个元素的时候,它可能会有两 ... -
ConcurrentModificationException
2012-04-22 16:38 1353如果在获得了某个集合的迭代器之后,除了通过这个迭代器之外对该集 ... -
LinkedBlockingQueue和ConcurrentLinkedQueue
2012-04-21 14:19 80521.LinkedBlockingQueue<E>: ... -
(转)深入研究ReentrantLock(重入锁)之引出话题篇
2012-04-20 20:28 1222一直以来都想好好研究下ReentrantLock,她的独到魅力 ... -
ReentrantLock和synchronized的区别随笔
2012-04-20 20:27 2492可重入锁 ReentrantLock 的含义是: ... -
(转)ReentrantLock和synchronized两种锁定机制的对比
2012-04-20 20:07 1073多线程和并发性并不是什么新内容,但是 Java 语言设计中的创 ... -
volatile变量
2012-02-20 21:26 1840我们知道,在Java中设置变量值的操作,除了long和doub ... -
(转)java并发编程-Executor框架
2012-01-17 09:42 1060Executor框架是指java 5中引入的一系列并发库中 ... -
ThreadLocal的几种误区
2011-11-05 22:54 960最近由于需要用到ThreadLocal,在网上搜索 ... -
正确理解ThreadLocal
2011-11-05 22:41 1332首先, ThreadLocal 不是用来解决 ...
相关推荐
旅游网站首页主要功能有:首页、景点信息、客房信息、美食信息、用户分享、公告信息、个人中心、后台管理、帮助中心等。
基于MATLAB的储能电站建模与评价:平抑可再生能源功率波动,优化风光曲线与负荷匹配度,储能电站平抑可再生能源功率波动的建模与评价:策略设计与并网优化分析,用于平抑可再生能源功率波动的储能电站建模及评价 关键词:储能电站 功率波动 并网 平抑可再生能源 参考文档:《用于平抑可再生能源功率波动的储能电站建模及评价》仅参考 《光伏发电容量可信度评估》参考风电与负荷一致性问题思路 仿真平台:MATLAB yalmip 主要内容:代码主要做的是一个通过储能电站平抑可再生能源波动的问题,通过储能电站平抑可再生能源的波动,建立了两种不同的储能平抑策略,使得风电功率曲线以及光伏曲线变得光滑,从而可以减少并网功率波动;此外,还研究了如何通过储能电站使得风光曲线与负荷曲线趋于一致,从而更好的将分布式能源用于供负荷。 实现效果良好,具体看图。 ,关键词:储能电站; 功率波动; 并网; 平抑可再生能源; 建模; 评价; 风光曲线; 负荷曲线。,基于MATLAB yalmip的储能电站建模与评价:平抑可再生能源功率波动的优化策略
基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于matlab实现的水下图像增强融合算法+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~
基于java开发的安卓多窗口管理界面,仿UC浏览器多窗口管理界面+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于java开发的安卓多窗口管理界面,仿UC浏览器多窗口管理界面+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于java开发的安卓多窗口管理界面,仿UC浏览器多窗口管理界面+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于java开发的安卓多窗口管理界面,仿UC浏览器多窗口管理界面+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于java开发的安卓多窗口管理界面,仿UC浏览器多窗口管理界面+源码+文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~
exceptionLogs.zip
在当今科技日新月异的时代,智慧社区的概念正悄然改变着我们的生活方式。它不仅仅是一个居住的空间,更是一个集成了先进科技、便捷服务与人文关怀的综合性生态系统。以下是对智慧社区整体解决方案的精炼融合,旨在展现其知识性、趣味性与吸引力。 一、智慧社区的科技魅力 智慧社区以智能化设备为核心,通过综合运用物联网、大数据、云计算等技术,实现了社区管理的智能化与高效化。门禁系统采用面部识别技术,让居民无需手动操作即可轻松进出;停车管理智能化,不仅提高了停车效率,还大大减少了找车位的烦恼。同时,安防报警系统能够实时监测家中安全状况,一旦有异常情况,立即联动物业进行处理。此外,智能家居系统更是将便捷性发挥到了极致,通过手机APP即可远程控制家中的灯光、窗帘、空调等设备,让居民随时随地享受舒适生活。 视频监控与可视对讲系统的结合,不仅提升了社区的安全系数,还让居民能够实时查看家中情况,与访客进行视频通话,大大增强了居住的安心感。而电子巡更、公共广播等系统的运用,则进一步保障了社区的治安稳定与信息传递的及时性。这些智能化设备的集成运用,不仅提高了社区的管理效率,更让居民感受到了科技带来的便捷与舒适。 二、智慧社区的增值服务与人文关怀 智慧社区不仅仅关注科技的运用,更注重为居民提供多元化的增值服务与人文关怀。社区内设有互动LED像素灯、顶层花园控制喷泉等创意设施,不仅美化了社区环境,还增强了居民的归属感与幸福感。同时,社区还提供了智能家居的可选追加项,如空气净化器、远程监控摄像机等,让居民能够根据自己的需求进行个性化选择。 智慧社区还充分利用大数据技术,对居民的行为数据进行收集与分析,为居民提供精准化的营销服务。无论是周边的商业信息推送,还是个性化的生活建议,都能让居民感受到社区的智慧与贴心。此外,社区还注重培养居民的环保意识与节能意识,通过智能照明、智能温控等系统的运用,鼓励居民节约资源、保护环境。 三、智慧社区的未来发展与无限可能 智慧社区的未来发展充满了无限可能。随着技术的不断进步与创新,智慧社区将朝着更加智能化、融合化的方向发展。比如,利用人工智能技术进行社区管理与服务,将能够进一步提升社区的智能化水平;而5G、物联网等新技术的运用,则将让智慧社区的连接更加紧密、服务更加高效。 同时,智慧社区还将更加注重居民的体验与需求,通过不断优化智能化设备的功能与服务,让居民享受到更加便捷、舒适的生活。未来,智慧社区将成为人们追求高品质生活的重要选择之一,它不仅是一个居住的空间,更是一个融合了科技、服务、人文关怀的综合性生态系统,让人们的生活更加美好、更加精彩。 综上所述,智慧社区整体解决方案以其科技魅力、增值服务与人文关怀以及未来发展潜力,正吸引着越来越多的关注与认可。它不仅能够提升社区的管理效率与居民的生活品质,更能够为社区的可持续发展注入新的活力与动力。
2024免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。
回测模型示例(非实盘交易策略) #HS300日线下运行,20个交易日进行 一次调仓,每次买入在买入备选中因子评分前10的股票,每支股票各分配当前可用资金的10%(权重可调整) #扩展数据需要在补完HS300成分股数据之后生成,本模型中扩展数据暂时使用VBA指标ATR和ADTM生成,命名为atr和adtm
Matlab Simulink 下的 Buck和Boost型双向DC-DC变换器:电压电流双闭环PI控制,恒功率负载,优质波形,2020b版本专业搭建,MATLAB Simulink下的Buck与Boost型双向DC-DC变换器:电压电流双闭环PI控制,恒功率负载,优质波形,20b版本全新搭建,matlab simulink:buck型降压双向dc dc变器和boost型升压双向dc dc变器,均采用电压电流双闭环PI控制,负载为恒功率负载,波形质量良好,可自行调试参数 版本matlab2020b,所有部分均由simulink模块搭建,由于部分模块低版本没有,因此只能用20b或以上版本 ,核心关键词: 1. Buck型降压双向DC-DC变换器 2. Boost型升压双向DC-DC变换器 3. 电压电流双闭环PI控制 4. 恒功率负载 5. 波形质量 6. Matlab 2020b 7. Simulink模块搭建 8. 模块版本要求,Matlab Simulink下的双向DC-DC变换器设计与参数调试研究
2024免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。
COMSOL环境下应力作用下瓦斯渗透运移模型的建立及研究——流固耦合物理场的分析与PDE+结构力学模块应用,应力作用下COMSOL岩层开挖瓦斯渗透运移模型:流固耦合物理场考虑与PDE+结构力学模块应用研究,comsol岩层开挖作用下瓦斯渗透运移模型,考虑应力作用下的渗透率变化,流固耦合物理场,使用pde+结构力学模块,参考相关文献建立。 ,核心关键词:COMSOL;岩层开挖;瓦斯渗透运移模型;应力作用;渗透率变化;流固耦合物理场;PDE+结构力学模块;参考文献。,应力作用下瓦斯渗透运移模型研究
deepseek最新资讯、配置方法、使用技巧,持续更新中
电动滑板车电池建模研究:基于MATLAB Simulink的电池与电容模块、BMS模块及仿真参数可视化分析,电动滑板车电池的MATLAB Simulink建模与仿真:涵盖电池与电容模块、BMS管理及参数可视化,电动滑板车的电池建模 MATLAB Simulink模型 包括电池与电容模块、电池管理系统BMS模块、仿真参数可视化等 ,电动滑板车电池建模; MATLAB Simulink模型; 电池与电容模块; BMS模块; 仿真参数可视化,基于MATLAB的电动滑板车电池建模与仿真
永磁同步电机模型预测转矩控制(MPTC)的最优电压矢量实时计算研究参考 参考文章:作者未给出具体的参考文献。可能涉及的领域包括电机控制理论、电力电子技术和自动控制原理等。,永磁同步电机的模型预测转矩控制MPTC:优化电压矢量选择与直接转矩控制的对比研究参考文献:[具体文献名],永磁同步电机模型预测转矩控制MPTC MPTC采用实时在线计算的方式确保预施加的电压矢量为最优电压矢量,与直接转矩控制相比,该方法选取的电压矢量更为合理有效。 提供对应的参考文献; ,关键词:永磁同步电机模型;预测转矩控制(MPTC);实时在线计算;最优电压矢量;直接转矩控制。,永磁同步电机MPTC模型预测转矩控制及其电压矢量优化研究
1、文件内容:xorg-x11-fonts-ISO8859-1-100dpi-7.5-9.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/xorg-x11-fonts-ISO8859-1-100dpi-7.5-9.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
基于浣熊优化算法与多通信半径跳距加权策略的改进Dvhop定位算法研究及性能对比分析,MATLAB: 基于浣熊优化算法与多参数加权策略改进的Dvhop定位算法对比研究报告,matlab:基于浣熊优化算法的多通信半径和跳距加权的改进Dvhop定位算法 - 将浣熊优化算法COA用于Dvhop定位估计,并加入了多通信半径和跳距加权策略 - 将原始Dvhop、COA-Dvhop以及本资源算法进行对比 - 对比1:在不同锚节点比例下,对三种算法进行归一化定位误差对比 - 对比2:在不同通信半径下,对三种算法进行归一化定位误差对比 - 对比3:在不同总节点数下,对三种算法进行归一化定位误差对比 - 注释详细 ,基于浣熊优化算法; 多通信半径; 跳距加权; Dvhop定位算法; 归一化定位误差对比。,基于COA的改进Dvhop定位算法:多通信半径与跳距加权优化
文件内包含训练数据,以及训练好的模型,和模型调用方法
基于模糊逻辑的并联式混合动力车辆控制策略(含WLTC、NEDC工况仿真效果):发动机与电机转矩变化、档位与电池SOC动态调整,百公里燃油消耗与速度跟随性能优化。,基于模糊逻辑的并联式混合动力车辆控制策略:工况下的发动机与电机转矩分配及整车性能仿真研究,基于模糊逻辑的并联式混合动力车辆控制策略 ①(工况可自行添加)已有WLTC、NEDC工况; ②仿真图像包括 发动机转矩变化图像、电机转矩变化图像、档位变化图像、电池SOC变化图像、等效百公里燃油消耗量图像、速度跟随图像、车速变化图像; ③整车similink模型中包含工况输入模型、发动机模型、电机模型、制动能量回收模型、转矩分配模型、档位切模型纵向动力学模型. 仿真效果良好 ,基于模糊逻辑的混合动力控制策略;WLTC、NEDC工况;仿真图像;转矩变化图像;档位变化图像;电池SOC变化;等效百公里燃油消耗;速度跟随;车速变化;整车simulink模型;工况输入模型;发动机模型;电机模型;制动能量回收模型;转矩分配模型;档位切换模型纵向动力学模型。,基于模糊逻辑的混合动力车辆控制策略:多模型协同仿真与工况优化
自适应蚁群优化算法AACO:融合六大改进策略,栅格路径规划的新突破,改进自适应蚁群优化算法:融合多重改进策略应用于栅格路径规划,改进蚁群优化算法(AACO,自己改进的蚁群优化算法) 改进策略包括如下,主要自适应思想 1.自适应信息素重要度因子,自适应阿尔法 2.自适应启发式因子,自适应贝塔 3.改进启发函数 4.信息素奖惩机制 5.自适应挥发系数 6.3次B样条曲线平滑路径 融合这6个改进后的蚁群算法,被应用在解决栅格路径规划,效果如下。 拿后AACO后,ACO、EACO(精英蚁)和AS(序列蚁群)程序都有。 看完AACO代码后,您会对ACO算法有更加清晰的认识,以及如何改进,有利于二次开发优化。 再次优化之处(曲线平滑后路径是更短的,并没有输出,其次曲线会有一定波动,并没有在最优解处收敛) 智能优化算法不可避免每次运行结果不同,多次运行,取最优值即可。 ,AACO; 自适应思想; 改进策略; 自适应信息素重要度因子; 自适应阿尔法; 自适应启发式因子; 改进启发函数; 信息素奖惩机制; 自适应挥发系数; 3次B样条曲线平滑路径; 栅格路径规划; ACO算法; EACO; AS序列蚁群
deepseek最新资讯、配置方法、使用技巧,持续更新中