设为首页收藏本站language 语言切换
查看: 1307|回复: 0
收起左侧

菜鸟课堂:详解Java多线程开发中的数据同步

[复制链接]
发表于 2010-2-20 13:54:58 | 显示全部楼层 |阅读模式
<p >Java中的变量分为两类:局部变量和类变量。局部变量是指在方法内定义的变量,如在run方法中定义的变量。对于这些变量来说,并不存在线程之间共享的问题。因此,它们不需要进行数据同步。类变量是在类中定义的变量,作用域是整个类。这类变量可以被多个线程共享。因此,我们需要对这类变量进行数据同步。<p ><p >数据同步就是指在同一时间,只能由一个线程来访问被同步的类变量,当前线程访问完这些变量后,其他线程才能继续访问。这里说的访问是指有写操作的访问,如果所有访问类变量的线程都是读操作,一般是不需要数据同步的。<p ><p >那么如果不对共享的类变量进行数据同步,会发生什么情况呢?让我们先看看下面的代码会发生什么样的事情:<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>package test;public class MyThread extends Thread {   public static int n = 0;   public void run()    {      int m = n;yield();      m++;n = m;    }   public static void main(String[] args) throws Exception   {    MyThread myThread = new MyThread ();    Thread threads[] = new Thread[100];    for (int i = 0; i &lt; threads.length; i++)threads = new Thread(myThread);    for (int i = 0; i &lt; threads.length; i++)threads.start();    for (int i = 0; i &lt; threads.length; i++)threads.join();    System.out.println(&quot;n = &quot; + MyThread.n);   }}</ccid_code></pre></td></tr></table></ccid_nobr><br><p ><p >在执行上面代码的可能结果如下:<p ><p >n = 59<p ><p >看到这个结果,可能很多读者会感到奇怪。这个程序明明是启动了100个线程,然后每个线程将静态变量n加1.最后使用join方法使这100个线程都运行完后,再输出这个n值。按正常来讲,结果应该是n = 100。可偏偏结果小于100。                                 <p align="center"><font color="FF0000" >1</font>2<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 18:19 , Processed in 0.093592 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

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