Java单例模式(饿汉式)的线程安全问题 楼主用的单例方法是:eager init,饿汉式-_-!!亏楼主想得出来这个名字,笑翻我了。楼主的实现能够保证只有一个UrlService实例。没有线程问题。但是楼主你的request不应该传到service中啊,应该在controller中处理request,比如Action(Structs)中。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 请fenixshadow 到网上搜索一下,单例模式中本来就分饿汉式与懒汉式之分,不是我想出来的. 在addUrl和getUrl前加上synchronized吧。 好象是懒汉式在前面要加synchronized饿汉就不用了考虑线程的问题了吧 看楼主代码似乎完全不必使用单例把两个方法加上static就行了,我并没有发现方法内调用对象的属性(可能是没贴全),这个对象的存在有何实用价值呢,不如叫UrlUtil.java,应该是一个工具类个人认为楼主代码没有线程问题 如果都是方法内的局部变量,就不需要考虑同步了。但是看到addUrl(...)方法中有个url,如果此url是service中的实例变量,那就需要考虑多线程的问题了 1 你的类确实是单例2 你的类方法确实有同步问题全部加上synchronized 可以解决问题,虽然效率低,但有好的办法吗? 很简单嘛。如果2个thread,使用同一个session,如果同时执行ADDURL,那么他们就有机会同时执行request.getSession().setAttribute("stack", urlStack); 所以必定有一个的setAttribute会立刻被另一个覆盖。嗯。你这个应用也有问题啊。即使做成synchronized A THREAD执行完后,也有可能会被B TREAD立刻覆盖的。这样A thread后面的操作就没法使用ADDURL的结果了。除非每一个session可以保证只有一个thread访问addurlBTW:design pattern 只是代码或者说程序的一个结构,跟同步与否完全是两码事。选定一个pattern,还是要分析同步问题的。 楼上说的不错,我只注意了UrlService 和request没有注意到session. design pattern 只是代码或者说程序的一个结构,跟同步与否完全是两码事。 选定一个pattern,还是要分析同步问题的。 非常同意 request.getSession().setAttribute("stack", urlStack); //这句话可以删掉保证session里面初始一次stack属性就行了,必经操作的是引用 多个线程访问addUrl和getUrl时是否是线程安全的? 这个和用不用singal instancey有关系吗? 不会有线程安全问题的...这样假设一下..如果一个 用户访问了这个 类..也就是调用了这个类里面的方法..你可以理解为.在..本地产生一个方法的拷贝..这个方法.. 是为每一个用户所独享的.. 其本质.. 就是 这个类.. 为每一个用户开了一个线程..这一个线程之间是不冲突的..你可以找本关于Servlet 的书看看..里面一般就涉及到了线程安全的问题.. 我原本也是这样认为的,难道必须在addUrl 和getUrl方法前加synchronized吗,没有更好的解决办法吗? 正如13楼说的Stack是线程安全的但是你的request.getSession().setAttribute("stack", urlStack);在多线程并发的情况下会有问题我也不明白为什么要把request传到service里边,还在service里作setAttribute操作你应该从程序的结构上进行调整,而不是简单的在方法前加synchronized 大家如何单元测试JSP~我都弄了四天了,还是没搞定~ weblogic jndi lookup 的问题。在线等。。求救 spring配置的问题 Lucene 的 highlight 显示 Struts2的OGNL访问问题 struts2: <s:if test="">中,如何判断一个集合是否为空? Hibernate3.2报错:java.lang.ClassCastException如何解决呢? 回家了,散点分! 请教:在Spring 1.2.x 中,配置发送邮件服务的问题 老是报404错误 DBCP相关问题 ??请教,在struts中使用javascript的省市县联动??
饿汉就不用了考虑线程的问题了吧
但是看到addUrl(...)方法中有个url,如果此url是service中的实例变量,那就需要考虑多线程的问题了
2 你的类方法确实有同步问题全部加上synchronized 可以解决问题,虽然效率低,但有好的办法吗?
如果2个thread,使用同一个session,
如果同时执行ADDURL,那么他们就有机会同时执行
request.getSession().setAttribute("stack", urlStack);
所以必定有一个的setAttribute会立刻被另一个覆盖。嗯。你这个应用也有问题啊。即使做成
synchronized
A THREAD执行完后,也有可能会被B TREAD立刻覆盖的。
这样A thread后面的操作就没法使用ADDURL的结果了。除非每一个session可以保证只有一个thread访问addurlBTW:
design pattern 只是代码或者说程序的一个结构,跟同步与否完全是两码事。
选定一个pattern,还是要分析同步问题的。
选定一个pattern,还是要分析同步问题的。
非常同意 request.getSession().setAttribute("stack", urlStack); //这句话可以删掉保证session里面初始一次stack属性就行了,必经操作的是引用
我原本也是这样认为的,难道必须在addUrl 和getUrl方法前加synchronized吗,没有更好的解决办法吗?
Stack是线程安全的
但是你的request.getSession().setAttribute("stack", urlStack);
在多线程并发的情况下会有问题
我也不明白为什么要把request传到service里边,还在service里作setAttribute操作
你应该从程序的结构上进行调整,而不是简单的在方法前加synchronized