仓酷云

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

[学习教程] 来看Java多线程初学者指南(6):稳重利用volatile关头字

[复制链接]
愤怒的大鸟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:31:56 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。
volatile关头字信任懂得Java多线程的读者都很分明它的感化。volatile关头字用于声明复杂范例变量,如int、float、boolean等数据范例。假如这些复杂数据范例声明为volatile,对它们的操纵就会酿成原子级其余。但这有必定的限定。比方,上面的例子中的n就不是原子级其余:
package mythread;

public class JoinThread extends Thread
{
 public staticvolatileint n = 0;
 public void run()
 {
  for (int i = 0; i < 10; i++)
   try
   {
    n = n + 1;
    sleep(3); // 为了使运转了局更随机,提早3毫秒

   }
   catch (Exception e)
   {
   }
 }

 public static void main(String[] args) throws Exception
 {

  Thread threads[] = new Thread[100];
  for (int i = 0; i < threads.length; i++)
   // 创建100个线程
   threads[i] = new JoinThread();
  for (int i = 0; i < threads.length; i++)
   // 运转方才创建的100个线程
   threads[i].start();
  for (int i = 0; i < threads.length; i++)
   // 100个线程都实行完后持续
   threads[i].join();
  System.out.println("n=" + JoinThread.n);
 }
}
假如对n的操纵是原子级其余,最初输入的了局应当为n=1000,而在实行下面积代码时,良多时侯输入的n都小于1000,这申明n=n+1不是原子级其余操纵。缘故原由是声明为volatile的复杂变量假如以后值由该变量之前的值相干,那末volatile关头字不起感化,也就是说以下的表达式都不是原子操纵:
n = n + 1;
n++;
<p>
而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-2 21:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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