一、阻塞模式定义
通过某一个状态保证一个对象的任务还没有完成时,不能执行新的任务。
二、使用场景
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);
}
}
网友评论