仓酷云
标题:
发布一篇利用Volatile变量仍是原子变量
[打印本页]
作者:
若相依
时间:
2015-1-18 11:01
标题:
发布一篇利用Volatile变量仍是原子变量
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。
volatile变量
在Java言语中,volatile变量供应了一种轻量级的同步机制,volatile变量用来确保将变量的更新操纵关照到别的线程,volatile变量不会被缓存到存放器大概对别的处置器不成见的中央,以是在读取volatile变量时总会前往最新写进的值,volatile变量一般用来暗示某个形态标识。
原子变量:
原子变量是“更壮大的volatile”变量,从完成来看,每一个原子变量类的value属性都是一个volatile变量,以是volatile变量的特征原子变量也有。同时,原子变量供应读、改、写的原子操纵,更壮大,更切合一样平常并发场景的需求。
既然原子变量更壮大,是不是另有需要利用volatile变量?假如有甚么时分选择volatile变量,甚么时分选择原子变量?固然这类选择只要在多线程并发的场景下才会呈现,而多线程并发的目标通常为为了进步吞吐量和削减提早呼应,以是仍是先看段测试代码和运转了局吧!
importjava.util.concurrent.CountDownLatch;
importjava.util.concurrent.atomic.AtomicInteger;
publicclassTestVolatile{
privatestaticintCALC_TIME=1000;
privatestaticfinalintTHREAD_NUM=100;
privateAtomicIntegerai;
privateinti;
privatevolatileintvi;
publicTestVolatile(){
ai=newAtomicInteger(0);
i=0;
vi=0;
}
publicstaticvoidmain(String[]args)throwsInterruptedException{
System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
test();
CALC_TIME=10000;
System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
test();
CALC_TIME=100000;
System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
test();
CALC_TIME=1000000;
System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
test();
}
privatestaticvoidtest()throwsInterruptedException{
testAi();
testI();
testVi();
}
privatestaticvoidtestAi()throwsInterruptedException{
TestVolatiletestVolatile=newTestVolatile();
CountDownLatchbegSignal=newCountDownLatch(1);
CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
for(inti=0;i<THREAD_NUM;i++){
newThread(testVolatile.newWorkerAI(begSignal,endSignal)).start();
}
longstartTime=System.currentTimeMillis();
begSignal.countDown();
endSignal.await();
longendTime=System.currentTimeMillis();
System.out.println("Totaltimeconsumedbyatomicincrement:"+(endTime-startTime));
}
privatestaticvoidtestI()
throwsInterruptedException{
TestVolatiletestVolatile=newTestVolatile();
CountDownLatchbegSignal=newCountDownLatch(1);
CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
for(inti=0;i<THREAD_NUM;i++){
newThread(testVolatile.newWorkerI(begSignal,endSignal)).start();
}
longstartTime=System.currentTimeMillis();
begSignal.countDown();
endSignal.await();
longendTime=System.currentTimeMillis();
System.out.println("Totaltimeconsumedbysynchronizedincrement:"+(endTime-startTime));
}
privatestaticvoidtestVi()
throwsInterruptedException{
TestVolatiletestVolatile=newTestVolatile();
CountDownLatchbegSignal=newCountDownLatch(1);
CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
for(inti=0;i<THREAD_NUM;i++){
newThread(testVolatile.newWorkerVI(begSignal,endSignal)).start();
}
longstartTime=System.currentTimeMillis();
begSignal.countDown();
endSignal.await();
longendTime=System.currentTimeMillis();
System.out.println("Totaltimeconsumedbyvolatileincrement:"+(endTime-startTime));
}
publicvoidincrAi(){
ai.getAndIncrement();
}
publicsynchronizedvoidincrI(){
i++;
}
/**
*这个函数不是线程平安,极可能失掉毛病的了局,这里只是为了测试读取volatile变量的效力
*/
publicvoidincrVi(){
vi++;
}
classWorkerAIimplementsRunnable{
privateCountDownLatchbeginSignal;
privateCountDownLatchendSignal;
publicWorkerAI(CountDownLatchbegin,CountDownLatchend){
this.beginSignal=begin;
this.endSignal=end;
}
@Override
publicvoidrun(){
try{
beginSignal.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(intj=0;j<CALC_TIME;j++){
incrAi();
}
endSignal.countDown();
}
}
classWorkerIimplementsRunnable{
privateCountDownLatchbeginSignal;
privateCountDownLatchendSignal;
publicWorkerI(CountDownLatchbegin,CountDownLatchend){
this.beginSignal=begin;
this.endSignal=end;
}
@Override
publicvoidrun(){
try{
beginSignal.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(intj=0;j<CALC_TIME;j++){
incrAi();
}
endSignal.countDown();
}
}
classWorkerVIimplementsRunnable{
privateCountDownLatchbeginSignal;
privateCountDownLatchendSignal;
publicWorkerVI(CountDownLatchbegin,CountDownLatchend){
this.beginSignal=begin;
this.endSignal=end;
}
@Override
publicvoidrun(){
try{
beginSignal.await();
}catch(InterruptedExceptione){
e.printStackTrace();
}
for(intj=0;j<CALC_TIME;j++){
incrVi();
}
endSignal.countDown();
}
}
}
复制代码
<p>
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,
作者:
爱飞
时间:
2015-1-20 12:45
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者:
若相依
时间:
2015-1-21 16:28
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者:
金色的骷髅
时间:
2015-1-30 21:08
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者:
分手快乐
时间:
2015-2-6 15:58
Java是一种计算机编程语言,拥有跨平台、面向对java
作者:
蒙在股里
时间:
2015-2-16 23:48
是一种将安全性(Security)列为第一优先考虑的语言
作者:
愤怒的大鸟
时间:
2015-3-5 12:25
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
飘飘悠悠
时间:
2015-3-12 06:57
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者:
admin
时间:
2015-3-19 18:33
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2