在学习spring框架的时候 一个bean的范围可以是singleton和prototype
singleton模式线程是不安全的,在学JSP的时候也涉及到这些内容
现在来提问下,为什么设置singlton后,会存在线程不安全问题
线程不安全主要表现在哪里?

解决方案 »

  1.   


    你问到"为什么设置singlton后,会存在线程不安全问题?",那得首先了解什么是线程安全:
    对于多线程来讲,如果所使用的公用变量在多线程下没有被保护机制时,变量结果会和理论值不一致,这样就叫作线程不安全,相反公用变量在保护机制下工作,就不会出现未知变化,那这样线程就是安全的.
    你的问题:
    你在使用单例模式创建对象的时候,如果多个对象同时被创建,又同时被修改或调用就有可能导致了理论值和结果值的不一致,此时线程即是不安全的.
    而现在你要做的就是在单例模式下,为防止多线程使用带来的不安全而做同步处理,这种同步处理就是上面说的保护机制.详细的线程同步方法我就不介绍了,你参阅下http://www.cnblogs.com/yinhaiming/articles/1398933.html希望已经帮你解决了疑问:~)
      

  2.   

    而使用单例模式的一个主要出发点: 
    1. 全局单例。  
    这就涉及访问共享资源的安全问题。  
    对于一般而言 。在这种操作上都采取互斥锁来保证共享数据的安全性 。
    但这样是以失去性能为代价。  
    而更高级点的。采用TM模式或者共享锁来实现性能的提升。
    但这样带来的是复杂度的上升。 2. 性能:  
    对于一些需要频繁创建且内容基本相同变化较少的实例。 
    如Spring 的上下文环境 。  
    一些配置文件信息等。  
    避免每次重复加载配置信息而造成资源 性能 的浪费。可以使用单例模式 。
      

  3.   

    单例顾名思义就是只有一份数据的意思,当你同时对一份数据进行操作时,就会导致数据不一致,这就是所谓的线程不安全。
    数据库是单例的一个典型代表,在数据库中存在读脏数据、不可重复读、幻读就是因为同时操作一份数据的原因。
    比如有一个表,存储火车票信息,其中字段有火车票的总数,
    A买火车票,操作取出火车票总数(假如是100),减一,再将99存进去。
    在A买的同时,另一个窗口的B也在买车票,操作取出火车票总数,由于A还没有买到车票,所以他取出来的总数也是100,减一,再将99存进去。
    此时,火车站出售了两张票,而记录显示是出售一张,这就是因为B读取数据时,出现了读脏数据。
    详细内容  参考 数据库的教材当action中不存在成员变量时,不会出现线程不安全的问题,如果存在就需要加锁,保证线程安全。
    什么是加锁,简单的讲就是买票的时候要排队,前面的没买完,你就不能买。当然还有别的解决方案,比如通过版本号来区别,我就不多讲了。