Métodos IEnumerable Linq são thread-safe?

Gostaria de saber se os métodos de extensão do Linq são atômicos? Ou eu precisolock qualquerIEnumerable objeto usado em threads, antes de qualquer tipo de iteração?

Declarando a variável comovolatile tem algum efeito sobre isso?

Para resumir, qual das seguintes opções é a melhor operação segura?

1- Sem bloqueios:

IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition

2- Incluindo instruções de bloqueio:

IEnumerable<T> _objs = //...
lock(_objs)
{
    var foo = _objs.FirstOrDefault(t => // some condition
}

3- Declarando variável como volátil:

volatile IEnumerable<T> _objs = //...
var foo = _objs.FirstOrDefault(t => // some condition

questionAnswers(2)

yourAnswerToTheQuestion