2016-05-29 2 views
0

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

public class MyThreadedMap { 

    private ConcurrentHashMap<Integer, Object> map; 

    ... 

    public class Wrapper { 
      public Object get(int index){ 
       return map.get(index); 
      } 
    } 
} 

На данный момент несколько потоков будет иметь свой собственный экземпляр обертке и будет доступ к карте с wrapper.get (индекс).

Я обнаружил, что изменение производительности от наличия обертки и отсутствие обертки немного лучше, то есть обертка помогает немного. Когда я устанавливаю синхронизацию по методу get, есть серьезный удар производительности.

Что именно происходит здесь? Когда создается внутренний класс, я создаю копию этого метода get для каждого экземпляра? Было бы лучше, если бы я просто покинул упаковку, так как нет реальной выгоды от производительности?

ответ

1

ConcurrentHashMap имеет причудливые способы минимизации служебных данных синхронизации. Когда вы синхронизируете метод get, он накладывает обычные накладные расходы на синхронизацию, таким образом, производительность ударяется.

Если в классе Wrapper нет другого кода, я бы просто оставил его, поскольку он, кажется, ничего не добавляет.

+0

Это верно, но для этого примера это просто маленький легкий, чтобы идея началась. Давайте теперь скажем, что есть куча кода, разделяемого между потоками. Лот-код, который работает на этой карте или использует карту. Будет ли это иметь смысл тогда или Java действительно хорошо справляется с общими методами между потоками? – Richard

+1

Методы - это всего лишь код; они всегда разделяются между потоками, поскольку они не меняются при выполнении программы. Это только обмен данными между потоками, где нужно быть осторожным. –

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