单例模式 -通俗易懂的讲解
2013-04-10 01:41
218 查看
什么是单例模式:
保证一个类有且仅有一个实例,并提供它的全局访问点。
单例模式有什么用:
其实单例的作用在于避免产生太多实例,也就是不用new那么多次,new一次就占用一次内存的资源,new多了电脑也会慢的。
具体举个例子吧。
在取款的时候,绝对不允许有多个对象,假如多个对象同时操作数据库,将导致线程不安全,有可能出现同时取款,账目只扣一次款。
至于说为什么只扣一次款,了解的看下文,不想的直接看代码。
假如数据库中的钱是1000块,两个对象同时操作该数据库,而同时取款200,这时,第一个对象获取到数据的余额是1000,于是扣款200,余额是800,可惜在改成800之前,第二个对象也操作了一遍,它获取到余额还是1000,那没办法了,谁叫你第一个对象动作慢,这再取款200,余额还是800。看懂了没,这就是多线程多对象的不安全例子。
运行结果:
实例化
对象已存在,不用实例化
对象已存在,不用实例化
目前的钱是:30
保证一个类有且仅有一个实例,并提供它的全局访问点。
单例模式有什么用:
其实单例的作用在于避免产生太多实例,也就是不用new那么多次,new一次就占用一次内存的资源,new多了电脑也会慢的。
具体举个例子吧。
在取款的时候,绝对不允许有多个对象,假如多个对象同时操作数据库,将导致线程不安全,有可能出现同时取款,账目只扣一次款。
至于说为什么只扣一次款,了解的看下文,不想的直接看代码。
假如数据库中的钱是1000块,两个对象同时操作该数据库,而同时取款200,这时,第一个对象获取到数据的余额是1000,于是扣款200,余额是800,可惜在改成800之前,第二个对象也操作了一遍,它获取到余额还是1000,那没办法了,谁叫你第一个对象动作慢,这再取款200,余额还是800。看懂了没,这就是多线程多对象的不安全例子。
class Singleton{ private static Singleton sing; private int money=100; public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public void addMoney(int mon){ money+=mon; } public void withdrawl(int mon){ money-=mon; } private Singleton(){ } public static synchronized Singleton getInstance(){ if(sing==null){//如果对象没有实例化,则实例化 System.out.println("实例化"); sing=new Singleton(); return sing; }else{ System.out.println("对象已存在,不用实例化"); return sing; } } } public class SingletonTest { public static void main(String[] args) { Singleton.getInstance().addMoney(10); Singleton.getInstance().withdrawl(80); int money=Singleton.getInstance().getMoney(); System.out.println("目前的钱是:"+money); } }
运行结果:
实例化
对象已存在,不用实例化
对象已存在,不用实例化
目前的钱是:30
相关文章推荐
- 工厂模式-通俗易懂的讲解
- 用io包讲解Decorator模式
- 仿ArrayList和LinkedList,讲解迭代模式和链表结构
- hadoop伪分布模式配置知识点讲解
- iOS疯狂讲解之单例模式传值的简单介绍
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模)
- 举例讲解iOS应用开发中对设计模式中的策略模式的使用
- PHP单例模式经典讲解
- DOM 之通俗易懂讲解
- 设计模式轻松讲解
- .NET桥接模式讲解
- 给大家分享一个桥接模式的讲解
- 通俗易懂的讲解区块链
- Android 代理模式讲解
- JS设计模式——观察者模式(通俗易懂)
- 正则表达式之贪婪模式讲解
- WPF经典编程模式-MVVM示例讲解
- JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
- PHP单例模式经典讲解
- 单例模式 - 一篇讲解很好的博客