JAVA中的并发问题!

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

谢谢各位高手给我指点!~
...全文
472 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
creso 2011-12-09
  • 打赏
  • 举报
回复
不同用户的请求进入的servlet都是不同的。。。
huangxw000 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 funcreal 的回复:]
我解释一下第二个问题。
“每个人都是公用这个单例,就不会存在并发问题吗?”
当然存在问题,单例也只不过是一个普通的对象而已,如果有必要的话,单例也是需要进行同步的。
举个例子:你的这个单例是一个不变类,那么就不需要同步。如果你只是从这个类读取数据,那么就不需要同步。如果这个类不保存任何属性值,那么也不需要同步。等等...
说白了,单例类和同步没有直接的联系。
[/Quote]顶
cuisj922_2010 2011-12-09
  • 打赏
  • 举报
回复
servlet里最好别加锁。
menghuanxingyuan 2011-12-08
  • 打赏
  • 举报
回复
。。。。。。一个用户一个连接,在同一个连接中,不同请求访问同一个Servlet才会同步数据
ben0759 2009-03-31
  • 打赏
  • 举报
回复
ewsanshao 2009-01-13
  • 打赏
  • 举报
回复
一楼讲的不错啊!!一个工厂他制造汽车,生产汽车时就要用它,但是如果为了每造一辆汽车就要建个工厂是不是太浪费资源了。把它做成单例模式为的就是为我们节省资源,他可以动态调节生产线。至于要生产出什么样的汽车那要看每条生产线怎么造了。如果造出的汽车是一个全新的instance,比如用new 生成的,这些汽车已经是一个单独的实例了,即使所有属性一样在内存里他们仍然是单独存在的,如果你想再让这张汽车提供多线程服务那就有问题了, ,就单引用他而言是没有问题的。
lliiqiang 2008-12-17
  • 打赏
  • 举报
回复
是等待前面的请求处理完毕,而不是无法进入

同步是解决并发问题的常见方法
ben0759 2008-12-17
  • 打赏
  • 举报
回复
越来越不理解了。。
山巅 2008-09-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 java2000_net 的回复:]
1 你理解的没错,如果某个连接进入了同步范围不出来了,其他连接只有等待
2 不是所有问题都是适合单例模式的,这个不是万金油。 需要根据实际情况分析。 我一般在服务类才使用单例,且保证里面的每个方法都是线程安全的。
[/Quote]

请教一下,你在第二点中说的“服务类”具体指什么类,能不能举个例子,谢谢!
ben0759 2008-09-25
  • 打赏
  • 举报
回复
我也觉得
skyhits1921 2008-09-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ben0759 的回复:]
引用 1 楼 gzbao9999 的回复:
同步锁(synchronized) 一旦有请求进入一个synchronized的方法,其他对该方法的请求全部要等待,直到该请求处理完毕离开此方法,这和里面有没有for循环没有关系。
单例模式 在dao中,通常将SessionFactory设计为单利模式,此単例对象sessionFactory用于生产bean,也就是制造session。打个比方来说,有一个汽车工厂SessionFactory,这个工厂的功能就是可以生产很多汽车。虽然需要的汽车数量很多,但…
[/Quote]


你说的同一个汽车是同一个SessionFactory,但并不是同一辆汽车.
ben0759 2008-09-24
  • 打赏
  • 举报
回复
问题还没解决。 .
jiansord 2008-09-24
  • 打赏
  • 举报
回复
同步令牌
huanga52 2008-09-17
  • 打赏
  • 举报
回复
jf
ben0759 2008-09-11
  • 打赏
  • 举报
回复
顶起!
ben0759 2008-09-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzbao9999 的回复:]
同步锁(synchronized) 一旦有请求进入一个synchronized的方法,其他对该方法的请求全部要等待,直到该请求处理完毕离开此方法,这和里面有没有for循环没有关系。
单例模式 在dao中,通常将SessionFactory设计为单利模式,此単例对象sessionFactory用于生产bean,也就是制造session。打个比方来说,有一个汽车工厂SessionFactory,这个工厂的功能就是可以生产很多汽车。虽然需要的汽车数量很多,但是通常一家工厂就够用了,建一…
[/Quote]


但是这个SessionFactory是单例模式啊,如果按照你这样的举例,不应该是这个汽车工厂应该是一个只能生产一台汽车的工厂吗?所以人都只能拿到同一个汽车.这样理解对吗?
axman 2008-09-09
  • 打赏
  • 举报
回复
servlet规范并没有规定以单例还是多例来实现.如果某一url对应的servlet类是多个实例服务的.
service方法中同步也不能保证其它用户不能入同步块的逻辑.这要看你在什么对象上同步.这和servlet本身并没有多大关系.
是要看被同步的对象对于这个service方法的范围.如果是方法内定义的对象,同步其实就是没有任何作用.
funcreal 2008-09-09
  • 打赏
  • 举报
回复
我解释一下第二个问题。
“每个人都是公用这个单例,就不会存在并发问题吗?”
当然存在问题,单例也只不过是一个普通的对象而已,如果有必要的话,单例也是需要进行同步的。
举个例子:你的这个单例是一个不变类,那么就不需要同步。如果你只是从这个类读取数据,那么就不需要同步。如果这个类不保存任何属性值,那么也不需要同步。等等...
说白了,单例类和同步没有直接的联系。
老紫竹 2008-09-09
  • 打赏
  • 举报
回复
1 你理解的没错,如果某个连接进入了同步范围不出来了,其他连接只有等待
2 不是所有问题都是适合单例模式的,这个不是万金油。 需要根据实际情况分析。 我一般在服务类才使用单例,且保证里面的每个方法都是线程安全的。
gzbao9999 2008-09-09
  • 打赏
  • 举报
回复
同步锁(synchronized) 一旦有请求进入一个synchronized的方法,其他对该方法的请求全部要等待,直到该请求处理完毕离开此方法,这和里面有没有for循环没有关系。
单例模式 在dao中,通常将SessionFactory设计为单利模式,此単例对象sessionFactory用于生产bean,也就是制造session。打个比方来说,有一个汽车工厂SessionFactory,这个工厂的功能就是可以生产很多汽车。虽然需要的汽车数量很多,但是通常一家工厂就够用了,建一个工厂的系统开销是比较大的,所有单例是比较合适的。
另外需要注意的是,SessionFactory是线程安全的,多个并发线程可以同时访问一个SessionFactory 并从中获取Session实例。而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,则将会导致Session 数据存取逻辑混乱....

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