Краткое изложение сути руководства по разработке на Java

Java

Краткое изложение руководства по разработке Ali Java

Отличие отличного инженера от обычного инженера не в архитектурных диаграммах, разлетающихся по всему небу, а в том, что его навыки отражаются в каждой строчке кода, который он пишет. -- Би Суан

Именованный стиль

[Резюме книги] Используйте стиль UpperCamelCase для имен классов, таких как DO/BO/VO/PO

[Резюме книги] Метод в нижнем верблюжьем стиле, попробуйте быть глаголами

Небольшие мысли: например, часто используемый

  • Получить один объект, getUserById
  • Получить объект не надоело, listUserByGroupId
  • Подсчитайте количество объектов, countUserByClassId
  • Добавить, удалить, вставить, удалить, обновить и т. д.

2. Постоянное определение

[Резюме книги] Если значение переменной изменяется только в одном диапазоне, используйте тип перечисления

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

public enum OrderSatausEnum {
    TO_PAY(1,"代付款"), PAID(2,"已付款") ...;
    
    private Integer orderStatus;
    private String orderSatausDes;
    
    OrderSatausEnum(Integer orderStatus,String orderSatausDes) {
        this.orderStatus = orderStatus;
        this.orderSatausDes = orderSatausDes;
    }
    
    // get set
}

Далее, что, если заказ будет добавлен в статус "В ожидании группы" в один прекрасный день? Таким образом, эти настройки могут быть отправлены в центр настройки. Например, аполлон от Ctrip и т.д.

3. Правила ООП

[Резюме книги] Метод equals объекта склонен генерировать исключения нулевого указателя. Вы должны использовать константы или определять высококачественные объекты для вызова equals .

Например: "TO_PAY".equals(order.getOrderStatus()). Писать наоборот неправильно, потому что order.getOrderStatus() может быть нулевым.

Естественно, больше рекомендуется использовать служебный класс java.util.Objects#equals.

[Резюме книги] Все сравнения значений между объектами-оболочками одного и того же типа используют метод equals.

Небольшое размышление: не используйте ==. Equals также должны обращать внимание на такие вещи, как значение объекта Status типа Byte, при этом equals следует обратить внимание на:

getStatus().equals(0) // 反例,false
getStatus().equals((byte)0) // 正例,true

Кроме того, ==, такое как Integer, обычно находится в диапазоне от -128 до 127, и это ненормально, если оно превышает. Причина в том, что объекты в диапазоне от -128 до 127 генерируются в IntegerCache.cache, который будет повторно использовать объекты. Итак, не забудьте запомнить, не используйте ==, используйте равенство для сравнения.

4. Обработка коллекции

[Резюме книги] Не выполняйте операции удаления/добавления над элементами в цикле for. Пожалуйста, используйте метод Iterator для удаления и заблокируйте объект Iterator, если есть параллельные операции.

Как работать с коллекцией Iterator конкретно, вы можете скачать ее с Baidu. Это по-прежнему типичный шаблон проектирования итераторов.Вы можете углубиться в исходный код, чтобы увидеть простые принципы реализации других, и вы можете получить много дополнительных знаний.

5. Параллельная обработка

[Резюме книги] Во-первых, потоки должны предоставляться через пул потоков, а явное создание потоков не допускается. Во-вторых, пулы потоков нельзя создавать с помощью Executors, и их следует создавать с помощью ThreadPoolExecutor. так как Несколько пулов потоков, созданных Executors, имеют недостатки:

  • FixedThreadPool и SingleThreadPool допускают, чтобы длина очереди запросов была Integer.MAX_VALUE , большое количество запросов вызовет OOM
  • CachedThreadPool и ScheduledThreadPool позволяют создать максимальное количество потоков, равное Integer.MAX_VALUE, создание большого количества потоков приведет к OOM

Таким образом, цель использования ThreadPoolExecutor — лучше понять правила работы пула потоков, избежать исчерпания ресурсов, лучше соответствовать определенному бизнес-сценарию и создать более подходящий пул потоков.


