Здравый смысл параллельного программирования на Java

Java

вот почему85оригинальная статья

Написание промежуточного программного обеспечения часто делает две вещи:

  • 1. Ленивая загрузка, которая была загружена в кэш памяти.
  • 2. Подсчитайте количество вызовов и перехватите параллелизм.

Для такой маленькой функции девять из десяти человек в команде написали ее неправильно.


Приведенное выше предложение — это не то, что сказал я, это то, что сказал Лян Фэй в своем блоге.

Кто такой Лян Фэй?

Согласно общедоступной информации в Интернете, Лян Фэй имеет заслуженную репутацию.

Присоединился к Alibaba в 2009 году, отвечая за разработку промежуточного программного обеспечения, автор платформы распределенных сервисов с открытым исходным кодом Dubbo, автор механизма шаблонов с открытым исходным кодом HTTL.

В 2012 году он присоединился к Tmall, отвечая за технологическую команду мобильного телефона Tmall APP, был свидетелем полного процесса беспроводной связи Tmall double 11.

Стремление участвовать в построении сообщества с открытым исходным кодом, концепции архитектурного проектирования коммуникационных услуг, SOA, фреймового дизайна, мобильных приложений.

Вот что я нашел в его личном блоге:

https://www.iteye.com/blog/javatar-287026

Я ездил в Ханчжоу на собеседование в прошлую пятницу. Я прилетел утром и улетел обратно вечером. Я торопился. Самолет опоздал. Было почти 13 часов, когда я приехал туда. Интервью заняло около часа. . . .

После интервью я прогулялся с несколькими знакомыми, и атмосфера обучения и общения была очень хорошей.

Я получил предложение во вторник.Кажется, HR очень эффективный.Мне нравится.Намечено присоединение 8 января.

Последние два дня я был занят подачей заявлений об увольнении и собираюсь покинуть компанию, за которую боролся почти три года. Я все еще немного не хочу сдаваться. Компания дала мне много возможности развития.

Просто в новой компании больше возможностей для развития.Я не хочу сдаваться.Надеюсь,что смогу лучше работать на новой должности.Ха-ха,текущий счет записан здесь.

Эта запись в блоге была опубликована 24 декабря 2008 г.

Об этом он заявил в прошлую пятницу, 19 декабря 2008 г. В течение одного дня я прилетел из Шэньчжэня в Ханчжоу, прошел час собеседования и улетел обратно в Шэньчжэнь из Ханчжоу.Через 4 дня я получил предложение от Али.

В то время Лян Фэй вышел из колледжа программного обеспечения Хунаньского профессионального колледжа науки и технологий менее чем за 3 года.

В статье говорилось «Присоединение 8 января», то есть 8 января 2009 года.

С тех пор Alibaba начала 12-летний апгрейд для борьбы с монстрами с P5 до P9.

Как мы все знаем, способность Али достичь P9 больше не является вопросом способностей, это относится к накоплению добродетелей предков.

А Лян Фей уже был P9 в 2016 году.

Есть так много лейблов, упомянутых выше, и его самый известный лейбл должен быть: основатель Dubbo.

Через 1015 дней после того, как Лян Фэй присоединился к Али, в 23:06 20 октября 2011 года Даббо впервые вскрикнул в сообществе открытого исходного кода:

9 модулей, всего 669 файлов, это прототип топового open source проекта Apache в будущем, который был ухабистым, чуть не умер, а друзья и бизнесмены продолжали жить.

Ночью 20 октября 2011 года суждено было стать незабываемой для Лян Фэя.

Он сделал 13 коммитов:

Наконец, в 5:25 утра следующего дня Даббо был помечен: 2.0.7.

В течение этого периода я также нашел время, чтобы уведомить официальные СМИ, чтобы они отправили Weibo:

И сам он в полдень следующего дня тоже сообщил об этом в своем блоге:

Почему в этот день Даббо решил открыть исходный код?

Я думаю, что два дня спустя нужно догнать глобальную конференцию разработчиков программного обеспечения Qcon:

Тот день был началом истинного чувства Даббо стоять в глазах общественности и принимать похвалу и насмешки.

Я упорно трудился, чтобы найти общий PPT конференции почти 10 лет назад, первая страница открытия:

Прошло десять лет, Байюн Кангоу и Даббо вышли из Али и действительно влетели в дома простых людей.

За последние десять лет данные по РРТ, в пересчете на общую сумму, это как продажи Дабл Элевен, не знаю, сколько раз его переворачивали.

Но, если подумать, это Али 10-летней давности, с 1 миллиардом звонков в день, это трафик, который многие технические специалисты не могут коснуться за всю свою жизнь.

В то же время я также нашел много знакомых картинок в PPT, таких как эта:

Слева текущий официальный сайт Dubbo, а справа PPT на конференции Qcon 10 лет назад.

10 лет спустя, когда эти две фотографии находятся в одной рамке, мне интересно, есть ли у «старой фотографии» справа старый отцовский комфорт.

Если вам не особо близка картинка выше, то взгляните на это:

Слева официальный сайт, справа PPT.

Спустя 10 лет общий дизайн совсем не изменился.

Я не знаю, что вы думаете, когда видите это, но для меня это довольно круто.

Общий дизайн 10-летней давности стоял на месте в постоянно меняющейся и бурной интернет-индустрии.

Это кристаллизация мудрости группы инженеров.

Первый PPT Dubbo состоит из 55 страниц, и в нем много дизайнов, которые спустя десять лет выглядят устаревшими.

Я не буду показывать их по одному, кому интересно, вы можете посмотреть, как их получить, в конце статьи.

Наконец, вот фото самой ранней команды Dubbo:

Здравый смысл параллельного программирования на Java

Помните предложение в начале этой статьи?

https://www.iteye.com/blog/javatar-1963774

Ссылка PPT здесь недействительна, я проделал большую тяжелую работу и искал копию.

Всего 18 страниц, покажите их одну за другой.

Некоторые места — это чистые очки знаний, а некоторые — код.

Во всяком случае, я думаю, что понимаю это, и об этом необходимо говорить. Я дам краткое описание чуть ниже изображения.

погнали.

Объясните немного о том, что находится на этой странице.

Эти команды, которые я также использовал в предыдущих статьях:

Технический вопрос, который мучил меня 122 дня, и я, кажется, знаю ответ.

Это эта часть:

Итак, я знаю, что в этом месте есть дыра.

Если вы вставите команду напрямую, она выдаст эту ошибку:

Java HotSpot(TM) 64-Bit Server VM warning: printing of assembly code is enabled; turning on DebugNonSafepoints to gain additional output

Это потому, что вам не хватает файла с именем hsdis-amd64.dll (платформа Windows).

Вам нужно поместить этот файл в каталог jre/bin/server:

Затем замените команду на эту:

-XX:+UnlockDiagnosticVMOptions
-XX:+PrintAssembly
-XX:CompileCommand=print,*AtomicInteger.incrementAndGet

Запускаем программу снова, есть вывод сборки:

Давайте поговорим о параметре CompileCommand.

Этот параметр используется для настройки требований к компиляции, например, вы можете указать, что метод не должен компилироваться JIT, или вы можете компилировать только указанный метод и т. д.

Использование такое:

-XX:CompileCommand=command,method[,option]

Команда имеет следующие параметры:

  • исключить, пропустить компиляцию указанного метода
  • compileonly, компилировать только указанный метод
  • inline/dontinline, установить, следует ли встраивать указанный метод
  • распечатать, распечатать сгенерированный ассемблерный код
  • break, когда JVM работает в режиме отладки, установить точку останова в начале компиляции метода
  • тихо, не печатать параметры компиляции, указанные параметром -XX:CompileCommand, после этой команды
  • log, записывать журнал компиляции указанного метода, если не указано, записывать журнал компиляции всех методов
  • Другие команды, опция, помощь

Например, это использование в PPT-XX:CompileCommand=print,*AtomicInteger.incrementAndGet

Содержит, чтобы напечатать ассемблерный код, сгенерированный методом AtomicInteger.incrementAndGet.

Выравнивание строки буфера, это должно быть точкой знаний, которую необходимо освоить, и относится к хитростям и хитростям по оптимизации программы.

Иногда появляюсь на сеансе интервью.

Целью выравнивания является устранение случаев ложного совместного использования.

Друзья, кто не знает о псевдо-шеринге, рекомендуется это узнать.

