Я добавлю к совету @ nevermind, так как он / она сделал несколько очень практических замечаний.
Будьте практичны в том, что вам нужно изменить, чтобы выполнить свою задачу, поскольку волшебного пути нет. Ваш существующий код, хорошо спроектированный или нет, может нуждаться только в небольших изменениях в зависимости от того, как он используется. Конечно, это также означает, что полная модернизация также может быть в порядке.
Никто здесь не может знать (если они не написали оригинальный код; -)
Например, если вам нужно только сделать доступ к одному объекту (одноэлементному или нет) потокобезопасным, это довольно легко сделать, возможно, без какого-либо воздействия на код вызывающего объекта такого объекта.
С другой стороны, если вам нужно изменить несколько объектов одновременно, чтобы сохранить целостность ваших данных / состояния, тогда ваши усилия будут значительно сложнее.