[Резюме книги] В сценариях с высокой степенью параллелизма синхронные вызовы должны учитывать потерю производительности блокировок. Если вы можете использовать структуры данных без блокировок, не используйте блокировки; если вы можете блокировать блоки, не блокируйте все тело метода; если вы можете использовать блокировки объектов, не используйте блокировки классов. То есть, чем меньше степень детализации блокировки, тем меньше потеря производительности. И метод RPC вызывается в блоке кода, который позволяет избежать блокировки.

Кроме того, при одновременной блокировке нескольких ресурсов необходимо поддерживать согласованную последовательность блокировки. В противном случае последовательность блокировки одного потока — ABC, а последовательность блокировки другого потока — ACB или BAC и т. д., что приведет к взаимоблокировке. Как показано на рисунке:

file


【Книжный реферат】Информация, связанная с финансовыми фондами, используйте пессимистическую блокировку. Например, обновить поле баланса кошелька пользователя.

Небольшая мысль: когда я использовал P2P, я просто использовал блокировку строк MySQL.

SELECT * FROM xx WHREER xx.id=888 FOR UPDATE

О конкретных блокировках строк и таблиц можно узнать на Baidu.

6. Операторы управления

[Резюме книги] Сценарии с высокой степенью параллелизма, такие как сценарии seckill, вычеты товаров из запасов и оценка запасов, не используют "равно" для определения условия, при котором товарные запасы были распроданы. Вместо этого следует использовать условие больше или меньше.

Быстрая мысль: это классический сценарий перепроданности. Некоторые люди спросят, что будет несколько проблем с перепроданностью, верно? Ответ положительный. Однако, если он оценивается как равный , количество перепроданных штук будет много-много, например 10 000 штук. Но 10 000 перепроданностей и 1 перепроданность — это не один и тот же уровень провала. Или разницу между ошибкой и той, которой нет.

7. Обработка исключений

[Резюме книги] Исключения не должны использоваться для управления процессами, условного управления

Небольшое размышление: вчера JD.com спросил меня, можно ли так понизить это? Следующий код:

try {
    searchFromES()
}catch(){
    searchFromDB()
}

Это не понижение, и так нельзя делать. Во-первых, код написан неправильно, а исключения не должны использоваться для контроля процессов и условного контроля. Во-вторых, пока есть проблемы с чтением ЭП, БД не может быть прочитана. Рассмотрите возможность реализации шаблона проектирования «Цепочка ответственности». Псевдокод выглядит следующим образом:


ESHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

DBHandle {
    void handle() {
        try {
            searchFromES()
        }catch(){
        }
    }
}

// 两个 Handle 利用责任链去实现即可。

8. Создайте спецификацию таблицы, оператор SQL

[Резюме книги] Когда количество строк в одной таблице превышает 5 миллионов строк или емкость одной таблицы превышает 2 ГБ, рекомендуется использовать подтаблицу подбазы данных.

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


【Резюме книги】Не используйте count(название столбца) или count(константа) вместо count(*). Потому что это предварительная версия стандартного счетчика строк, определенного в SQL92. Он считает NULL строки.


[Резюме книги] При условии где можно избежать входа. Обратите внимание на количество наборов входа, которое должно контролироваться в пределах 1000.


[Резюме книги] Напишите запрос на подкачку в коде, если count равен 0, верните пустой список напрямую. Избегайте выполнения приведенного ниже оператора разбиения на страницы.

9. Сервер

[Резюме книги] Рекомендуется уменьшить тайм-аут time_wait протокола TCP для серверов с высокой степенью параллелизма. Linux модифицирует файл /etc/sysctl.conf, код выглядит следующим образом:

net.ipv4.tcp_fin_timeout = 30

[Сводка книги] Параметр настройки JVM -XX:+HeapDumpOnOutOfMemoryError. Разрешить JVM выводить информацию о дампе при обнаружении OOM.

Маленькая мысль: это очень важно. Оба должны сохранить сайт аварийного сервера. Например, если сервер OOMed, машина будет поднята в VIP или что-то в этом роде, чтобы у машины больше не было запросов на вход. Затем проверьте информацию дампа, чтобы устранить проблемы с OOM.

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

Эта статья публикуется блогерами и другими операционными платформами.OpenWriteвыпуск