Java实现互斥的方法
java提供了两种方法来实现互斥,第一种方法是对象监视器(monitor)与synchronized,第二种方法是Java并发包中的锁类。
一.Synchronized
Synchronized有三种用法:
– synchronized 代码块:监视器就是指定的对象。
– synchronized 方法:监视器就是this对象。
– synchronized 静态方法:监视器就是相应的Class对象。
下面是示例代码:
class Resource implements Runnable {
volatile public int i;
volatile public Integer it;
public Resource(int _i){
i = _i;
it = new Integer(i);
}
public void run(){
while(true){
synchronized(it){
if (i>0){
try{
Thread.sleep(200);
}
catch(Exception e){}
i--;
System.out.println(Thread.
currentThread().getName()+" "+i);
}
else{
System.out.println(Thread.
currentThread().getName());
break; }}
}}}
在这里,Synchronized是用来监视代码块,确保同时没有多个线程同时执行代码块中的程序,从而达到互斥的效果。
要尽量保证锁的范围尽可能的小,只在可能产生冲突的地方建立锁,以提高线程的运行效率。
二.ReentrantLock
Java中另一种实现线程互斥的方法是使用ReentrantLock类,如下面的代码:
void put(int i) {
lock.lock(); //使用锁取代同步方法
try{
while(isMoney){
try{
SaveCondition.await(); //存钱线程等待
} catch(Exception e){}
}
value = value + i;
System.out.println("存入"+i+" 账上金额为:"+value);
isMoney = true;//设置标志
FetchCondition.signal(); //唤醒等待资源的取钱线程
} finally {
lock.unlock();
}
}
使用锁来代替同步方法,运用lock方法和unlock方法,也可以保证被锁住的代码块同时只有一个线程在执行。