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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值