WEB开发网
开发学院手机开发Android 开发 Android应用开发之Java基础篇——数据同步 阅读

Android应用开发之Java基础篇——数据同步

 2010-10-14 06:17:00 来源:本站整理   
核心提示:那么在Java中锁在那里呢?首先我们需要明确在Java中“一切皆对象”(加引号是因为基本类型不是对象),都直接或者间接继承Object类,Android应用开发之Java基础篇——数据同步(2),而在基类Object中提供了锁机制,这样可以认为Java中“所有对象”都具有一把锁,一般情况下,保护的数据越小,所有需要访问

那么在Java中锁在那里呢?首先我们需要明确在Java中“一切皆对象”(加引号是因为基本类型不是对象),都直接或者间接继承Object类。而在基类Object中提供了锁机制。这样可以认为Java中“所有对象”都具有一把锁。所有需要访问该对象的线程都可以对其进行加锁解锁操作。

现在Java中已经有锁了,怎样加锁和解锁呢?Java提供了关键字synchronized,synchronized后面跟一个代码域,进入这个域之前获得对象的锁,并对其加锁(如果该锁已经加锁,则阻塞当前线程等待,直到能够获得锁),离开这个域之前对该对象解锁。上例中进行如下修改:

.................

public synchronized void next() {

i++;

i++;

}

public synchronized long getValue() { return i; }

......................

这样当执行next或者getValue方法时,必须要获得对象的锁(在本例中为tc对象的锁)并加锁。当离开方法时解锁,并释放tc对象的锁。

在Java中synchronized关键字不光可以修饰类方法,也可以修改任意的代码段。上面的代码也可以修改为:

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;

synchronized(tc)

{

val = tc.getValue();

}

System.out.println(val);

if(val % 2 != 0)

{

System.exit(0);

}

}

}

}.start();

while(true)

{

synchronized(tc)

{

tc.next();

}

}

}

}

通过上面的代码我们可以看出,synchronized关键字只保护了一段代码,通过种方法可以降低保护的数据的粒度。一般情况下,保护的数据越小,程序运行效率越高。

Tags:Android 应用开发 Java

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接