Como posso implementar um wrapper de lista segura de threads no Delphi?

Eu tenho um wrapper de lista que mantém duas Tstringlists e uma TClassList

Eu preciso que isso seja seguro para threads, de modo que:

Gravações simultâneas não são permitidas (o estado de espera de algum tipo deve ser inserido)A leitura durante a escrita (ou vice-versa) não é permitida (deve ser inserido um estado de espera de algum tipo)Leituras simultâneasestão permitido

Alguma idéia de como eu posso fazer isso? Meu instinto me diz que precisa mais do que apenas uma seção crítica, talvez um semáforo ou "contador de uso", talvez um deles emconjunção com um CS.

Não sei por onde começar - qualquer coisa, desde uma abordagem geral em inglês ao código psuedo, à implementação do delphi ou ao link externo, seria muito apreciada.