1.spring 2.5以后都是多例模式吧,也就是说通常在配置文件里的serviceImpl,有几个线程就会有几个实例,就不会出现同步问题吧2.根据JVM的说明,通常对象放在堆里所有线程共享,但是栈是线程独享的,里面放着变量,不同线程不同的栈,怎么还能造成变量同步问题?谢谢

解决方案 »

  1.   

         spring里面配置的对象的是否是单例的是用户自己配置的,如果没配那么spring默认是单例的,@scope(singleton(单例),prototype(每次创建新对象))
         并不是所有的程序都存在线程安全问题,一个对象的不同方法里面只要不存在共享资源就不需要进行线程同步,就像server层的每个方法主要不存在共享对象或者没有对共享对象作修改操作就没必要每次都创建一个对象。
        第二个问题没看懂,是不是每个线程里面的变量名都是这个线程的局部变量,所以对于其他线程都是不可见的,所以没变量同步问题
      

  2.   

    第一个问题楼上回答了,第二个问题
    java中大多数基本类型都是原子的,引用类型也是,所以你不必担心他们的线程安全问题,一定安全的
    但是long和double例外,他们不是原子的,会有多线程操作造成的安全问题,可以加volatile声明它们来确保线程安全性。
      

  3.   

    第二个问题是这样的 ,一个共享对象比如说是账户,里面有个变量是余额现在几个线程去对这个账户对象增加或者删除,这样肯定会有问题吧。
    我的意思是,按JVM说明,几个线程各自拥有这个对象里面变量的栈,怎么还会发生干扰呢?
      

  4.   

    对象引用跟对象是有区别的,对象引用就好像是地址,通过这个地址去找到这个对象,然后再修改这个对象。这个过程中这个对象的地址是不会变的,变的是这个对象的值。
    而栈里面放的就是这个地址就是引用,java里面没有地址这个概念
      

  5.   

    每当启用一个线程时,JVM就为他分配一个JAVA栈,栈是以帧为单位保存当前线程的运行状态。某个线程正在执行的方法称为当前方法,当前方法使用的栈帧称为当前帧,当前方法所属的类称为当前类,当前类的常量池称为当前常量池。当线程执行一个方法时,它会跟踪当前常量池。     每当线程调用一个java方法时,JVM就会在该线程对应的栈中压入一个帧,这个帧自然就成了当前帧。当执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等。java栈上的所有数据都是私有的。任何线程都不能访问另一个线程的栈数据。所以我们不用考虑多线程情况下栈数据访问同步的情况。
    -------------这段话,说的是栈里存的是局部变量和中间运算结果吧,每个线程对于这个账户对象都有一个栈,所以我想发生同步问题和这段话不相符