Почему нам требуется синхронизировать StringBuffer, когда его методы уже синхронизированы

В Java Docs говорится, что StringBuffer методы synchronized. Тогда почему мне все еще нужно вручную synchronize StringBuffer в примере, приведенном в этом вопросе: здесь

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

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

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

2 ответа

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

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


Когда вы используете этот

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 использует этот блок, ни один другой поток не должен использоваться до завершения потока1) Если вы удалите синхронизацию, в любой момент времени thread1 может освободить блокировку, поэтому thread2 или thread 3 могут изменить свои данные.

licensed under cc by-sa 3.0 with attribution.