Quando sul forum vedo domande sul multithreading, spesso il subbio riguarda quando e come proteggere i membri di una classe per poter accedere in modo sicuro da più thread contemporaneamente.
La risposta classica è sempre la stessa: se c'è la possibilità che durante una operazione di scrittura un altro thread acceda in read o write lo stesso membro condiviso, allora deve essere protetto per tutte le operazioni di read e/o write con una critical section (statement lock di c# o SyncLock di vb.net) o sistema analogo.
Un'interessante eccezione concerne la Hashtable. Questa classe infatti nasce thread safe per un writer e molteplici reader. (In pratica ingloba dentro di se il comportamento che possiamo ottenere con la classe ReaderWriterLock.)
Questo ci permette di proteggere solo le operazioni di scrittura. Proteggendo solo le scritture avremo solo un writer e infiniti reader, rispettando così il requisito della Hashtable.