2010-01-23 3 views
0

У меня есть динамический массив хэш-таблицJava-блокировка элементов внутри массива

Могу ли я использовать синхронизированный для каждого из них отдельно? Как синхронизировать (массив [1]) {код} .., синхронное (массив [2]) {код} ..

Благодаря

+0

Что вы пытаетесь достичь? Этот вопрос не имеет смысла без какого-либо контекста. – akappa

ответ

2

Конечно, но это лучше использовать concurrent map Os concurrent skip list для пропускной способности если вы можете.

BTW, если вы предоставляете нам немного контекста, мы можем предложить вам (возможно) лучшую организацию и структуру данных.

+0

Да, я бы поспорил, нет абсолютно никакой причины использовать трясущуюся когда-либо. –

3

Вы можете, конечно, синхронизировать на объекте в определенном положении в письменном виде массива:

synchronized (arr[x]) { 
    ... 
} 

Однако, только будьте осторожны, чтобы убедиться, что вы понимаете, является ли это делать то, что вы хотите, чтобы это сделать.

Это заблокирует конкретный объект , на который ссылается arr [x]. Тем не менее, он не будет покупать вам никакой безопасности потоков с точки зрения доступа к самому массиву - другими словами, например:

  • , когда вы блокируете объект при arr [x], другой поток все еще может поменять, какой объект находится в arr [x];
  • Если две нити одновременно обращаются в одно и то же положение arr (чтобы прочитать, какая хэш-карта/объект есть или установить новый), будет состояние гонки.

Я также согласен с akappa - то, что вы делаете, звучит немного необычно, и, возможно, лучше перефразировать ваш вопрос как «какую структуру данных мне нужно, чтобы сделать X», а не предполагать что массив хэшмапов является подходящим с самого начала?

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