То, что вы опубликовали, выглядит хорошо с точки зрения многопоточности. Хотя я могу ошибаться, может показаться, что любой другой код, который выполняет многопоточность (даже используя объект foo), должен быть безопасным. Конечно, я не вижу никаких тупиков в этом разделе кода.
В любом случае стоит отметить несколько вещей (кроме того, что нужно быть очень осторожным с блокировками и тщательно проверять, чтобы убедиться, что они не возникнут):
- Лучше поставить блокировку вокруг кода внутри конструктора, так как я считаю, что возможно при определенных обстоятельствах, что методы могут быть вызваны до завершения выполнения блока конструктора. (Кто-то, пожалуйста, поправьте меня, если я ошибаюсь в этом.)
- Объект
StreamWriter
в этом случае является приватным, что хорошо. Если бы он был защищенным или внутренним, вам, безусловно, следовало бы быть осторожным с тем, как другой код использует объект (на самом деле, я думаю, что было бы лучше почти всегда объявлять такие объекты как частные).
- Вы сделали правильную блокировку! Всегда безопаснее заблокировать отдельный объект частного экземпляра, потому что вы знаете , что этот объект не может быть заблокирован каким-либо другим кодом, кроме вашего (что не так, если вы блокируете
this
или StreamWriter
сам объект).
Тем не менее, я могу что-то упустить, и есть небольшая вероятность того, что какой-то другой код, не показанный выше, может вызвать проблемы, но, насколько я понимаю, этот код не ошибочен, за исключением возможного отсутствует блокировка вокруг кода конструктора. С большей вероятностью вам придется остерегаться тупиковых ситуаций, когда вы начнете выполнять более сложные многопоточности, особенно между классами / экземплярами.
В любом случае, надеюсь, это поможет.