Multiton
является шаблоном, который обеспечит только один объект будет создан для Key в многопоточных среде. Поэтому, если несколько потоков пытаются передать один и тот же ключ, он должен получить тот же объект (объект блокировки) для этого ключа. Может быть, мы называем это ключевой синглтон.
Если у нас есть ТОЛЬКО ОДИН объект блокировки в общей системе; то для вашего приложения это singleTon
. Но здесь несколько объектов блокировки; и каждый объект сопоставляется с ключом.
Один пример; предположим, что существует несколько конференций, и вы хотите, чтобы вызывающие абоненты конференции должны были объединяться один за другим (чтобы подсчитать количество вызывающих абонентов в конференции) (СИНХРОНИЗИРОВАННЫЙ ДЛЯ ОБЪЕКТА КОНФЕРЕНЦИИ) с их соответствующим идентификатором конференции. Если у меня есть одноэлементный объект, тогда даже вызывающие из другой конференции будут заблокированы. Поэтому мне нужна блокировка для каждой конференции.
Таким образом, объекты конференц-связи должны создаваться на основе идентификатора конференции; и когда несколько потоков, пытающихся получить доступ к одному объекту конференции с одним и тем же идентификатором конференции (многотоновый ключ), должны завершиться синхронизацией в системе. Таким образом, если два вызывающих абонента на одной и той же конференции одновременно будут синхронизированы.
class LockByKey {
ObjectForStringKey objHolder = new ObjectForStringKey(100);
public void lockThenWorkForKey (String key) {
synchronized(objHolder.valueOf(key)){
//DoSomeWork
}
}
}
//MultiTon
public final class ObjectForStringKey {
private final Object[] cache;
private final int cacheSize;
final int mask;
public ObjectForStringKey(int size) {
// Find power-of-two sizes best matching arguments
int ssize = 1;
while (ssize < size) {
ssize <<= 1;
}
mask = ssize - 1;
cache = new Object[ssize];
cacheSize = ssize;
//build the Cache
for (int i = 0; i < cacheSize; i++) {
this.cache[i] = new Object();
}
}
public Object valueOf(String key) {
int index = key.hashCode();
return cache[index & mask];
}
}
Его можно использовать для пулов ресурсов. [В этой статье объясняются некоторые варианты использования] (http://gen5.info/q/2008/07/25/the-multiton-design-pattern/) –