Volatile не работает

Рейтинг: 1Ответов: 1Опубликовано: 17.12.2014
public class Tester{

    static volatile StringBuilder sb = new StringBuilder("");

    public static void main(String[] args) throws Exception, Throwable {
        Tester t = new Tester();

        ExecutorService es = Executors.newCachedThreadPool();

        for (int i = 0; i < 5; i++) {
            es.execute(new Runnable(){

                @Override
                public void run() {
                    sb.append("a");
                }

            });
        }
        es.shutdown();
        System.out.println(sb);

    }

}

Если volatile должно отключить кеширование, почему я после каждого запуска программы вижу разные результаты?

То "ааа", то "ааааа", то "аааа" или вообще "ааа а".

Ответы

▲ 3Принят

@romashechka, то что вы объявили волатильным статическое поле sb скажется только на нем, а не на внутреннем состоянии объекта StringBuilder.

Если бы вы делали несколько присвоений вида sb=..., то модификатор volatile обеспечил бы видимость этих присвоений между потоками. Но вы вызываете sb.append(...), меняющий внутреннее состояние объекта. А StringBuilder, как вам заметил @Mage, не реализует потокобезопасность для своего внутреннего состояния. Так что надо делать synchronized.