Конечно:
FROM ubuntu:18.10
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -y install --no-install-recommends --no-install-suggests \
ca-certificates software-properties-common gnupg2 gnupg1 \
&& apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9 \
&& add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/' \
&& apt-get install r-base
Взяты отсюда: https://cran.r-project.org/bin/linux/ubuntu/README.html
[ 116] И здесь: https://github.com/noisebrain/Dockerfiles/blob/0668df74b27f514dab19a7afae6715328de72980/Rstudio-server-aib/rstudio-server-aib.dockerfile
root@100d1cda7377:/# R
R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Если Вы идете строго для совместимости затем, Bryan корректен. Это - лучший способ поддержать Вашу текущую семантику сверху Словаря.
Подробно останавливаясь на нем все же. Причина свойство SyncRoot не было непосредственно добавлено к универсальному словарю, состоит в том, что это - опасный способ сделать синхронизацию. Это только немного лучше, чем "блокировка (это)", которое очень опасно и подвержено мертвым блокировкам. Вот несколько ссылок, которые говорят с тем, почему это плохо.
Новое мышление позади SyncRoot - то, что это была ошибка в первоначальном проекте. Если единственной вещью заблокировать является словарь, и это является частным, можно заблокировать его или другой объект, который служит объектом синхронизации. Последняя техника полезна, когда состояние, которое Вы защищаете, является больше, чем просто словарь.
// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();
// in some method...
lock (_syncLock)
{
// use the dictionary here.
}
var dictionary = new Dictionary<int, string>();
lock(((ICollection) dictionary).SyncRoot)
{
// ...
}
Если хеш-таблица/словарь не общедоступна, Вы могли бы просто заблокировать сам объект словаря.