РЕДАКТИРОВАТЬ: Ой, я не уловил часть «Уровни доступа к данным». Но у меня также есть пример этого: если ваше многопоточное приложение направляет все свои вызовы базы данных через одноэлементный класс, только один поток когда-либо будет обращаться к базе данных одновременно, избегая условий гонки.
Если у вас есть механизм ведения журнала в многопоточном приложении, которое вы используете, чтобы выплевывать все исключения и просто записывать информацию (особенно для служб или приложений, которые всегда работают, распечатывать статусы всякий раз, когда что-то происходит), вы будете столкнуться с проблемами блокировки файлов. Я использую класс одноэлементного регистратора, так что только один поток когда-либо будет иметь доступ к регистратору, а остальные будут ждать, пока регистратор сможет написать свою строку в текстовом файле.
Есть много классных причин использовать синглтон, но я был похож на вас и не знал, для чего они предназначены, пока не столкнулся с этой проблемой с доступом к файлам в многопоточном приложении.