• 让天下没有难学的技术
    多数学员都来自推荐,这就是口碑的力量

Java开发之实现互斥的方法

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方法,也可以保证被锁住的代码块同时只有一个线程在执行。

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注