Enum-Всемогутній

Вступна
Дуже часто, ми використовуємо інструменти строго за призначенням, забороняючи собі робити крок вліво або вправо. Але що якщо ми трохи 'забудемся'? Що, якщо ми подивимося на звичні нам речі під іншим кутом? У цій статті зібрані підходи використання перерахувань та проведено невеличкий експеримент над ними. Сарказм, гумор і трохи филосовских питань. Кому цікаво, ласкаво просимо під кат.

Читати далі →

Ще раз (сподіваюся, останній) про double-checked locking

Статей про double-checked locking на Хабре було стільки, що здавалося б, ще одна — і Хабр лопне. Ось тільки по Java непогані публікації: Реалізація Singleton в JAVA, Правильний Singleton в Java, А як же все-таки працює багатопоточність? Частина II: memory ordering або ось чудовий пост від TheShade слава web-archive!). У наші дні, напевно, кожен Java-розробник чув, що якщо використовуєш DCL, будь ласка оголосити змінну volatile. Знайти сьогодні в коді відомих опенсорсных проектів DCL без volatile досить важко, але виявилося, що проблеми ще не повністю вирішені. Тому я додам невелику замітку по темі з прикладами з реальних проектів.

Іноді складається відчуття, що програмісти не включають мізки і не намагаються зрозуміти, як що працює, а просто йдуть простим і зрозумілим правилам кшталт «оголоси змінну volatile, використовуй DCL, і все буде добре». На жаль, такий підхід в програмуванні не завжди працює.

Читати далі →

Function Pointer - забута реалізація шаблону Singleton

Багато статей написано про те, як правильно реалізовувати на Java шаблон проектування Singleton.
 
Як правило, фахівці ламають списи навколо проблеми, як поєднати коректну роботу в умовах багатопотокового використання та ефективне виконання, що забезпечує продуктивність, близьку максимальною.
 
Особисто я вважаю єдиним коректним способом реалізації Сінглтона на Java так званий Synchronized Accessor :
 
 
public class Singleton {
    private static Singleton instance;
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 
Саме так задумували реалізацію такого завдання автори віртуальної машини Java, саме така реалізація використовується в стандартній бібліотеці класів мови Java. Якщо ж для програми метод доступу до Сінглтон стає вузьким місцем, то це привід для того, щоб справити редизайн програми, щоб вона зверталася до глобального об'єкту не так часто.
 
Проте, намагаючись освіжити в пам'яті можливості Java concurrency, я почитав старі статті про варіанти Сінглтон і здивувався, що не знайшов! Опису ще одного способу, який я називаю Function Pointer .
 
Читати далі →

Генна модифікація

    
Існують патерни натуральні, що пройшли довгий шлях еволюційного розвитку, а є й інші, начебто і такі ж, але модифіковані, поліпшені — місцями до невпізнання. Втім, назву і зовнішня схожість частіше залишаються. А от далі починається магія. Вже не знаю, чи то це я такий везучий, чи то життя не так проста, як хочеться думати, але зустрічаються мені постійно ось ці — модифіковані патерни. У даній статті буде розглянуто декілька таких прикладів і зроблена спроба відновити образ мислення героя-експериментатора, який породив на світ нові організми, так старанно маскіруемие під всім знайомі. Питання «чому так?» Поки залишиться без відповіді.
 
Читати далі →