public class PersonDAO
的单例模式和并发没有任何关联!单例模式,在jvm中只有一个对象!多个线程调用这个对象的方法,没有任何问题的,
不过非常重要的原则就是:不要再DAO中写成员变量,

public class PersonDAO
private String id;
private String name;
private String user;
上面的成员数据都存在一个对象中,会使数据大乱!你的数据,VO(value object)都通过方法参数传递!
如:
public class PersonDAO
public void save(User user){代码}
public void update(User user){}
这样每个线程调用就不会有问题了!这些概念也容易混淆,spring中的IoC的bean注入,都是单子模式,没有问题的!

解决方案 »

  1.   

    public class PersonDAO
    private String id;
    private String name;
    private String user;
    这样写DAO,因为jvm中只有一个对象,所以这些数据都是共享的,会有问题的方法是没有问题的!
      

  2.   

    只要保证PersonDAO实例的操作方法都是线程安全的,多个线程(如IE)同时访问,就不需额外考虑同步的问题;SPRING的默认配置初始化BEAN都是singleton的,但可以根据需要来设成prototype,这样,每次访问的bean会新建
      

  3.   


    设成prototype,这样,每次访问的bean会新建,没有这个必要的!
    你的POJO或者VO每次已经new了,每次实例化个dao,或耗费资源!下面这样的dao是必须每次重建的,否则不同步的哦!
    public class PersonDAO
    private String id;
    private String name;
    private String user; 
      

  4.   


    1 你没有进行synchronized,所以这两个线程不是同步的,a和b不会互相阻塞2 可以都使用一份地址,只不过会出现线程安全问题,但是如果不存在公用的属性的话,是不会有线程安全问题的
      

  5.   

    Landor2004 说得有点意思了
          其实我就是想知道 既然是同一个对象(static的嘛),怎么能同时(也就是并发)被两个线程调用呢? 我觉得是不是分身术.. :)
      

  6.   


     
    您只能输入 8000 个字符禁用UBB   内容存入剪贴板 回帖是一种美德!传说每天回帖即可获得 10 分可用分
     
    您只能输入 8000 个字符禁用UBB   内容存入剪贴板 回帖是一种美德!传说每天回帖即可获得 10 分可用分
     
    您只能输入 8000 个字符禁用UBB   内容存入剪贴板 回帖是一种美德!传说每天回帖即可获得 10 分可用分
     
    您只能输入 8000 个字符禁用UBB   内容存入剪贴板 回帖是一种美德!传说每天回帖即可获得 10 分可用分
      

  7.   

         一个对象(数据)被多个线程访问,有两种方式:
             1.非写操作,   即各个线程只是读其中的数据,这时不需要同步,因为线程之间读到的数据是相互之间没有影响的,这时减弱为互斥(即一个时间内只能有一个线程对其进行读)
             2.写操作    这涉及到数据的统一性,因此也要互斥,但是如果a线程的处理结果要为b线程所用,那么加强为a,b线程同步
      

  8.   

    good学习中
      

  9.   


    将的很有道理,,建议楼主看下,java与模式,,
    懒汉式中,,总过只有一个实例,,所以多线程是没问题,,
    在饿汉式的单例中,,要加同步锁,,是为了防止在并发的线程使用时候,俩个线程同时进入创建俩个实例,,
    所以要加同步锁
      

  10.   


    将的很有道理,,建议楼主看下,java与模式,,
    懒汉式中,,总过只有一个实例,,所以多线程是没问题,,
    在饿汉式的单例中,,要加同步锁,,是为了防止在并发的线程使用时候,俩个线程同时进入创建俩个实例,,
    所以要加同步锁
      

  11.   

    现在国内java书籍讲解得都很浅,不会涉及那么深入
    能说说static 在内存中是怎么分配的吗
      

  12.   

    应该是我概念没有搞明白,在网络上找了很久还是没有答案,尽有一个对象o, 两个线程a,b同时并发 调用o, o 给谁呢?不是同步,还是有先后顺序的吧,难道对象o是同时给了a,b两个线程,怎么可以同时给呢
      

  13.   

    应该是我概念没有搞明白,在网络上找了很久还是没有答案,尽有一个对象o, 两个线程a,b同时并发 调用o, o 给谁呢?不是同步,还是有先后顺序的吧,难道对象o是同时给了a,b两个线程,怎么可以同时给呢
      

  14.   


    不完全赞同,DAO做成单利。我觉得DAO方法也要同步,否则两个线程同时操作一个VO就会有问题。(很少的情况,当我认为还是存在的)当然这样性能会有所损失,我见过的解决方法是这样的,说来和大家分享:通常我们是一个被操作的vo和数据库中的一天记录对应,这样从数据库中获得vo的时候,就有一个唯一的ID(或之类的)。这样们在起一个thread的时候,让id mod threadNumber == threadNumber.这样就可以做到线程之间互补干扰。
      

  15.   

    应该是同步的,一般不会这么做,因为要Thread syn,所以效率会慢.
      

  16.   

    public class PersonDAO 
    的单例模式和并发没有任何关联! 单例模式,在jvm中只有一个对象!多个线程调用这个对象的方法,没有任何问题的, 
    不过非常重要的原则就是:不要再DAO中写成员变量, 
    如 
    public class PersonDAO 
    private String id; 
    private String name; 
    private String user; 
    上面的成员数据都存在一个对象中,会使数据大乱! 你的数据,VO(value object)都通过方法参数传递! 
    如: 
    public class PersonDAO 
    public void save(User user){代码} 
    public void update(User user){} 
    这样每个线程调用就不会有问题了! 这些概念也容易混淆,spring中的IoC的bean注入,都是单子模式,没有问题的!