單例模式-咱們常常都在使用,如下是懶加載的兩種實現方式,僅當學習!
緩存
方案一:synchronized併發
private static SingletonLazy instance = null; private SingletonLazy(){}; public static SingletonLazy getInstance(){ if (null == instance){ createInstance(); } return instance; }
private synchronized static SingletonLazy createInstance(){ if (null == instance){ instance = new SingletonLazy(); } return instance; }
|
方案二:lock (推薦使用)
ide
private static SingletonLazyLock instance = null; private SingletonLazyLock(){};
//加讀寫鎖 private static ReadWriteLock rwl = new ReentrantReadWriteLock();
/** * 單例模式 懶加載併發 * @return */ public static SingletonLazyLock getInstance(){ rwl.readLock().lock(); try { if (null == instance){ rwl.readLock().unlock(); rwl.writeLock().lock(); if(null == instance){ instance = new SingletonLazyLock(); } rwl.writeLock().unlock();
} rwl.readLock().lock(); } catch (Exception e) { e.printStackTrace(); } finally { rwl.readLock().unlock(); }
return instance; }
|
單例雖然沒有緩存寫的那麼平凡,若是在getinstance方法上加sychonize會大大影響性能,單例的寫只有在第一次使用時纔會寫。
性能
使用讀寫鎖操做,基本上都上的讀鎖,對其餘線程訪問沒有影響 !
學習