java单例模式-懒加载
原创
©著作权归作者所有:来自51CTO博客作者niceheart的原创作品,请联系作者获取转载授权,否则将追究法律责任
单例模式-我们经常都在使用,以下是懒加载的两种实现方式,仅当学习!
方案一: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 (推荐使用)
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会大大影响性能,单例的写只有在第一次使用时才会写。
使用读写锁操作,基本上都上的读锁,对其他线程访问没有影响 !