`
shenkun_918
  • 浏览: 26724 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

关于 tomcat nio网上的一个话题

   Tomcat 6.0 使用了 nio 处理,在配置文件中可以配置使用 nio. Connector 属性 protocol 中,官方文档中对该属性的描述:

      Sets the protocol to handle incoming traffic. The default value is HTTP/1.1 and configures the org.apache.coyote.http11.Http11Protocol . This is the blocking Java connector.
If the
PATH (Windows) or LD_LIBRARY_PATH (on most unix systems) environment variables contain the Tomcat native library, the APR connector will automatically be configured. Please be advised that the APR connector has different settings for HTTPS than the default Java connector.
Other values for this attribute are, but not limited to:
org.apache.coyote.http11.Http11Protocol - same as HTTP/1.1
org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector
org.apache.coyote.http11.Http11AprProtocol - the APR connector.
Take a look at our Connector Comparison chart. The configuration for both Java connectors are identical, both for http and https.

   接下来看下官方文档中,对于 tomcat 发展中对于 io 处理的变化。

tomcat nio

 

        google 搜索 tomcat nio, 排在靠前的讨论这么个问题:由阻塞的 io 变成非阻塞的 nio ,有人担心涉及到 threadLocal 的地方就有问题了。 tomcat 使用 nio 之后会影响 hibernate ,spring等框架的 threadLocal 的使用.这种想法有些基本概念上的问题,下面来分析下。

   首先看下 threadLocal 的概念, ThreadLocal 为解决多线程程序的并发问题提供了一种方式, ThreadLocal 相对于同步来说,是以空间换取时间的方式来解决多线程的。 ThreadLocal 并不是一个 Thread ,而是 Thread 的局部变量。 java.lang.TheadLocal 源代码:

 public void set(T value) {  
        Thread t = Thread.currentThread();  
        ThreadLocalMap map = getMap(t);  
        if (map != null)  
            map.set(this, value);  
        else  
            createMap(t, value);  
    }  

 void createMap(Thread t, T firstValue) {  
        t.threadLocals = new ThreadLocalMap(this, firstValue);  
    }  

public T get() {  
    Thread t = Thread.currentThread();  
    ThreadLocalMap map = getMap(t);  
    if (map != null) {  
        ThreadLocalMap.Entry e = map.getEntry(this);  
        if (e != null)  
            return (T) e.value;  
    }  
    return setInitialValue();  
}
//返回当前线程的ThreadLocalMap   
ThreadLocalMap getMap(Thread t) {  
        return t.threadLocals;  
    }
//内部类,按照java虚拟机垃圾回收机制,采用弱引用可以被垃圾回收
    static class ThreadLocalMap {  
      
        /** 
         * The entries in this hash map extend WeakReference, using 
         * its main ref field as the key (which is always a 
         * ThreadLocal object).  Note that null keys (i.e. entry.get() 
         * == null) mean that the key is no longer referenced, so the 
         * entry can be expunged from table.  Such entries are referred to 
         * as "stale entries" in the code that follows. 
         */  
        static class Entry extends WeakReference<ThreadLocal> {  
            /** The value associated with this ThreadLocal. */  
            Object value;  
      
            Entry(ThreadLocal k, Object v) {  
                super(k);  
                value = v;  
            }  
        }  
 

 

 

    个人觉得产生这个错误最根本的原因,是以下基本概念问题没有弄清楚: ThreadLocal java 语言级的支持,并非是 tomcat 级的支持。

 

从面向对象的角度来看的话, tomcat 使用 nio 之后会影响 hibernate 等的 threadLocal 的使用,有面向过程的思想在局限。按照这个想法,把这个问题放大点,如果一个涉及到 java 语言和其他语言一起构成的系统里面。按照这个逻辑是不是 写的所有ThreadLocal 就更不能用了。

      Tomcat nio 和阻塞式的  io 都是在一个小的模块里面,实现的是数据接收 & 发送的功能。用阻塞式的  io 也是一样的,接收到了数据后封装,然后调用处理数据的模块处理。即使是阻塞式的 io 处理是否用到 ThreadLocal ,我们可以从源代码( tomcat6.0 )中看下。从 org.apache.coyote 这个包中没有发现使用 ThreadLocal 的地方,反而在其他的地方如 org.apache.catalina,org.apache.jasper,org.apahce.util 中发现了 ThreadLocal 的使用。在 org.apache.coyote.Reqeust 中关于 ThreadLocal 倒是有这么一段注解中提到话:

   很多人其实是把 ThreadLocal 的作用放大了,ThreadLocal 只是 java 的多线程中只占据很小的一部分位置,不应该把其作用放大。在 java coucurrency in practice 3.3 Thread Confinement 中用很小的篇幅讲了下ThreadLocal.其中提到使用应避免以下误解 :It is easy to abuse THReadLocal by treating its thread confinement property as a license to use global variables or as a means of creating "hidden" method arguments. Like global variables, thread-local variables can detract from reusability and introduce hidden couplings among classes, and should therefore be used with care. (很容易乱用THReadLocal 对于线程限制的特性,看成是全局变量的一个访问许可或是创建方法参数的一个隐藏方式 。如同全局变量相对线程局部变量会损害可重用性,并且需要说明类之间隐藏的关系,所以需要小心使用。)

 

      nio在服务器中的大致结果如附件中的,花了几天时间拜读并翻译了下Doug Lea的一篇文章。

 

  • nio.rar (753.7 KB)
  • 下载次数: 1
分享到:
评论

相关推荐

    xnio-nio-3.8.0.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.0.Final.jar; 赠送原API文档:xnio-nio-3.8.0.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.0.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.0.Final.pom; 包含翻译后的API...

    JAVA NIO 按行读取大文件,支持 GB级别

    设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理...

    httpcore-nio-4.4.6-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.6.jar 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar 赠送源代码:httpcore-nio-4.4.6-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.6-javadoc-API文档-中文(简体)版.zip ...

    Java NIO 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    JavaNIO chm帮助文档

    Java NIO系列教程(一) Java NIO 概述 Java NIO系列教程(二) Channel Java NIO系列教程(三) Buffer Java NIO系列教程(四) Scatter/Gather Java NIO系列教程(五) 通道之间的数据传输 Java NIO系列教程(六)...

    java nio中文版

    java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...

    Java IO, NIO and NIO.2 原版pdf by Friesen

    New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...

    JAVA NIO 按行读取大文件支持 GB级别-修正版

    设计思想: 每次通过nio读取字节到 fbb中 然后对fbb自己中的内容进行行判断即 10 回车 13 行号 0 文件结束 这样字节的判断,然后 返回行 如果 到达 fbb的结尾 还没有结束,就再通过nio读取一段字节,继续处理。 ...

    java NIO和java并发编程的书籍

    java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    java nio 包读取超大数据文件

    Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...

    java基于NIO实现Reactor模型源码.zip

    java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...

    java NIO 视频教程

    Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...

    新输入输出NIO

    JDK 1.4 中引入的新输入输出 (NIO) 库在标准 Java 代码中提供了高速的、面向块的 I/O。本实用教程从高级概念到底层的编程细节,非常详细地介绍了 NIO 库。您将学到诸如缓冲区和通道这样的关键 I/O 元素的知识,并...

    nio入门 IBM教材,pdf格式

    新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就...

    Java NIO英文高清原版

    Java NIO英文高清原版

    尚硅谷Java视频_NIO 视频教程

    尚硅谷_NIO_NIO 与 IO 区别 ·02. 尚硅谷_NIO_缓冲区(Buffer)的数据存取 ·03. 尚硅谷_NIO_直接缓冲区与非直接缓冲区 ·04. 尚硅谷_NIO_通道(Channel)的原理与获取 ·05. 尚硅谷_NIO_通道的数据传输与内存映射文件 ...

    httpcore-nio-4.4.15-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar 包含翻译后的API文档:httpcore-nio-4.4.15-javadoc-API文档-中文(简体)版....

    java NIO.zip

    java NIO.zip

    xnio-nio-3.8.4.Final-API文档-中文版.zip

    赠送jar包:xnio-nio-3.8.4.Final.jar; 赠送原API文档:xnio-nio-3.8.4.Final-javadoc.jar; 赠送源代码:xnio-nio-3.8.4.Final-sources.jar; 赠送Maven依赖信息文件:xnio-nio-3.8.4.Final.pom; 包含翻译后的API...

Global site tag (gtag.js) - Google Analytics