我一直都很不理解servlet的做法,对于并发的处理机制.
例如:在service方法中,写了一个同步锁(synchronized),那么,是不是有一个用户登陆进去,进入了锁,其他用户就进不了这个页面呢?假如我在锁里面做一个for循环,循环次数接近无限大,是不是其他用户就不能进入这个页面?
另外一个就是servlet中的工厂模式.
我做了一个dao的单例模式,在action中,实例化这个单例模式,那这个实例是怎么运用的呢?每个人都是公用这个单例,就不会存在并发问题吗?毕竟只有一个实例,在内存中是怎么分配的?好象有10000个IP同时访问这个页面,这个单例如何分配?谢谢各位高手给我指点!~

解决方案 »

  1.   

    同步锁(synchronized) 一旦有请求进入一个synchronized的方法,其他对该方法的请求全部要等待,直到该请求处理完毕离开此方法,这和里面有没有for循环没有关系。
    单例模式 在dao中,通常将SessionFactory设计为单利模式,此単例对象sessionFactory用于生产bean,也就是制造session。打个比方来说,有一个汽车工厂SessionFactory,这个工厂的功能就是可以生产很多汽车。虽然需要的汽车数量很多,但是通常一家工厂就够用了,建一个工厂的系统开销是比较大的,所有单例是比较合适的。
    另外需要注意的是,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory 并从中获取Session实例。而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,则将会导致Session 数据存取逻辑混乱.... 
      

  2.   

    servlet规范并没有规定以单例还是多例来实现.如果某一url对应的servlet类是多个实例服务的.
    service方法中同步也不能保证其它用户不能入同步块的逻辑.这要看你在什么对象上同步.这和servlet本身并没有多大关系.
    是要看被同步的对象对于这个service方法的范围.如果是方法内定义的对象,同步其实就是没有任何作用.
      

  3.   

    但是这个SessionFactory是单例模式啊,如果按照你这样的举例,不应该是这个汽车工厂应该是一个只能生产一台汽车的工厂吗?所以人都只能拿到同一个汽车.这样理解对吗?
      

  4.   

    你说的同一个汽车是同一个SessionFactory,但并不是同一辆汽车.
      

  5.   

    一楼讲的不错啊!!一个工厂他制造汽车,生产汽车时就要用它,但是如果为了每造一辆汽车就要建个工厂是不是太浪费资源了。把它做成单例模式为的就是为我们节省资源,他可以动态调节生产线。至于要生产出什么样的汽车那要看每条生产线怎么造了。如果造出的汽车是一个全新的instance,比如用new 生成的,这些汽车已经是一个单独的实例了,即使所有属性一样在内存里他们仍然是单独存在的,如果你想再让这张汽车提供多线程服务那就有问题了,  ,就单引用他而言是没有问题的。
      

  6.   

    一个用户一个连接,在同一个连接中,不同请求访问同一个Servlet才会同步数据
      

  7.   

    不同用户的请求进入的servlet都是不同的