read<T> method
Run body under a shared (read) lock. Multiple readers may run
concurrently. The lock is released even if body throws.
Implementation
Future<T> read<T>(FutureOr<T> Function() body) async {
await _acquireRead();
try {
return await body();
} finally {
_releaseRead();
}
}