Источник исходного кода для примеров в PPT:

com.google.code.yanf4j.util.LinkedTransferQueue.PaddedAtomicReference

Следует отметить, что в Java8 предусмотрено более элегантное решение: аннотация @Contented.

Это также очень классическая эволюция одноэлементного паттерна.

Всего на PPT есть четыре одноэлементных шаблона, давайте рассмотрим их один за другим.

Это голодный синглтон в китайском стиле, с которым мы знакомы. Предварительная инициализация решает проблему параллелизма и гарантирует одноэлементность.

Ключевым здесь является финальное статическое ключевое слово.

Автор также использовал синий цвет, чтобы выделить его, что должно иметь глубокий смысл.

Давайте, давайте вместе прочитаем процесс загрузки класса:

Загрузите, проверьте, подготовьте, проанализируйте, инициализируйте.

Например следующий пример:

public static int value =123

Если значение переменной имеет только статическую модификацию, то на этапе подготовки переменной присваивается начальное значение, равное 0.

При инициализации ему присваивается 123.

Но когда есть еще одна финальная модификация:

public final static int value =123

На этапе подготовки переменной value будет присвоено значение 123.

Итак, если вы думаете о голодном китайском стиле выше, правда ли это?

Знания в этом отношении четко написаны в книге «Углубленное понимание виртуальной машины Java».

Но у голодного китайского стиля есть очевидный минус, то есть он будет инициализирован вне зависимости от того, используется приложение или нет.

Это не элегантно.

Итак, дело доходит до второго раздела программы, полностью китайского стиля.

Операция инициализации выполняется только тогда, когда она необходима.

Но как обеспечить потокобезопасность?

Безопасность потоков гарантируется добавлением в метод ключевого слова synchronized?

Но действительно ли эта штука безопасна?

Вероятно, это один из самых любимых вопросов интервьюеров.

Если вы не знали этого раньше, вы, возможно, никогда не думали о том, чтобы получить объект, который был только наполовину инициализирован.

Проще говоряnew Singleton()Не атомарный, поэтому при выполнении условия if экземпляр не инициализируется полностью.

Отсюда следующая программа:

Легендарная блокировка с двойной проверкой.

И эта программа, скорее всего, будет "проигнорирована" - это ключевое слово volatile.

Без ключевого слова volatile программа была бы бесполезна.

Также следует отметить, что Лян Фэй заметилjdk1.5+.

Зачем?

На самом деле ответ написан на странице 287 «Параллельного программирования Java в действии»:

В этой книге идиома для описания блокировки с двойной проверкой звучит так: notorious.

И на картинке видно: движущей силы для появления этого режима больше нет, и это не является действенной оптимизационной мерой.

Теперь я думаю, что блокировка с двойной проверкой в ​​основном используется на собеседованиях.

Очевидно, что это не эффективная мера оптимизации, но это все же высокочастотный тестовый сайт.Почему?

Дело не в том, что восьминогий текст вреден.

Далее поговорим о последнем, который тоже так рекомендует автор:

Научное название этой операции называется «решение одноэлементного шаблона на основе инициализации класса».

JVM получает блокировку после загрузки класса и до того, как он будет использован потоком, то есть на этапе инициализации класса.

Эта блокировка может гарантировать, что когда несколько потоков инициализируют один и тот же класс, только один поток сможет успешно инициализироваться.

Принцип этого метода очень ясно объяснен в главе 3.8.4 книги "Искусство параллельного программирования на Java".

Какие? У вас нет ни одной из этих двух книг?

Спешите приобрести книгу, она по-прежнему очень хорошо написана, и я уже много раз рекомендовал ее.

Лоб......

Я тоже не понимаю эту страницу.

Я думаю, что должен быть контекст, но Лян Фэй не писал об этом в PPT.

Заставил меня выглядеть туманно.

Здесь прописаны только CountDownLatch и CyclicBarrier.

На самом деле существует очень важный, очень часто используемый класс инструментов: семафор.

Если вы не знаете, ознакомьтесь с этой статьей:

Я полагаюсь! В Семафоре такая большая яма!

Если вы не знаете трех вышеперечисленных.

порыв! тугой! идти с! учиться!

Распечатайте его, прикрепите к компьютеру, прочитайте и произнесите вслух эту страницу.