@startuml package thread-specific-storage { class APP { + {static} main(args : String[]) : void } class Thread { + start() : void } class UserContext { - userId : Long + UserContext(userId : Long) + getUserId() : Long + setUserId(userId : Long) : void } class UserContextProxy { - {static} userContextHolder : ThreadLocal + {static} set(context : UserContext) : void + {static} get() : UserContext + {static} clear() : void } class RequestHandler { - token : String + RequestHandler(token : String) + process() : void - parseToken(token : String) : Long } UserContextProxy --> UserContext : manages RequestHandler --> UserContextProxy : uses static RequestHandler --> UserContext : creates APP --> RequestHandler : creates APP --> Thread : starts Thread --> RequestHandler : executes } @enduml