JSON странно синхронизирован в исходном коде - PullRequest
0 голосов
/ 18 ноября 2010

Я нашел такой странный код в JSON-классе jetty-util в пакете org.mortbay.util.ajax и задаюсь вопросом, является ли это ошибкой или нет. Мое единственное предположение - прочитать переменную _deafult из памяти, поделиться своими мыслями, ребята!

public static String toString(Object object)
    {
        StringBuffer buffer=new StringBuffer(__default.getStringBufferSize());
        synchronized (buffer)
        {
            __default.append(buffer,object);
            return buffer.toString();
        }
    }

Ответы [ 2 ]

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

Я бы сказал, что шансы довольно высоки, они намеревались написать synchronized (__default) вместо synchronized (buffer).Это позволит избежать каких-либо изменений в __default во время вызова append (при условии, что они также синхронизируются с ним в другом месте, при внесении изменений или что его функции-мутаторы - вы не упомянули, что такое __defaultне то, что это имеет большое значение).Я не вижу никакой причины для синхронизации на buffer.

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

Это выглядит совершенно бессмысленно - экземпляр buffer создается прямо внутри потока, поэтому никакие другие потоки не могут иметь ссылку на него.Следовательно, блок synchronized будет всегда всегда без присмотра и, следовательно, ничего не защищает, плюс никакой другой поток не будет синхронизироваться с ним позже, поэтому нет никаких эффектов согласованности памяти.предполагаемая семантика, это может быть ошибка, или это может быть просто особенность, оставшаяся от рефакторинга, которая не вызывает никаких проблем.(Поскольку с точки зрения корректности это эквивалентно отсутствию синхронизации вообще, а с точки зрения производительности - лишь незначительно хуже.)

С другой стороны, Hotspot в Java 6 оптимизирует этот блок.: -)

...