Android应用开发之Java基础篇——数据同步
2010-10-14 06:17:00 来源:本站整理本文简单介绍Java的数据同步机制(本文面向从C/C++转向Android应用开发的开发人员)。
什么情况需要数据同步?
首先我们看一个例子,通过例子我们引入数据同步问题:
public class TestCompete
{
private long i;
public void next() {
i++;
i++;
}
public long getValue() { return i; }
public static void main(String[] argv)
{
final TestCompete tc = new TestCompete();
new Thread() {
public void run()
{
while(true)
{
long val = tc.getValue();
System.out.println(val);
if(val % 2 != 0)
{
System.exit(0);
}
}
}
}.start();
while(true)
tc.next();
}
}
通过上例我们可以看到,外部类TestCompete提供获得数据的方法getValue和修改数据的方法next,在主线程中循环修改 TestCompete对象tc的值,而在工作线程中,循环读取tc的值(请注意匿名Thread类可以访问外部类的数据,请参考《Android应用开发之Java基础篇——内部类》)。这样这两个线程就出现竞争关系,有可能主线程的next方法执行了一半,而调度程序调度了工作线程getValue方法,这样工作线程将会得到奇数,程序结束。
这个程序在我的Ubuntu虚拟机中,运行不到10s就会结束,但是在Unix Center的服务器上,运行几个小时都不会出错,看来Unix Center的服务器多线程处理能力比我的本机强很多啊。
通过这个例子我们可以看到多个线程同时读写(注意是读和写,假如所有线程都读,那么将不会出现不一致问题)同一数据时,将有可能出现数据不一致问题。我觉得有以下情况需要注意数据同步的问题:
1、匿名Thread内部类访问外部类数据,如上例所示。
2、多个线程访问同一个类的静态数据。
3、多个线程同时读写同一个文件,Socket,或者管道等IO对象。
Java的解决数据同步的方法
熟悉多线程编程的朋友都知道,为了防止数据不一致,通过数据加锁/解锁操作来保护,在Linux中多线程编程是Mutex来进行数据保护。Java也是通过提供这种机制来解决数据同步问题的。
更多精彩
赞助商链接