1. Java / Говнокод #6770

    +78

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    public static DBFactory getInstance() throws SQLException
    	{
    		synchronized (DBFactory.class)
    		{
    			        if (_dbinstance == null)
    				_dbinstance = new DBFactory();
    		}
    		return _dbinstance;
    	}

    Серийный и беспощадный доступ к инстансу ДБ-Фэктори -_-
    Причем, данный код фурычит в многопоточной среде, где порой по 20-30 потоков одновременно обращаются к Фэктори, чтобы взять коннект с пула.

    Запостил: VirtualVoid, 27 Мая 2011

    Комментарии (9) RSS

    • В очередь, сукины дети, в очередь!(с)
      Ответить
    • а в чем говно? по мне, грамотный синглтон
      Ответить
      • Может в том, что надо было сделать так:
        if(_dbinstance == null) {
            synchronized(DBFactory.class) {
                 _dbinstance = new DBFactory();
            }
        }
        Ответить
        • нет, нельзя, ибо между проверкой и присвоением другой поток может инициализировать. нужно именно в критической секции и проверять и присваивать
          Ответить
          • существует техника "Double-Checked Locking":
            if(_dbinstance == null) {
                synchronized(DBFactory.class) {
                    if(_dbinstance == null) {
                         _dbinstance = new DBFactory();
                    }
                }
            }

            но она тоже не работает, т.к. компилятор может поменять порядок инициализации DBFactory и _dbinstance.
            Как написано тут: http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
            There is no way to make it work without requiring each thread that accesses the helper object to perform synchronization.
            Лучше использовать
            class DBFactory {
                static DBFactory singleton = new DBFactory();
            }

            т.к. в этом случае инициализация гарантирована самой средой
            Ответить
            • Насколько я помню, паттерн D.C.L можно смело применять при использовании модификатора Volatile.
              А иначе точно каша получится.

              Но тем не менее это нонсенс, синглтоны как раз для этой задачи.
              Ответить
        • Можно, но не нужно.
          Такую задачу проще решить с применением синглтона, чем проверкой-созданием экземпляра.
          Ответить
      • При такой нагрузке делать отложенную инициализацию, мягко говоря, нерационально. К тому же таким образом. Надо _dbinstance было создать в статическом блоке инициализации - и вообще без синхронизации можно обойтись было бы.
        Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий