@startuml package com.iluwatar.reader.writer.lock { class App { - LOGGER : Logger {static} + App() + main(args : String[]) {static} } class Reader { - LOGGER : Logger {static} - name : String - readLock : Lock - readingTime : long + Reader(name : String, readLock : Lock) + Reader(name : String, readLock : Lock, readingTime : long) + read() + run() } class ReaderWriterLock { - LOGGER : Logger {static} - currentReaderCount : int - globalMutex : Set - readerLock : ReadLock - readerMutex : Object - writerLock : WriteLock + ReaderWriterLock() - doesWriterOwnThisLock() : boolean - isLockFree() : boolean + readLock() : Lock + writeLock() : Lock } -class ReadLock { - ReadLock() - acquireForReaders() + lock() + lockInterruptibly() + newCondition() : Condition + tryLock() : boolean + tryLock(time : long, unit : TimeUnit) : boolean + unlock() } -class WriteLock { - WriteLock() + lock() + lockInterruptibly() + newCondition() : Condition + tryLock() : boolean + tryLock(time : long, unit : TimeUnit) : boolean + unlock() } class Writer { - LOGGER : Logger {static} - name : String - writeLock : Lock - writingTime : long + Writer(name : String, writeLock : Lock) + Writer(name : String, writeLock : Lock, writingTime : long) + run() + write() } } ReaderWriterLock --> "-readerLock" ReadLock ReadLock --+ ReaderWriterLock WriteLock --+ ReaderWriterLock ReaderWriterLock --> "-writerLock" WriteLock @enduml