` @ObjectiveCName("getRecord:")
public Record getRecord( String name ) {
Record record = null;
recordsLock.lock();
try {
record = records.get( name );
if( record == null ) {
record = createRecord(name);
recordsLock.unlock();
record.start();
} else if (record.getAndIncrementUsage() <= 0) {
// Some other thread is discarding this record. We need the record out of the records
// map before we can put the new record there so we will finish the discard here. Either this
// thread or the other thread will end up finishing the discard.
record.finishDiscard();
assert records.get(name) == null;
record = createRecord(name);
recordsLock.unlock();
record.start();
}
} finally {
if (recordsLock.isHeldByCurrentThread()) {
recordsLock.unlock();
}
}
if (!record.isReady()) {
final CountDownLatch readyLatch = new CountDownLatch(1);
record.whenReady(new Record.RecordReadyListener() {
@Override
public void onRecordReady(String recordName, Record record) {
readyLatch.countDown();
}
});
try {
readyLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return record;
}`
this method does not return record object when more than one thread tried to access it.
` @ObjectiveCName("getRecord:") public Record getRecord( String name ) { Record record = null;
this method does not return record object when more than one thread tried to access it.