Что касается клонирования, переполнение стека уже имеет хороший ответ.
Глубокое клонирование объектов
Что касается безопасности потоков, я бы предположил, что единственная гарантия состоит в том, что вы устанавливаете блокировки вокруг переменных-членов во время копирования.
Обновление:
Хорошо, я провел небольшое исследование. Я думаю, что самый элегантный способ обеспечить безопасность потоков ваших членов - это чтобы вызывающие потоки удерживали блокировки на объекте, а не пытались реализовать его внутри вашего класса. Кроме того, реализуйте интерфейс ICloneable, и тогда вы сможете легко сделать двоичную копию всего объекта. Смотрите ответ в ссылке, которую я разместил выше. Конечно, вы все еще можете легко реализовать блокировки для ваших статических членов внутри вашего класса.