背景
最近的文章均围绕自定义的简易图片加载工具类–ImageLoad,进行学习和分析,源码暂时扣押(还没完全写完。又要搭环境、又要写文章、还要敲代码,还不给钱~~~要代码? 做梦去吧!)。
别别别! 我开玩笑的,明天就给明天就给。
源码送上,请各位帮帮Check Check。XXX0
基于图片加载工具(ImageLoader)的特点:开辟线程池、创建维护图片缓存与磁盘缓存等,决定了它非单例不可。
推荐
推荐文章–单例模式|菜鸟教程。不过你可能需要对synchronized进行了解,说到synchronized怎么能忘记volatile呢?
关于synchronized
以后可能会写一篇,暂时推荐stackoverflow和Java 之 synchronized 详解。
synchronized锁对象(this,非静态方法)或类(.class,静态方法),且记住static修饰的方法不属于任何对象而是与class处于同地位,所以同一个类中的synchronized静态方法与synchronized非静态方法可以异步执行。
关于volatile
写作计划待定,暂推荐volatile,还有一篇大神的深入分析Volatile的实现原理,暂时还不敢恭维。
总结与比较
饿汉式:在类装载的时候实例化,如果对象没有被用到那么实例对象所占的空间就是被浪费掉的。
懒汉式:在需要使用时且发现没有实例对象时才实例化,即第一次使用时实例化,以后均使用这同一个对象。
最后非常要注意的就是线程安全,以及通过synchronized加锁位置的不同在性能上为何会起到优化作用?
单例模式此篇中,比较第2种Lazy(第2种方式暂标记为Lazy,实则DCL也是懒汉式)创建方式和第4种DCL方式,可以看出Lazy使用synchronized为static方法加上锁,故而当多个线程同时调用此方法时,都会进入同步等待状态。而DCL式则是在判断后再进入,当对象已存在后,多个线程调用此方法时将不会陷入同步排队等待之中。