#methods #struts #synchronized #struts1
#методы #struts #синхронизированный #struts1
Вопрос:
я хотел бы проверить, что значит иметь синхронизированный метод экземпляра в классе действий Struts 1?
Что-то вроде
public synchronized String checkAction(){ ... }
Ответ №1:
Это означает, что метод checkAction будет синхронизирован внутренней блокировкой заключающего объекта (блокировка объекта класса Action). Таким образом, только один поток одновременно сможет получить доступ к методу checkAction.
В Struts 1 класс действий не является потокобезопасным. Таким образом, несколько потоков (например, обслуживающих несколько запросов) будут обращаться к одному и тому же экземпляру класса действий. Нужно ли синхронизировать метод? Я не уверен — только вы можете сказать, что происходит в методе. Пока он не обращается к переменным экземпляра класса действий или не выполняет что-то, что может быть выполнено только одним потоком одновременно, синхронизация, вероятно, не нужна.
Комментарии:
1. Могу ли я перефразировать свою интерпретацию вашего ответа выше, чтобы убедиться, что я правильно это понимаю. Это означает, что, поскольку классы действий struts 1 не являются потокобезопасными, и поскольку они являются одиночными, создание метода внутри класса действий struts позволяет получить доступ только к 1 потоку одновременно. спасибо.
2. Создание метода, синхронизированного внутри класса действий, обеспечивает доступ только к 1 потоку за раз. Если он не синхронизирован, то может войти столько потоков, сколько в него брошено (обычно, почему вы не используете переменные экземпляра для хранения состояния в компоненте действия)
3. Да, и synchronized не является правильным решением этой проблемы (потому что это создает узкое место). Правильное решение — использовать только локальные переменные. Если у вас нет переменных экземпляра, то вам не нужна синхронизация. Если вам нужны переменные экземпляра, то создайте вспомогательный класс, поместите их туда и создавайте экземпляр помощника для каждого запроса.