@hirthwork

Тег java в блоге hirthwork

hirthwork

Забавная история. Привык что в джаве статическая инициализация класса происходит в первую очередь при его загрузке. Однако не всё так просто — до статической инициализации происходит инициализация полей enum'а:

enum MyEnum {
    INSTANCE;

    static {
        System.out.println("static");
    }

    MyEnum() {
        System.out.println("c'tor");
    }
}

public class Main {
    public static void main(final String[] args) {
        System.out.println("main");
        System.out.println(MyEnum.INSTANCE);
    }
}

Печатает:

main
c'tor
static
INSTANCE
hirthwork

Переизобрёл unified diff. Просто потому что могу.

hirthwork

Ну пиздец, теперь весь код с синхронайзедов на локи переписывать: https://www.ibm.com/develop...-jtp10264/index.html

hirthwork

минутка рекламы: http://www.twmacinta.com/myjava/fast_md5.php — охуенная реализация, которая работает в два раза быстрее родной реализации MD5 в джаве // завтра катну в продакшен и посмотрю что распидорасит

hirthwork
Map<String, Integer> m = ...;
Number n = m.getOrDefault(key, new Double(0.5d));

Не компилится. А всё потому, что авторам лень было сделать эту функцию дженериком. Говно, кароч
// Плюсопетухи приглашаются покукарекать о том что это ненужно, потому что у них такого нет

hirthwork

Не используйте FilterOutputStream — это говно: http://grepcode.com/file/re...utputStream.java#120

hirthwork

знатно объебался со своим повсеместным использованием try-with-resources
уж если возможна в логике ситуация, когда close вызывать не нужно, то и нехуй try-with-resources тогда в этом месте использовать

hirthwork

Б-же, благослови изобретателей diamond operator и type intersection

hirthwork

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

hirthwork

Я пока точно не уверен, но скорее всего через полчаса вы получите очередную порцию нытья про то что type erasure в джаве — ёбаное говно.

hirthwork

Почему есть static String Objects.toString(Object), но нет static T Objects.clone(T)? Сука, я как плебей должен ручками на null проверять?

hirthwork

дваждымандопроёбище блядь
оказывается, что java не перечитывает /etc/resolv.conf, если он изменился. нужно изъёбываться и вызывать через JNI res_init(3), чтобы изменения подхватились
подробности тута и по ссылкам: https://groups.google.com/f...sympathy/Z8t06cqaWQE

hirthwork

запустил простенький бенчмарк с -server. работа с простыми объектами стала в два раза медленнее, а вот работа с атомиками чуть быстрее

hirthwork

Не используйте glob'ы в java.nio.file.Files — это говно

hirthwork

Шёл 2017 год, но чтобы получить количество секунд с начала эпохи всё ещё нужно ебаться одним из способов на выбор:
a) System.currentTimeMillis() / 1000 — блядь, всю жизнь мечтал магические константы по коду расставлять
б) Instant.now().getEpochSecond() — 2 (две) аллокации объектов, 2 (два) целочисленных деления и ещё горстка арифметических операций на сдачу
в) TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()) — Больше текста, больше текста! // пожалуй на этом варианте и остановлюсь. Главное — не заглядывать больше в реализацию TimeUnit

hirthwork
hirthwork

это чувство, когда понадобилось множественное наследование

hirthwork

Неожиданно ленивая загрузка классов в Java иногда помогает найти race condition даже без нагрузочного тестирования сервиса. Вчерашний пример. Было:

void consume(final PipedInputStream in) throws IOException {
    while (true) {
        int read = in.read(buf);
        ....
    }
}

Стало:

void consume(final PipedInputStream in) throws IOException {
    try (InputStream in = new ThirdPartyWrapper(in)) {
        ....
    }
}

Поскольку класс ThirdPartyWrapper использован был впервые и это вообще был первый вызов функции consume, то JVM запустила ClassLoader, который загрузил класс из jar-ника, который сам по себе довольно тяжёлый, да ещё и на медленном HDD находится.
Короче говоря, от вызова функции до чтения первого байта при первом запуске стало проходить несколько миллисекунд. За это время другой тред стал успевать испортить данные в стриме и сделать его нечитабельным. Вот так я обнаружил race condition, который более-менее стабильно воспроизводится. А с этими вашими плюсцами мне б проблему пришлось в продакшене ловить

hirthwork

socket.getOutputStream().flush() не делает нихуя
всё потому что SocketOutputStream является наследником FileOutputStream, который во flush() не делает нихуя
всё потому что они работают напрямую с файловым дескриптором и вызывают write(2), который не буферизует нихуя
на самом деле в сокете буферизует, но только если включен Nagle's algorithm a.k.a. TCP delay, который включен по умолчанию и выключается при помощи TCP_NODELAY

hirthwork

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

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.