`
shenkun_918
  • 浏览: 27589 次
  • 性别: 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
分享到:
评论

相关推荐

    Java NIO英文高清原版

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    java NIO.zip

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java标准库提供的一种替代传统的I/O模型的新技术。自Java 1.4版本引入NIO后,它为Java开发者提供了更高效的数据传输方式,尤其是在处理大量并发...

    基于nio实现的多文件上传源码

    在Java编程领域,NIO(New IO)是一个重要的特性,它是Java 1.4版本引入的,用于替代标准的IO API。NIO提供了一种非阻塞I/O操作的方式,特别适用于处理大量的并发连接,例如在文件传输、网络通信等场景。本主题...

    基于nio的简易聊天室

    在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接时表现出更高的效率和性能。本项目"基于nio的简易聊天室"旨在通过NIO...

    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...

    httpcore-nio-4.3.jar包

    它基于Java NIO API,利用其非阻塞I/O特性,可以同时处理大量连接,尤其适合于高并发的网络环境。HttpCore NIO 4.3版是对该框架的进一步优化和完善,增强了对HTTP/1.1协议的支持,同时保持了良好的兼容性和稳定性。 ...

    《NIO与Socket编程技术指南》_高洪岩

    《NIO与Socket编程技术指南》是一本深入探讨Java NIO(New Input/Output)和Socket编程的专业书籍,由高洪岩撰写。本书主要针对Java开发者,旨在帮助他们理解和掌握这两种在开发网络应用中至关重要的技术。 Java ...

    java NIO详细教程

    ### Java NIO 详细教程知识点解析 #### 一、Java NIO 概述 Java NIO(New IO)是Java平台提供的一种新的IO操作模式,它首次出现在Java 1.4版本中,并在后续版本中不断完善。Java NIO 的设计目的是为了克服传统Java ...

    NIO 入门.chm,NIO 入门.chm

    **NIO(New Input/Output)是Java编程语言中用于替代标准I/O(BIO,Blocking I/O)的一组API,它提供了非阻塞式的I/O操作方式,极大地提升了Java在处理I/O密集型应用时的性能。NIO在Java 1.4版本中被引入,之后在...

    基于Spring Boot + NIO实现的电商平台见证宝服务

    本项目"基于Spring Boot + NIO实现的电商平台见证宝服务"旨在利用Spring Boot的便捷性与NIO(非阻塞I/O)的效率,来打造一个高效、稳定且可扩展的服务。下面将详细阐述其中涉及的关键技术点。 首先,Spring Boot是...

    基于java的BIO、NIO、AIO通讯模型代码实现

    Java作为一门广泛使用的开发语言,提供了多种I/O(Input/Output)通信模型,包括传统的阻塞I/O(BIO)、非阻塞I/O(NIO)以及异步I/O(AIO)。这些通信模型在不同的场景下有着各自的优势,理解和掌握它们对于优化...

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

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

    javaNiO.doc

    ### Java NIO (New IO) 详解 #### 1. 引言 在Java的世界里,I/O(Input/Output)操作是程序与外部环境进行交互的重要方式之一。随着技术的发展,传统I/O模型逐渐显露出一些局限性,特别是在处理高并发场景下,其...

    JAVA-NIO-DEMO

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,它提供了一种不同于传统IO(基于字节流和字符流)的I/O操作方式。传统的IO模型是阻塞式的,而NIO的核心特点是非阻塞,这使得在处理大量并发I/O请求时更为高效。...

    Java NIO实现多个客户端之间的消息互发,客户端与服务器完整代码

    Java NIO(Non-blocking Input/Output)是一种在Java中处理I/O操作的新方式,相比于传统的BIO(Blocking I/O),NIO提供了更高效的数据传输能力,尤其适合于高并发、低延迟的网络应用,如聊天服务器。在这个场景下,...

Global site tag (gtag.js) - Google Analytics