Я только что понял, почему мне все еще нужен синхронизированный блок для AtomicInteger. Все комментарии, а также эта ссылка довольно полезна.
Если официант не синхронизируется, то любой старый бит кода может изменить предикат непосредственно перед тем, как он перейдет в спящий режим, и тогда у нас наверняка возникнут проблемы.
blockquote>Так что даже это AtomicInteger (на самом деле, тип данных значения на самом деле не имеет значения), непосредственно перед тем, как он перейдет в ожидание, другой поток может изменить свое значение, и это будет неправильно. [113 ]
Нет такой вещи как "простой" cacheing сервер DNS, особенно если Вы хотите достойную безопасность. Недавние нападения DNS показали, что функция cacheing в рекурсивных серверах DNS особенно уязвима.
Переоцените, нужно ли Вам на самом деле локальный cacheing собственный. Если Вы не делаете, Вы - вероятно, более обеспеченный изменяющий существующий код прокси DNS (такой как 'dnsmasq').
Если Вы действительно хотите к самокрутке, существуют хорошие библиотеки такой как ldns
который может обеспечить доступ к базовым пакетам DNS.
Я использую ldns
самостоятельно в сочетании с libevent
для реализации сервера DNS Fuzzing, я упомянул в более раннем вопросе.
Существует набор реализаций бесплатного программного обеспечения DNS. Вы могли посмотреть на их исходный код. Например:
Книга DNS и BIND могла бы быть полезной. И, конечно, существуют RFCs, которые указывают DNS, видят http://rfc-editor.org/.
Если действительно необходимо сделать это (это - огромная работа, посмотрите ответ Alnitak), запустите с существующей хорошей программы (не индивидуальный эксперимент, несохраняемый в течение долгого времени как djbdns), и измените его.
Развязанный, вероятно, разумный выбор для этого. (Кодовая база меньше, чем одна BIND.)
Поочередно, Вы могли использовать Компилятор Конечного автомата Ragel для создания сервера с нуля.