2014-12-03 1 views
4

В Java Docs сказано, что методы StringBuffer: . Тогда почему я все еще нужно вручную synchronizeStringBuffer в примере, приведенном в этом вопросе: hereПочему нам требуется синхронизировать StringBuffer, когда его методы уже синхронизированы.

Я где-то читал, что он не достоин того, чтобы использовать StringBuffer над StringBuilder, потому что он (StringBuffer) происходит медленнее, чем StringBuilder. Таким образом, эти два значения аналогичны Vector и ArrayList.

Но мне было интересно, почему мы называем его (StringBuffer или VectorThread Safe) а классы, когда мы по-прежнему необходимо вручную вложить их в synchronized блоке, как в примере, приведенном в ссылке выше. Почему я не могу полагаться на них. Может кто-нибудь объяснить & ясный сомнений.

Есть ли способ проверить, что StringBuffer действительно является классом Thread Safe.

ответ

3

Методы в StringBuffer внутренне синхронизированы, что означает, что если два потока одновременно присоединяют строку к буферу, тогда буфер не будет чередовать строки; он добавит один, а затем другой.

Пример, который вы связываете, синхронизирует себя с экземпляром строкового буфера, что совсем другое.

+0

если я прокомментирую блок 'synchronized', то потоки не должны мешать друг другу в течение метода setCharAt(). Не метод 'setCharAt()' синхронизирован в классе 'StringBuffer'. Но сцена противоположна, то есть потоки вмешиваются во время 'setCharAt()', когда я комментирую блок «synchronized». – JPG

0

При использовании этого

synchronized(sb) 
    { 
     for(int i=1;i<=10;i++){ 
      System.out.println(i+" : "+sb.charAt(0)); 
     } 
     sb.setCharAt(0, (char) (sb.charAt(0)+1)); 
    } 

вы синхронизируете весь блок (т.е. когда поток 1 использует этот блок никакого другого потока не должен использоваться до завершения thread1)
Если удалить синхронизированное, в любой точке time thread1 может освободить блокировку, поэтому thread2 или thread 3 могут изменить свои данные

Смежные вопросы