楼主用的单例方法是:eager init,饿汉式-_-!!亏楼主想得出来这个名字,笑翻我了。楼主的实现能够保证只有一个UrlService实例。没有线程问题。但是楼主你的request不应该传到service中啊,应该在controller中处理request,比如Action(Structs)中。

解决方案 »

  1.   

    请fenixshadow 到网上搜索一下,单例模式中本来就分饿汉式与懒汉式之分,不是我想出来的.
      

  2.   

    在addUrl和getUrl前加上synchronized吧。
      

  3.   

    好象是懒汉式在前面要加synchronized
    饿汉就不用了考虑线程的问题了吧
      

  4.   

    看楼主代码似乎完全不必使用单例把两个方法加上static就行了,我并没有发现方法内调用对象的属性(可能是没贴全),这个对象的存在有何实用价值呢,不如叫UrlUtil.java,应该是一个工具类个人认为楼主代码没有线程问题
      

  5.   

    如果都是方法内的局部变量,就不需要考虑同步了。
    但是看到addUrl(...)方法中有个url,如果此url是service中的实例变量,那就需要考虑多线程的问题了
      

  6.   

    1 你的类确实是单例
    2 你的类方法确实有同步问题全部加上synchronized 可以解决问题,虽然效率低,但有好的办法吗?
      

  7.   

    很简单嘛。
    如果2个thread,使用同一个session,
    如果同时执行ADDURL,那么他们就有机会同时执行
    request.getSession().setAttribute("stack", urlStack); 
    所以必定有一个的setAttribute会立刻被另一个覆盖。嗯。你这个应用也有问题啊。即使做成
    synchronized 
    A THREAD执行完后,也有可能会被B TREAD立刻覆盖的。
    这样A thread后面的操作就没法使用ADDURL的结果了。除非每一个session可以保证只有一个thread访问addurlBTW:
    design pattern 只是代码或者说程序的一个结构,跟同步与否完全是两码事。
    选定一个pattern,还是要分析同步问题的。
      

  8.   

    楼上说的不错,我只注意了UrlService 和request没有注意到session.
      

  9.   

    design pattern 只是代码或者说程序的一个结构,跟同步与否完全是两码事。 
    选定一个pattern,还是要分析同步问题的。 

    非常同意 request.getSession().setAttribute("stack", urlStack); //这句话可以删掉保证session里面初始一次stack属性就行了,必经操作的是引用
      

  10.   

    多个线程访问addUrl和getUrl时是否是线程安全的? 这个和用不用singal instancey有关系吗? 
      

  11.   

    不会有线程安全问题的...这样假设一下..如果一个 用户访问了这个 类..也就是调用了这个类里面的方法..你可以理解为.在..本地产生一个方法的拷贝..这个方法.. 是为每一个用户所独享的.. 其本质.. 就是 这个类.. 为每一个用户开了一个线程..这一个线程之间是不冲突的..你可以找本关于Servlet 的书看看..里面一般就涉及到了线程安全的问题..
      

  12.   


    我原本也是这样认为的,难道必须在addUrl 和getUrl方法前加synchronized吗,没有更好的解决办法吗?
      

  13.   

    正如13楼说的
    Stack是线程安全的
    但是你的request.getSession().setAttribute("stack", urlStack);
    在多线程并发的情况下会有问题
    我也不明白为什么要把request传到service里边,还在service里作setAttribute操作
    你应该从程序的结构上进行调整,而不是简单的在方法前加synchronized