Вероятно, вам потребуется реализовать метод hashCode
в классе Product
.
По умолчанию реализация hashCode
возвращает местоположение объекта в памяти. Результатом метода hashCode
объекта является то, что используется HashMap
для идентификации объекта.
В этом случае каждый раз, когда Product
извлекается из базы данных с использованием db.getProduct(pid)
, его местоположение в памяти, вероятно, отличается.
Из-за этого вызов, который HashMap
использует для поиска, если существует Product
, отличается, и поэтому объект снова добавляется в HashMap
.
Чтобы избежать этого, в Product
должны быть реализованы методы hashCode
и equals
. В вашем случае использование чего-то уникального, например ProductID (pid
), имеет смысл:
// Assuming pid is public
public int hashCode() {
return this.pid;
}
public equals(Object object) {
return this.pid == ((Product)object).pid;
}
Для получения дополнительной информации о том, как реализовать более надежный hashCode
, см. https: // stackoverflow. ком / а / 113600/9129020
Я полагаю, что можно использовать Monitor.TryEnter()
.
оператор блокировки просто переводит в Monitor.Enter()
вызов и try catch
блок.
У Ed's есть правильная функция для Вас. Просто не забывайте звонить Monitor.Exit()
. Необходимо использовать try-finally
блок для гарантии надлежащей очистки.
if (Monitor.TryEnter(someObject))
{
try
{
// use object
}
finally
{
Monitor.Exit(someObject);
}
}
Вы, вероятно, узнаете это для себя теперь, когда другие указали на Вас в правильном направлении, но TryEnter может также взять параметр тайм-аута.
"CLR Jeff Richter Через C#" является превосходной книгой по деталям внутренностей CLR при вхождении в более сложный материал.