Нет, вы не сделали эти вызовы поточно-ориентированными - потому что поле _stringArrayList
защищено.Подклассы могут делать с ним все, что им нравится, пока вызываются AddString
и ToString
.
Например (как и в других ответах, утверждается, что ваш код является поточно-ориентированным.)
public class BadStringMe : StringMe
{
public void FurtleWithList()
{
while (true)
{
_stringArrayList.Add("Eek!");
_stringArrayList.Clear();
}
}
}
Тогда:
BadStringMe bad = new BadStringMe();
new Thread(bad.FurtleWithList).Start();
bad.AddString("This isn't thread-safe");
Предпочитайте личные поля - это упрощает анализ вашего кода.
Дополнительно:
- Предпочитаю от
List<T>
до ArrayList
в эти дни - По какой-то причине вы блокируете переменную static ... даже если у вас есть несколько экземпляров
StringMe
только одна нить может быть в AddString
одновременно в общей сложности - Использование
typeof(string)
намного чище, чем Type.GetType("System.String")
3) Только методы, которые изменяют данные, должны быть заблокированы, или же операции блокировки чтения и записи должны быть заблокированы, чтобы сделать их потокобезопасными?
Все, предполагая, что может быть некоторые операции.Если все просто читает, вам не нужны никакие блокировки - но в противном случае ваши потоки чтения могут считывать два бита данных из структуры данных, которые были изменены между ними, даже если есть только один запись поток.(Есть также соображения о модели памяти, о которых следует помнить.)