3 года разработчики Java даже не знаю эту яму Lambda

фон

В ГОСТЯХ отзывы помогают ZK медленное соединение. Zk критическая логика подключения сортируется следующим образом:

v2-01530fa6ee309b560d8f2ed53909d3e3_hd.jpg

Приведенный выше код вызывает в первый раз вызов ClientZkAgent.getInstance, это займет 10s, на этот раз только с довольно таймаут семафора В то же время, весь мир кажется заглох же.

анализ

После местных воспроизведите, получить стеки потоков во время остановки системы с помощью jstack, на этот раз Zookeeper нашел EventThread имеет довольно странное явление:

v2-0e8ce6f5a5dbeda046a2bff0d30d235e_hd.jpg

Клиент фактически быстро даже на зоопарк и вернуться к молодому человеку стал SyncConnected события, и EventThread уже Watcher.process метода обратного вызова, но это, кажется, держит поток событий не смогло спуститься в верхней позиции # _1, в то же время, лямбда-выражение в способе ClientZkAgent: лямбда $ подключить $ 0.

Я понимаю, что реализация Java в лямбда, добраться до сути вещей.

v2-83e02e4dc0f69b448f5555edba26294e_hd.png

Если коротко, то лямбда-выражение виртуальной машины Java будет преобразовать в метод класса, где лямбда $ {метод} $ {сл} (метод название Метод лямбда, где, например, соединить метод выше), в то время генерации динамических прокси прокси-класс (который реализует определенный класс прокси-интерфейсы лямбда-выражения, представленные), вызов лямбда $ {метод} $ {} НомерСтарта в прокси-классе.

В приведенном выше примере, сгенерированный прокси-класс, вероятно, следующим образом:

v2-1cacbccba6345d47b5f7a0aca3444ce9_hd.jpg

Затем расчешите:

Бизнес-нить:

1. Получить экземпляр, используя статический метод ClientZkAgent.getInstance (), первый визит триггеров загруженного класса ClientZkAgent.

2. Процесс загрузки, загружая статический экземпляр члена, на этот раз будет пытаться создать объект ClientZkAgent.

3. Соединить ZK ClientZkAgent конструктор, то CountdownLatch на состояние блокировки. Обратите внимание, что на этот раз загрузчик классов еще не завершен.

4.CountdownLatch тайм-аут после завершения инициализации объекта и загрузки всего класса

гк нить события:

После того, как SyncConnected событие срабатывает, вызов ClientZkAgent.lambda $ подключить $ 0 (событие), пытаясь разбудить бизнес-нить (побудка логика в лямбда).

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

После того, как поток сервиса завершил загрузку ClientZkAgent, обработка резьбы события полного событие.

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

Добро пожаловать в концерн я вроде общественно-хо [Программисты] отмечает начало статьи будет обновляться на внутренней стороне, документация будет находиться на внутренней стороне.

решить

ClientZkAgent модифицированная логика инициализации выглядит следующим образом:

v2-71f9a25d8ababec28a7e3eada64223c6_hd.jpg


в конце концов

Добро пожаловать, чтобы поделиться со всеми, как и статьи, подобные этой точки, чтобы помнить, спасибо за поддержку!



рекомендация

отblog.51cto.com/14442094/2435262