Когда мы создаем сервлет, почему переменные класса (экземпляры и статические переменные) НЕ являются потокобезопасными?
Servlets обычно запускается на многопоточных серверах. Таким образом, сервлет должен обрабатывать параллельные запросы и должен быть осторожен, чтобы синхронизировать доступ к общим ресурсам. Общие ресурсы включают в себя данные в памяти, такие как переменные экземпляра или класса и внешние объекты, такие как файлы, подключения к базе данных и сетевые подключения. Поскольку несколько потоков могут изменять состояние общих данных, общие данные не являются потокобезопасными.
Почему методы doPost() и doGet() являются потокобезопасными?
doPost() и doGet() потокобезопасны, если вы используете локальные переменные в этих методах. Если вы изменяете состояние общих переменных (экземпляра или статические переменные) в этих методах, doPost() и doGet() не являются потокобезопасными.
У каждого экземпляра есть собственные переменные класса, размещенные в памяти, то почему мы должны сделать эти переменные потоками безопасными?
Один экземпляр существует для одного сервлета. Запросы, такие как doGet()
или doPost()
, создают несколько потоков на одном экземпляре. Пока вы используете локальные varaibles в этих методах, код является потокобезопасным.
Вы можете найти хорошую информацию в этом посте:
How do servlets work? Instantiation, sessions, shared variables and multithreading
Обычно контейнер не будет создавать новый экземпляр сервлета для каждого запроса. –
вам нужно знать, где переменные класса и локальные переменные помещаются в jvm.What являются областью этих переменных. –