阻塞模式

2017-11-28  本文已影响0人  石器时代小古董

一、阻塞模式定义

通过某一个状态保证一个对象的任务还没有完成时,不能执行新的任务。

二、使用场景

1.当有多个线程操作这个对象时,保证对象状态的唯一。

三、核心思想

1.通过判断标志位的状态是否符合条件来判断代码是否执行
2.通过加锁的机制保证多线程下状态的原子性

四、代码实现

参考okhttp中RealCall的execute方法。通过标志位和锁的配合,保证这是一个阻塞式的方法

  // 通过该标志位确保任务是否在执行
  private boolean executed;
  ......
  ......

  @Override
  public Response execute() throws IOException {
   //synchronized关键词锁住当前对象,获得当前对象的锁
    //同一时刻只能有一个任务执行 因为是阻塞式的 由synchronized关键字锁住
    synchronized (this) {
     //通过标志位保证当前对象在执行任务时 不会再重复执行
      if (executed) throw new IllegalStateException("Already Executed");
      executed = true;
    }
     ........
      if (result == null) throw new IOException("Canceled");
      return result;
    } finally {
      client.dispatcher().finished(this);
    }
  }
上一篇下一篇

猜你喜欢

热点阅读