菜鸟课堂:详解Java多线程开发中的数据同步
<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; for (int i = 0; i < threads.length; i++)threads = new Thread(myThread); for (int i = 0; i < threads.length; i++)threads.start(); for (int i = 0; i < threads.length; i++)threads.join(); System.out.println("n = " + 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">下一页>></span></p></p>
页:
[1]