`

我来证明dwr的application 是线程不安全的

    博客分类:
  • jdk
阅读更多
欢迎大家一起讨论扔砖


我就在网上简单搜了搜, 没找到关于其application的线程安全权威说法

自己看源码吧。。。


扫了一眼javax.servlet.ServletContext的层次结构如下

第二个MockServletContext是个静态内部类

其setAttribute方法居然这样,直接不考虑了

 
      public void setAttribute(String s, Object obj)
       {
       }


剩下org.directwebremoting.util.FakeServletContext了


其setAttribute方法如下:


    public void setAttribute(String name, Object value)
    {
        if(value != null)
            attributes.put(name, value);
        else
            attributes.remove(name);
    }




追加写入一个org.directwebremoting.util.FakeServletContext  其attributes 属性如下:


private final Map attributes;


attributes实例

public FakeServletContext(String resourceBasePath) {
		initParameters = new Properties();
		attributes = new HashMap();
		servletContextName = "FakeServletContext";
		this.resourceBasePath = resourceBasePath == null ? ""
				: resourceBasePath;
		String tempDir = System.getProperty("java.io.tmpdir");
		if (tempDir != null)
			attributes.put("javax.servlet.context.tempdir", new File(tempDir));
	}



显而易见了。。。。。

当然这是我所找到的实现,其他实现可能有所不同,至少Dwr的这个是不安全的,但是还有很多 实现 是线程安全的




  • 大小: 5.8 KB
分享到:
评论
8 楼 qjtttt 2011-03-20  
ldbjakyo 写道
zah5897 写道
ServletContext本来就是线程不安全的啊,LZ去看看那API吧,


不认同"zah5897"这个观点,我记得Lea在并发实践里说过sun对servlet规范没有强制要求是否安全,是各个实现不同而已。

以下是apache-tomcat-5.5.32 的  org.apache.jasper.servlet.JspCServletContext实现

public class JspCServletContext
    implements ServletContext
{

    public JspCServletContext(PrintWriter aLogWriter, URL aResourceBaseURL)
    {
        myAttributes = new Hashtable();
        myLogWriter = aLogWriter;
        myResourceBaseURL = aResourceBaseURL;
    }

    public Object getAttribute(String name)
    {
        return myAttributes.get(name);
    }
    
    ...
    
    protected Hashtable myAttributes;
}


这个可是线程安全的哦!,所以不认同"zah5897",规范都没说,何来你说的"ServletContext本来就是线程不安全的啊"???




再举个例子,也是apache-tomcat-5.5.32 的,这个是  org.apache.catalina.core.ApplicationContext

/**
 * Standard implementation of <code>ServletContext</code> that represents
 * a web application's execution environment.  An instance of this class is
 * associated with each instance of <code>StandardContext</code>.
 *
 * @author Craig R. McClanahan
 * @author Remy Maucherat
 * @version $Id: ApplicationContext.java 939525 2010-04-30 00:36:35Z kkolinko $
 */

public class ApplicationContext
    implements ServletContext {

...
    /**
     * The context attributes for this context.
     */
    protected HashMap attributes = new HashMap();

    /**
     * Return the value of the specified context attribute, if any;
     * otherwise return <code>null</code>.
     *
     * @param name Name of the context attribute to return
     */
    public Object getAttribute(String name) {

        synchronized (attributes) {
            return (attributes.get(name));
        }

    }

   /**
     * Bind the specified value with the specified context attribute name,
     * replacing any existing value for that name.
     *
     * @param name Attribute name to be bound
     * @param value New attribute value to be bound
     */
    public void setAttribute(String name, Object value) {
        ...
        // Add or replace the specified attribute
        synchronized (attributes) {
            // Check for read only attribute
            if (readOnlyAttributes.containsKey(name))
                return;
            oldValue = attributes.get(name);
            if (oldValue != null)
                replaced = true;
            attributes.put(name, value);
        }
        ...

    }
...
}



这个也是线程安全的!  ,建议"zah5897"多多看看源代码吧!



楼主的钻研精神很佩服,不过其实大部分的情况下我们写代码除了init的时候会朝application写之外,一般都是读操作,所以我倒是认为无论application的实现是否线程安全我都当它是个不安全的,可能我孤陋寡闻了,想了一下还真是想不出什么场景下必须要往application里写的
7 楼 ldbjakyo 2011-02-07  
zah5897 写道
ServletContext本来就是线程不安全的啊,LZ去看看那API吧,


不认同"zah5897"这个观点,我记得Lea在并发实践里说过sun对servlet规范没有强制要求是否安全,是各个实现不同而已。

以下是apache-tomcat-5.5.32 的  org.apache.jasper.servlet.JspCServletContext实现

public class JspCServletContext
    implements ServletContext
{

    public JspCServletContext(PrintWriter aLogWriter, URL aResourceBaseURL)
    {
        myAttributes = new Hashtable();
        myLogWriter = aLogWriter;
        myResourceBaseURL = aResourceBaseURL;
    }

    public Object getAttribute(String name)
    {
        return myAttributes.get(name);
    }
    
    ...
    
    protected Hashtable myAttributes;
}


这个可是线程安全的哦!,所以不认同"zah5897",规范都没说,何来你说的"ServletContext本来就是线程不安全的啊"???




再举个例子,也是apache-tomcat-5.5.32 的,这个是  org.apache.catalina.core.ApplicationContext

/**
 * Standard implementation of <code>ServletContext</code> that represents
 * a web application's execution environment.  An instance of this class is
 * associated with each instance of <code>StandardContext</code>.
 *
 * @author Craig R. McClanahan
 * @author Remy Maucherat
 * @version $Id: ApplicationContext.java 939525 2010-04-30 00:36:35Z kkolinko $
 */

public class ApplicationContext
    implements ServletContext {

...
    /**
     * The context attributes for this context.
     */
    protected HashMap attributes = new HashMap();

    /**
     * Return the value of the specified context attribute, if any;
     * otherwise return <code>null</code>.
     *
     * @param name Name of the context attribute to return
     */
    public Object getAttribute(String name) {

        synchronized (attributes) {
            return (attributes.get(name));
        }

    }

   /**
     * Bind the specified value with the specified context attribute name,
     * replacing any existing value for that name.
     *
     * @param name Attribute name to be bound
     * @param value New attribute value to be bound
     */
    public void setAttribute(String name, Object value) {
        ...
        // Add or replace the specified attribute
        synchronized (attributes) {
            // Check for read only attribute
            if (readOnlyAttributes.containsKey(name))
                return;
            oldValue = attributes.get(name);
            if (oldValue != null)
                replaced = true;
            attributes.put(name, value);
        }
        ...

    }
...
}



这个也是线程安全的!  ,建议"zah5897"多多看看源代码吧!


6 楼 zah5897 2010-08-25  
ServletContext本来就是线程不安全的啊,LZ去看看那API吧,
5 楼 neptune 2010-08-25  
application 一般都是init写,以后就读了。
4 楼 soci 2010-08-25  
都 application 了肯定都是读操作 即使写也是定时器单线程写
3 楼 failure5152 2010-08-25  
tel15618037751 写道
根据对这个东西作用的定位,它本来就不需要做到线程安全吧

同意...
2 楼 tel15618037751 2010-08-25  
根据对这个东西作用的定位,它本来就不需要做到线程安全吧
1 楼 aoliwen521 2010-08-25  
servlet规范的实现有很多。你看的是哪一个?

相关推荐

    DWR:java ajax application

    1. **企业级应用**:对于需要频繁与服务器交互的企业级应用来说,DWR可以显著提高用户体验,减少等待时间。 2. **实时应用**:如在线聊天、股票报价等需要实时更新数据的应用,DWR可以快速响应用户的操作,提供流畅...

    dwr dwrdwr

    dwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwrdwr dwr

    DWR的学习资料,DWR学习必备

    DWR中文文档.pdf:这是DWR的官方中文文档,详细解释了DWR的各个方面,包括安装、配置、API使用、安全性和最佳实践。对于初学者来说,这是一个宝贵的资源,可以帮助理解并熟练掌握DWR。 DWR开发培训.ppt、DWR.ppt:...

    DWR中文文档DWR

    - **安全机制**:DWR提供了防止XSS(跨站脚本攻击)和CSRF(跨站请求伪造)的安全机制,确保应用安全性。 2. **配置**: - **web.xml**:在Web应用的部署描述符中配置DWR的Servlet,如`dwr-servlet.xml`,设置...

    dwr1+dwr2+dwr3 jar包

    总的来说,DWR是一个强大的工具,它简化了Web应用中的AJAX开发,让开发者可以更专注于业务逻辑,而不是底层通信细节。通过了解并掌握DWR的不同版本,你可以更好地应对各种项目需求,提升开发效率。

    我整理的dwr详细笔记

    - 在配置dwr.xml时,需要注意安全性问题。例如,不应该让所有Java方法都暴露给客户端调用。 - 对于复杂的数据结构,需要确保客户端能够正确解析服务器返回的数据。 - 需要关注DWR的版本兼容性问题,不同版本间的API...

    dwr笔记 dwr自学资料

    1. **反向Ajax**:DWR实现了一种反向Ajax(Reverse Ajax)技术,使得服务器能够主动向客户端推送数据,而不仅仅是响应客户端的请求。 2. **JavaScript与Java的桥接**:DWR通过动态生成JavaScript库来映射Java对象和...

    DWR3.0.jar、DWR.war和DWR2.0中文说明文档

    这份文档对于理解DWR的工作原理和使用方法至关重要,特别是对于中文用户来说。DWR2.0文档可能会涵盖以下几个方面: - **安装与配置**:介绍如何将DWR添加到现有项目中,包括引入jar文件、配置web.xml和dwr.xml文件...

    dwr demo dwr简单使用

    暴露给JavaScript的服务器端方法可能会引发安全风险,因此需要谨慎设置DWR的访问权限,避免敏感数据和操作被不授权的用户调用。 通过这个简单的DWR演示项目,你可以深入理解DWR的工作原理,掌握如何配置DWR、编写可...

    DWR配置文件详解,DWR配置

    **DWR配置文件详解** Direct Web Remoting (DWR) 是一种开源的Java库,它允许Web应用程序在客户端JavaScript和服务器...理解和配置好`dwr.xml`文件对于充分利用DWR的功能至关重要,同时也对优化性能和安全有直接影响。

    dwr.jar 以及dwr配置文件

    3. **安全控制**:为了防止未授权的访问,你可以配置安全策略,例如使用`&lt;filter&gt;`标签来限制访问的IP地址或者设置安全的白名单。 4. **调试设置**:通过`&lt;debug&gt;`标签,你可以开启或关闭DWR的调试模式,这在开发...

    DWR3参考资料

    在DWR3中,你可以使用`Browser.withPageFiltered()`方法来针对特定页面开启线程,这些线程可以用于实时推送消息。这个方法接受三个参数:页面(page)、过滤器(filter)和一个Runnable对象(通常是一个自定义的线程...

    dwr跨域访问以及dwr的使用+dwr.jar

    Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时、安全的双向通信,有效地打破了JavaScript和Java之间的壁垒。这个技术在2005年推出,主要解决了AJAX(异步JavaScript...

    DWR 教程 中文API DWR.xml配置文件说明 DWR学习笔记

    "DWRchinese.pdf"可能是DWR的中文版官方文档或者一个综合教程,涵盖了从入门到高级的DWR使用技巧,包括但不限于创建远程对象、处理异步请求、使用批处理、调试和性能优化等内容。 在这个压缩包中,"DWR开发培训.ppt...

    dwr相关jar包

    3. **安全机制**:DWR提供了一套安全机制,如CORS(跨源资源共享)支持、同源策略以及可配置的白名单,以限制哪些域名可以访问服务器资源,确保通信安全。 4. **批处理和缓存**:DWR支持批处理多个远程调用,以减少...

    DWR3.0官方中文入门教程以及dwr3.0jar

    6. **安全性和权限控制**:DWR提供了一套安全机制,如白名单配置,限制可以访问的类和方法,防止跨站脚本攻击(XSS)和其他安全风险。 7. **错误处理与调试**:DWR有内置的错误处理机制,当调用失败时会返回错误...

    DWR2.0中文文档

    - **Caja**:DWR的安全特性,它使用一种叫做Caja的沙箱机制来防止跨站脚本攻击(XSS)。 2. **DWR 2.0的新特性** - **Batching**:批量处理,允许多个请求合并成一个HTTP请求,减少网络延迟。 - **Async Calls**...

    dwr3api+DWR文档.pdf

    Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行安全、简单、异步的通信。DWR的核心功能是将JavaScript与Java方法直接绑定,使得前端开发者能够调用服务器端的方法,就像...

    dwr框架资料(主要是关于dwr配置文件的说明)

    DWR的核心功能在于提供了一种简单的方式来调用服务器上的Java方法,并将结果返回到浏览器,这在创建富互联网应用程序(RIA)时非常有用。 在DWR框架中,配置文件起着至关重要的作用,它是连接客户端和服务器端的...

    dwr实现ajax功能ajax+dwr

    DWR则简化了这个过程,提供了一种声明式的方法来调用服务器端的方法。 **Ajax + DWR**结合使用时,DWR作为一个中间层,处理JavaScript和Java之间的通信。开发者可以定义Java类和方法,DWR会自动生成对应的...

Global site tag (gtag.js) - Google Analytics