Является ли вышеуказанный подход безопасным для потоков?
Ответ зависит от того, что, по вашему мнению, означает "безопасный для потоков". В вашем методе reset()
нет ничего, что препятствовало бы тому, чтобы поток, который ранее вызывал getInstance()
, продолжал использовать старый экземпляр.
Является ли это "потокобезопасным?"
Вообще говоря, "Потокобезопасный »означает, что действия одного потока никогда не могут привести к тому, что другие потоки увидят общие данные в несогласованном или недопустимом состоянии. Но что означает «противоречивый» или «недействительный», зависит от структуры общих данных (т. Е. От дизайна приложения).
Другой взгляд на это: если кто-то скажет вам, что класс является "потокобезопасным", тогда они, вероятно, говорят вам, что одновременные вызовы методов класса несколькими потоками не будут делать ничего, что не согласуется с документацией класса, и не будут делать ничего, что не согласуется скак разумный программист считает, что класс должен вести себя в тех случаях, когда документация не совсем ясна.
ПРИМЕЧАНИЕ. Это более слабое определение «безопасности потоков», поскольку оно закрывает тот факт, чтоиспользование поточно-ориентированных компонентов для построения системы не гарантирует, что сама система будет поточно-ориентированной.
Все ли, кто использует ваш класс ясно , понимают, что ни один поток в программе не можеткогда-либо звоните reset()
, в то время как любая ссылка на старый синглтон все еще существует? Если так, то я бы назвал это слабым замыслом, потому что он очень далек от того, чтобы быть «безопасным для младших программистов», но я бы неохотно признал, что со строгой, языковой, юридической точки зрения вы могли бы назвать свой ObjectFactory
класс " нить сейф."