Java的互斥

Java里做互斥还是很有意思的,不象C/C++,互斥依赖于平台实现。Java中的互斥是语言天生就提供的,Java有一个synchronized关键字,用来代替一般意义的lock/unlock,这样的好处起码是保证了lock/unlock的成对使用,另外代码看起来也清楚一些。而且Java里也不需要创建和删除互斥量,每个对象(Object)都带有一个互斥量,一般用这个就够用了。synchronized有好几种用法:

synchronized方法

这个是最常见的,直接在方法前面加synchronized,效果相当于进入方法时会lock这个对象,退出时unlock,这种方法加锁简单可靠,比如

public synchronized void method1(){

//do something under lock
}

但这种方法显然可能造成互斥区域扩大的风险,因为函数里的所有语句都自动放在互斥区内部了,这有时会影响效率。

synchronized语句

为了减小互斥区,可以直接使用synchronized语句,象这样:

private Object mutex = new Object();
public void method2(){
synchronized(mutex)
{
//do something under lock
}
//do otherthing
}

这种方法使用上更接近于C/C++的用法了,只是用一个Object来做互斥量了。

静态synchronized方法

语法上,Java也是支持在static method上加synchronized的,不过这就相当于lock了整个Class的锁了(非static的synchronized锁是基于对象的),粒度更大,这种用法我还没用过,书上如是说的。

最后,不要和Java1.5新的semphore混淆,Java1.5所提供的Semphore相当于大部分操作系统提供的计数器信号量,一般不用于做互斥(因为不能嵌套)。

相关文章


Leave a Reply