仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 643|回复: 8
打印 上一主题 下一主题

[学习教程] 发布一篇利用Volatile变量仍是原子变量

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:01:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在ruby里才是一切皆对象。当然我不并不是很了解ruby,但是ruby确实是将语法简化得很好。
volatile变量
在Java言语中,volatile变量供应了一种轻量级的同步机制,volatile变量用来确保将变量的更新操纵关照到别的线程,volatile变量不会被缓存到存放器大概对别的处置器不成见的中央,以是在读取volatile变量时总会前往最新写进的值,volatile变量一般用来暗示某个形态标识。
原子变量:
原子变量是“更壮大的volatile”变量,从完成来看,每一个原子变量类的value属性都是一个volatile变量,以是volatile变量的特征原子变量也有。同时,原子变量供应读、改、写的原子操纵,更壮大,更切合一样平常并发场景的需求。
既然原子变量更壮大,是不是另有需要利用volatile变量?假如有甚么时分选择volatile变量,甚么时分选择原子变量?固然这类选择只要在多线程并发的场景下才会呈现,而多线程并发的目标通常为为了进步吞吐量和削减提早呼应,以是仍是先看段测试代码和运转了局吧!
  1. importjava.util.concurrent.CountDownLatch;
  2. importjava.util.concurrent.atomic.AtomicInteger;
  3. publicclassTestVolatile{
  4. privatestaticintCALC_TIME=1000;
  5. privatestaticfinalintTHREAD_NUM=100;
  6. privateAtomicIntegerai;
  7. privateinti;
  8. privatevolatileintvi;
  9. publicTestVolatile(){
  10. ai=newAtomicInteger(0);
  11. i=0;
  12. vi=0;
  13. }
  14. publicstaticvoidmain(String[]args)throwsInterruptedException{
  15. System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
  16. test();
  17. CALC_TIME=10000;
  18. System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
  19. test();
  20. CALC_TIME=100000;
  21. System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
  22. test();
  23. CALC_TIME=1000000;
  24. System.out.println("CalculationTimes:"+CALC_TIME+"----------------------");
  25. test();
  26. }
  27. privatestaticvoidtest()throwsInterruptedException{
  28. testAi();
  29. testI();
  30. testVi();
  31. }
  32. privatestaticvoidtestAi()throwsInterruptedException{
  33. TestVolatiletestVolatile=newTestVolatile();
  34. CountDownLatchbegSignal=newCountDownLatch(1);
  35. CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
  36. for(inti=0;i<THREAD_NUM;i++){
  37. newThread(testVolatile.newWorkerAI(begSignal,endSignal)).start();
  38. }
  39. longstartTime=System.currentTimeMillis();
  40. begSignal.countDown();
  41. endSignal.await();
  42. longendTime=System.currentTimeMillis();
  43. System.out.println("Totaltimeconsumedbyatomicincrement:"+(endTime-startTime));
  44. }
  45. privatestaticvoidtestI()
  46. throwsInterruptedException{
  47. TestVolatiletestVolatile=newTestVolatile();
  48. CountDownLatchbegSignal=newCountDownLatch(1);
  49. CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
  50. for(inti=0;i<THREAD_NUM;i++){
  51. newThread(testVolatile.newWorkerI(begSignal,endSignal)).start();
  52. }
  53. longstartTime=System.currentTimeMillis();
  54. begSignal.countDown();
  55. endSignal.await();
  56. longendTime=System.currentTimeMillis();
  57. System.out.println("Totaltimeconsumedbysynchronizedincrement:"+(endTime-startTime));
  58. }
  59. privatestaticvoidtestVi()
  60. throwsInterruptedException{
  61. TestVolatiletestVolatile=newTestVolatile();
  62. CountDownLatchbegSignal=newCountDownLatch(1);
  63. CountDownLatchendSignal=newCountDownLatch(THREAD_NUM);
  64. for(inti=0;i<THREAD_NUM;i++){
  65. newThread(testVolatile.newWorkerVI(begSignal,endSignal)).start();
  66. }
  67. longstartTime=System.currentTimeMillis();
  68. begSignal.countDown();
  69. endSignal.await();
  70. longendTime=System.currentTimeMillis();
  71. System.out.println("Totaltimeconsumedbyvolatileincrement:"+(endTime-startTime));
  72. }
  73. publicvoidincrAi(){
  74. ai.getAndIncrement();
  75. }
  76. publicsynchronizedvoidincrI(){
  77. i++;
  78. }
  79. /**
  80. *这个函数不是线程平安,极可能失掉毛病的了局,这里只是为了测试读取volatile变量的效力
  81. */
  82. publicvoidincrVi(){
  83. vi++;
  84. }
  85. classWorkerAIimplementsRunnable{
  86. privateCountDownLatchbeginSignal;
  87. privateCountDownLatchendSignal;
  88. publicWorkerAI(CountDownLatchbegin,CountDownLatchend){
  89. this.beginSignal=begin;
  90. this.endSignal=end;
  91. }
  92. @Override
  93. publicvoidrun(){
  94. try{
  95. beginSignal.await();
  96. }catch(InterruptedExceptione){
  97. e.printStackTrace();
  98. }
  99. for(intj=0;j<CALC_TIME;j++){
  100. incrAi();
  101. }
  102. endSignal.countDown();
  103. }
  104. }
  105. classWorkerIimplementsRunnable{
  106. privateCountDownLatchbeginSignal;
  107. privateCountDownLatchendSignal;
  108. publicWorkerI(CountDownLatchbegin,CountDownLatchend){
  109. this.beginSignal=begin;
  110. this.endSignal=end;
  111. }
  112. @Override
  113. publicvoidrun(){
  114. try{
  115. beginSignal.await();
  116. }catch(InterruptedExceptione){
  117. e.printStackTrace();
  118. }
  119. for(intj=0;j<CALC_TIME;j++){
  120. incrAi();
  121. }
  122. endSignal.countDown();
  123. }
  124. }
  125. classWorkerVIimplementsRunnable{
  126. privateCountDownLatchbeginSignal;
  127. privateCountDownLatchendSignal;
  128. publicWorkerVI(CountDownLatchbegin,CountDownLatchend){
  129. this.beginSignal=begin;
  130. this.endSignal=end;
  131. }
  132. @Override
  133. publicvoidrun(){
  134. try{
  135. beginSignal.await();
  136. }catch(InterruptedExceptione){
  137. e.printStackTrace();
  138. }
  139. for(intj=0;j<CALC_TIME;j++){
  140. incrVi();
  141. }
  142. endSignal.countDown();
  143. }
  144. }
  145. }
复制代码
<p>
认真的记,感觉很紧张根本就没有时间和能力,来对技术知识点进行思考。这样课下就只能对知识进行简单的理解,其实简单的理解就是记忆课堂上讲的知识点,
爱飞 该用户已被删除
沙发
发表于 2015-1-20 12:45:19 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
若相依 该用户已被删除
板凳
 楼主| 发表于 2015-1-21 16:28:21 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
金色的骷髅 该用户已被删除
地板
发表于 2015-1-30 21:08:56 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
分手快乐 该用户已被删除
5#
发表于 2015-2-6 15:58:58 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
蒙在股里 该用户已被删除
6#
发表于 2015-2-16 23:48:41 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-5 12:25:37 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
飘飘悠悠 该用户已被删除
8#
发表于 2015-3-12 06:57:54 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
admin 该用户已被删除
9#
发表于 2015-3-19 18:33:57 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 13:35

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表