单例模式

背景

  最近的文章均围绕自定义的简易图片加载工具类–ImageLoad,进行学习和分析,源码暂时扣押(还没完全写完。又要搭环境、又要写文章、还要敲代码,还不给钱~~~要代码?   做梦去吧!)。

   别别别! 我开玩笑的,明天就给明天就给。

  源码送上,请各位帮帮Check Check。XXX0

  基于图片加载工具(ImageLoader)的特点:开辟线程池、创建维护图片缓存与磁盘缓存等,决定了它非单例不可。

推荐

  推荐文章–单例模式|菜鸟教程。不过你可能需要对synchronized进行了解,说到synchronized怎么能忘记volatile呢?

关于synchronized

  以后可能会写一篇,暂时推荐stackoverflowJava 之 synchronized 详解
  synchronized锁对象(this,非静态方法)或类(.class,静态方法),且记住static修饰的方法不属于任何对象而是与class处于同地位,所以同一个类中的synchronized静态方法与synchronized非静态方法可以异步执行。

关于volatile

  写作计划待定,暂推荐volatile,还有一篇大神的深入分析Volatile的实现原理,暂时还不敢恭维。

总结与比较

  饿汉式:在类装载的时候实例化,如果对象没有被用到那么实例对象所占的空间就是被浪费掉的。

  懒汉式:在需要使用时且发现没有实例对象时才实例化,即第一次使用时实例化,以后均使用这同一个对象。

  最后非常要注意的就是线程安全,以及通过synchronized加锁位置的不同在性能上为何会起到优化作用?

  单例模式此篇中,比较第2种Lazy(第2种方式暂标记为Lazy,实则DCL也是懒汉式)创建方式和第4种DCL方式,可以看出Lazy使用synchronized为static方法加上锁,故而当多个线程同时调用此方法时,都会进入同步等待状态。而DCL式则是在判断后再进入,当对象已存在后,多个线程调用此方法时将不会陷入同步排队等待之中。