Android应用开发之Java基础篇——数据同步
2010-10-14 06:17:00 来源:本站整理那么在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关键字只保护了一段代码,通过种方法可以降低保护的数据的粒度。一般情况下,保护的数据越小,程序运行效率越高。
更多精彩
赞助商链接