Обратите внимание на то, что много ответов указывает, что Хеш-таблица синхронизируется. На практике это покупает Вас очень мало. синхронизация находится на средстве доступа / мутаторные методы остановят два добавления потоков или удаление из карты одновременно, но в реальном мире Вам часто будет нужна дополнительная синхронизация.
А очень общая идиома должна "проверить тогда помещенный" — т.е. искать запись в эти Map
и добавить его, если это уже не существует. Это ни в коем случае не атомарная операция, используете ли Вы Hashtable
или HashMap
.
эквивалентно синхронизируемый HashMap
может быть получен:
Collections.synchronizedMap(myMap);
, Но правильно реализовать эту логику Вам нужно дополнительная синхронизация из формы:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
Даже итерация по Hashtable
записи (или HashMap
полученный Collections.synchronizedMap
) не ориентированы на многопотоковое исполнение, если Вы также не охраняете Map
от того, чтобы быть измененным до дополнительной синхронизации.
Реализации ConcurrentMap
интерфейс (например ConcurrentHashMap
) решают часть этого включением ориентированная на многопотоковое исполнение check-then-act семантика , такая как:
ConcurrentMap.putIfAbsent(key, value);
Я добавляю этот ответ здесь, хотя я понимаю, что это намного позже чем тогда, когда на вопрос сначала ответили. Я помещаю ответ здесь в случае, если он сохраняет кого-либо еще стычка, я только что был через.
я также получал эту ошибку на своей ASP-странице после того, как я переустановил Windows 10. Ранее на моей localhost установке IIS, та же страница не сделала ошибки. Однако - теперь это сделало - со следующей ошибкой:
Активная ошибка Страниц Сервера 'ASP 0115' Неожиданная ошибка index.asp
А trappable ошибка (C0000005) произошла во внешнем объекте. Сценарий не может продолжить работать.
я попробовал много вещей попытаться отсортировать его, такие как:
, которым Моя проблема была с SQL, Вставляет - когда это работало, я получил ошибку.
Это - сокращение вниз версия его:
sql = ""
sql = sql & " INSERT INTO my_table ( "
sql = sql & " card_sender, "
sql = sql & " senders_email, "
sql = sql & " recipients_email, "
sql = sql & " card_body, "
sql = sql & " session_id, "
sql = sql & " replyID) VALUES ( "
sql = sql & " ?, "
sql = sql & " ?, "
sql = sql & " ?, "
sql = sql & " ?, "
sql = sql & " ?, "
sql = sql & " ?) "
Set stmt = Server.CreateObject("ADODB.Command")
stmt.ActiveConnection = oConn
stmt.Prepared = true
stmt.commandtext = sql
stmt.Parameters.Append stmt.CreateParameter("@001_card_sender", adVarChar, adParamInput, 255, card_sender)
stmt.Parameters.Append stmt.CreateParameter("@002_senders_email", adVarChar, adParamInput, 255, senders_email)
stmt.Parameters.Append stmt.CreateParameter("@003_recipients_email", adVarChar, adParamInput, 255, recipients_email)
stmt.Parameters.Append stmt.CreateParameter("@004_card_body", adLongVarChar, adParamInput, 256665, card_body)
stmt.Parameters.Append stmt.CreateParameter("@sessionsessionID", adVarChar, adParamInput, 255, session.sessionID)
stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))
stmt.Execute
Set stmt = Nothing
Через процесс создания SQL и нахождения, какая строка инициировала ошибку, я нашел, что эта строка вызвала проблему:
stmt.Parameters.Append stmt.CreateParameter("@replyID", adVarChar, adParamInput, 255, session("replyID"))
В моем примере, эти session("replyID")
значение не было установлено, и это инициировало ошибку.
, Когда я изменил код, чтобы проверить, была ли переменная сеанса установлена, она устранила проблему:
...
foo = session("replyID")
if foo = "" then foo = 1
...
stmt0003.Parameters.Append stmt0003.CreateParameter("@replyID", adVarChar, adParamInput, 255, foo)
[еще 1123] тестирование подтвердило, что ошибка произойдет для любой переменной, которая была пустой, таким образом, я должен был включить, если оператор для каждой переменной и установил его на что-то, если это было пустым, для предотвращения этих ошибок, которые я не сделал используемый для преуспевания в предыдущую установку Windows 10 на том же ПК.
После пребывания приблизительно в течение дня, работая над ним, он было облегчение добраться до сути относительно него.