Я предполагаю, что это для одноэлементного паттерна или чего-то подобного. То, что вы хотите сделать, это не заблокировать ваш объект, а заблокировать счетчик, пока вы его модифицируете.
private static int counter = 0;
private static object counterLock = new Object();
lock(counterLock) {
counter++;
myCounter = counter;
}
Потому что ваш текущий код является избыточным. Особенно в конструкторе, где есть только один поток, который может вызвать конструктор, в отличие от методов, где он может быть разделен между потоками и доступен из любого общего потока.
Из того небольшого, что я могу сказать из вашего кода, вы пытаетесь дать объекту текущий счет во время его создания. Таким образом, с помощью приведенного выше кода счетчик будет заблокирован, пока счетчик обновляется и устанавливается локально. Таким образом, все остальные конструкторы должны будут ждать, пока счетчик не будет освобожден.