Должен ли я действительно заботиться о поточно-безопасной проблеме в классе действия сервлета - PullRequest
0 голосов
/ 18 ноября 2011

Класс сервлета обрабатывает объект входящего запроса, извлекает данные и сохраняет их в StringBuilder / StringBuffer и передает данные другому классу для записи в файл.

ActionClass
    public void doPost(HttpServletRequest request,HttpServletResponse response)
   throws ServletException,IOException {
        String fileName = request.getparameter("fileName");
        String body = request.getParameter("innerHTML");
        String head = request.getParameter("headContents");

        StringBuilder sbr = new StringBuilder();
        sbr.append(body);  sbr.append(head);
                        OR
        StringBuffer sbf = new StringBuffer();
         sbf.append(body);  sbf.append(head);

   FileWrite fw = new FileWrite(fileName, sbf/sbr); /* write the data into file*/
          }

FileWrite

    class FileWrite{
       public FileWrite(String fileName, StringBuilder sbf){
        boolean isExist = checkFileName(fileName);  /* return true or false */
         if(isExist){
           String name =  reName(fileName);  /* rename & return new name */
                 /* write the file in new file */
          }else{  /* write in same file name */  }
      }

   public String reName(String oldName){
             /* rename oldName as newName & checks via isExist(newName) */
            } 

   public boolean isExist(String filename) {
         // checks the file in directory, if found already
       return true;
           else return false;
         }
    }

Как вы можете видеть в примере выше, класс действия передает данные в FileWrite class, который записывает данные в новый файл. сотни клиентов могут одновременно отправить запрос на сохранение данных в новом файле.
поэтому мой вопрос, в классе сервлетов, что я должен использовать для хранения данных. это String or stringBuffer or StringBuilder ?? это вопрос безопасности потока?

Ответы [ 6 ]

3 голосов
/ 18 ноября 2011

Да, вы должны заботиться о проблемах безопасности потоков, но проблема безопасности потоков не в вашем выборе String или stringBuffer или StringBuilder.

Где вы должны следить (потенциально) за безопасностью потоковесли вы получаете два запроса на одно и то же имя файла в свой класс FileWriter.

Кроме того, я хотел бы отметить, что с точки зрения безопасности довольно опасно просто брать необработанные местоположения файлов непосредственно из параметра get - так как пользователи могутперезаписать другие пользовательские файлы или (возможно, в зависимости от разрешений) даже файлы ОС.

2 голосов
/ 18 ноября 2011

Пока это происходит внутри doGet или doPost вашего сервлета, вы имеете дело только с одним потоком.Таким образом, нет необходимости в безопасности потоков, что означает, что вы должны использовать StringBuilder, который работает быстрее, чем StringBuffer.

1 голос
/ 18 ноября 2011

При каждом новом запросе создается новый поток сервлета, имеющий собственный правильно упакованный уникальный контекст. Таким образом, данные внутри doPost doGet сохраняются в этом контексте и, таким образом, защищены от других запросов.

Что касается String vs StringBuffer vs StringBuilder, поскольку сам контекст является поточно-ориентированным, проблем с синхронизацией нет, и поэтому вы можете перейти к springbuilder.

С другой стороны: если не произойдет никаких изменений, почему бы не перейти к простой строке ??

Кстати ... обратите внимание на два запроса на один и тот же файл !!

0 голосов
/ 14 марта 2016

Ваш кодер является Потоково-безопасным, это не имеет проблем в многопоточной среде. Поскольку ваш ServleClass не имеет переменных уровня класса или уровня экземпляра, ваш FileWrite является Instance в методе post.у ошибочного запроса будет новый FileWrite ..

0 голосов
/ 12 февраля 2013

если вы объявите переменную внутри метода, она будет помещена в стек потоков вызовов, который доступен только текущему потоку. Так что вам не нужно беспокоиться о безопасности потока, если в вашем случае это локальная переменнаяследует использовать StringBuider, потому что это быстрее, не нужно беспокоиться о безопасности потоков здесь

0 голосов
/ 18 ноября 2011

Из Java док.

Экземпляры StringBuilder не безопасны для использования несколькими потоками. Если такая синхронизация требуется, рекомендуется использовать StringBuffer.

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/StringBuilder.html

Прежде всего строки усваиваются.

http://download.oracle.com/javase/1,5.0/docs/api/java/lang/String.html#intern()

Это означает, что если у вас одинаковые строки, это не проблема.

Если ваш верхний и нижний колонтитулы являются статическими, это может быть статическая переменная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...