Cómo hacer una variable estática segura para subprocesos

Tengo esta clase estática que contiene una variable estática (un int simple). He implementado unlock() en elRun() Método de los subprocesos, por lo que ningún otro subproceso puede acceder a esta clase al mismo tiempo, pero la variable aún se vuelve loca, mostrando duplicados, valores increíblemente altos, etc.

Esta es la clase:

public static class ExplorationManager
{
    public static int Counter = 0;

    public static void ExplorerMaker(List<int[]> validPaths, List<string> myParents, string[,] myExplorationMap, List<int[]> myPositions)
    {
        foreach (var thread in validPaths.Select
        (path => new Explorer(myParents, path, myExplorationMap, myPositions)).
        Select(explorer => new Thread(explorer.Explore)))
            {
                thread.Name = "Thread of " + Counter + " generation";
                Counter++; 
                thread.Start();
    }
}

}

¿Hay alguna manera de hacer que esta variable sea "más" segura para subprocesos?

Respuestas a la pregunta(6)

Su respuesta a la pregunta