lair вообще повел себя как обиженный ребенок, которого уличили во лжи (неведении).
Все же хотелось бы услышать от специалиста ответы на эти глупые вопросы.
Сделайте одолжение, пожалуйста, потому что моих знаний, чтобы нагуглить что-то полезное не хватило.
Можно ведь открыть студию и убедиться, что поведение принципиально разное, а не показывать всем свою необразованность? А потом пойти и почитать почему оно разное.
Очень распространен и важен.
Человек который не может ответить на этот вопрос скорее всего не в курсе про полиморфизм и не сможет правильно его применять. Это уровень джуна, увы.
А вот это думаю зря, отчего не поправить, но это уже дело ваше.
Зачем тратить оплачиваемое время специалиста на обучение человека, который за свою карьеру/обучение не удосужился прочитать 1 (одну!!!!) несложную книжку? Зачем он вообще такой нужен? Знаете сколько таких ходит по собеседованиям и тратит чужое время?
Под «достаточно одного T» имелось в виду, что у метода один дженерик параметр, а различных значений T пусть будет от 10 до 100.
В этот момент я заявляю, что вы страдаете херней и если у вас реально боттлнек в этом месте, то любой «паттерн» проиграет предзаполненному lookup table на Dictionary без блокировок вообще.
Может быть, и могу. Но дело в том, что у меня такая позиция в программировании — испытывать на прочность самые неожиданные сценарии и варианты, а не ходить по проторенным и безопасным тропинкам. :)
Меня в институте учили, что испытание/эксперимент, это:
1. Подробное изучение всей доступной информации об объекте эксперимента.
2. Выдвижение четкой гипотезы, базирующейся на известной информации, а не на предположениях.
3. Разработка и проведение повторяемых экспериментов, в том числе опровергающих гипотезу.
У вашего процессора несколько ядер, каждое со своим кэшом и своей личной копией кусочка памяти. Синхронизация кэшей происходит тоже кусочками и совсем не в том порядке, в котором вы что-то пишете в память. Соответственно, одно ядро может увидеть изменения в памяти не в том порядке, в котором они были сделаны другим ядром. Это если не учитывать ещё того, что компилятор может «немного» переписать ваш код и поменять порядок инструкций чтения/записи.
Хотя, справедливости ради, проверка на полное равенство ключей там тоже есть. Но это не отменяет того, что хэш-таблицы во время ресайза неконсистентна.
Только вот корзина — это связный список на индексах. И все корзины лежат в одном массиве, а индексы у элементов меняются, причем перемещение элемента неатомарное и включает, кажется, с полдесятка операций записи и зависит не то чтобы от конкретного рантайма, а от конкретной его сборки.
Построить полную картину того, что может произойти при контеншне не берусь, там сотни вариантов с разным исходом, в том числе возврате любого произвольного элемента вместо null.
Все же хотелось бы услышать от специалиста ответы на эти глупые вопросы.
Сделайте одолжение, пожалуйста, потому что моих знаний, чтобы нагуглить что-то полезное не хватило.
Я вот на всякий случай сходил и проверил — gist.github.com/retran/9f4dc4c359d8e91d163e2452a642863c
Если вы так пишете код и считаете это переопределением — вас вообще на работу брать нельзя.
Человек который не может ответить на этот вопрос скорее всего не в курсе про полиморфизм и не сможет правильно его применять. Это уровень джуна, увы.
Зачем тратить оплачиваемое время специалиста на обучение человека, который за свою карьеру/обучение не удосужился прочитать 1 (одну!!!!) несложную книжку? Зачем он вообще такой нужен? Знаете сколько таких ходит по собеседованиям и тратит чужое время?
Там совершенно обычные дотнетовские блокировки. Которые могут быть спиновыми.
Я вот вообще-то думал, что мы задачу про мемоизацию функции решаем.
UPD Я вот считаю, что кэш без вытеснения — и не кэш вовсе. Поэтому о задаче кэширования в вашем случае вообще можно не говорить.
В этот момент я заявляю, что вы страдаете херней и если у вас реально боттлнек в этом месте, то любой «паттерн» проиграет предзаполненному lookup table на Dictionary без блокировок вообще.
Меня в институте учили, что испытание/эксперимент, это:
1. Подробное изучение всей доступной информации об объекте эксперимента.
2. Выдвижение четкой гипотезы, базирующейся на известной информации, а не на предположениях.
3. Разработка и проведение повторяемых экспериментов, в том числе опровергающих гипотезу.
Например:
github.com/Microsoft/referencesource/blob/60a4f8b853f60a424e36c7bf60f9b5b5f1973ed1/mscorlib/system/collections/generic/dictionary.cs#L463
Что будет, если до читающего потока доедет только одно из этих двух присвоений? volatile и барьеров я там не вижу.
И мы ещё даже не начали за когерентность кэшей разговаривать.
Боттлнек на пустом месте, да.
Построить полную картину того, что может произойти при контеншне не берусь, там сотни вариантов с разным исходом, в том числе возврате любого произвольного элемента вместо null.
Самый простой вам ниже lair показал.