??xml version="1.0" encoding="utf-8" standalone="yes"?>永久免费毛片在线播放不卡,91亚洲人成网污www,国产精品97http://www.aygfsteel.com/shinzey/思h不必自扰Q智者何需千虑Q?/description>zh-cnSat, 17 May 2025 19:54:52 GMTSat, 17 May 2025 19:54:52 GMT60Java EE 7 新功能前?/title><link>http://www.aygfsteel.com/shinzey/archive/2012/02/13/369874.html</link><dc:creator>蜀山兆孨龘</dc:creator><author>蜀山兆孨龘</author><pubDate>Mon, 13 Feb 2012 14:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/shinzey/archive/2012/02/13/369874.html</guid><wfw:comment>http://www.aygfsteel.com/shinzey/comments/369874.html</wfw:comment><comments>http://www.aygfsteel.com/shinzey/archive/2012/02/13/369874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shinzey/comments/commentRss/369874.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shinzey/services/trackbacks/369874.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="article"> <p>21 世纪初,Spring 框架的诞生和崛v让沉重而腐朽的 J2EE 遭到了当头棒喝,随后大批开发h员{?Spring 阵营Q呼吔Rp J2EE 阵营大伤元气。然而这U命悬一U的危机q没有造成毁灭性的打击Q尤其是对于 Java q种提倡开攄q_而言Q取长补短,互相促进才是正道。于是,JCP 委员会痛定思痛Q在 2006 q推?Java EE 5 规范Q主要是?EJB 的开发进行了极大q度的简化?008 q发布的 Java EE 6 引入?CDI、BV、JAX-RS {一pd新功能,q且以配|文ӞprofileQ的方式?Java EE 向轻量q进了一步。特别有的是,Spring 框架也开始提供对某些 Java EE 注解的支持,是否标志着两大阵营开始合?Java EE 7 预定于今q下半年发布Q目标是支持云计。最q几q来Q云计算一直被炒作Q却从来没有一个准的定义和规范,希望 Java EE 7 能够?Java 界扭转这U尴的局面?/p> <p>下面开始详l列?Java EE 7 的新功能前瞻Q数据来源于《Java Magazine 2012-01/02》中的《Cloud/Java EE: Looking Ahead to Java EE 7》一文。Java EE 7 是以“日期驱动”的方式开发的Q也是_在计划日期到辑։没有完成的功能都被推迟?Java EE 8?/p> <h1>Java EE 7QJSR-342Q?/h1> <ul> <li>主题Q让应用E序能够在私有或公共云上Ҏ地运行?/li> <li>该^台将定义一个应用程序元数据描述W,以描q?PaaS 执行环境Q例如多U户、资源共享、服务质量,以及应用E序间的依赖Q?/li> <li>支持 HTML5、WebSocket、JSON {新标准Qƈ为它们一一提供 API?/li> <li>消除受管 Bean、EJB、Servlet、JSF、CDI ?JAX-RS 之间不一致的地方?/li> <li>可能?Web 配置文g中包?JAX-RS 2.0 ?JMS 2.0 API 修订版?/li> <li>更新一些现有的技术,可能引入用于 Java EE 的ƈ发工PJSR-236Q和 JCacheQJSR-107Q?/li> </ul> <h1>Java Persistence 2.1QJSR-338Q?/h1> <ul> <li>支持多租戗?/li> <li>支持存储q程和厂商函数?/li> <li>用规则(CriteriaQ进行更新和删除?/li> <li>支持数据库大UԌSchemeQ的生成?/li> <li>持久化上下文的同步?/li> <li>侦听器中?CDI 注入?/li> </ul> <h1>JAX-RS 2.0: The Java API for RESTful Web ServicesQJSR-339Q?/h1> <ul> <li>客户?API——底层用构模式,可能提供上层装?/li> <li>媒体——轻村ֈ建和处理兌了资源的链接?/li> <li>使用 Bean 验证框架来验证表单或查询参数?/li> <li>?<code>@Inject</code> 更紧密集成?/li> <li>服务端的异步h处理?/li> <li>使用“qs”进行服务端的内容协商?/li> </ul> <h1>Java Servlet 3.1QJSR-340Q?/h1> <ul> <li>?Web 应用E序优化 PaaS 模型?/li> <li>用于安全、会话和资源的多U户?/li> <li>Z NIO2 的异?I/O?/li> <li>化的异步 Servlet?/li> <li>利用 Java EE q发工具?/li> <li>支持 WebSocket?/li> </ul> <h1>Expression Language 3.0QJSR-341Q?/h1> <ul> <li>?<code>ELContext</code> 分离析和求g下文?/li> <li>可定制的 EL 规则?/li> <li>?EL 表达式中直接引用静态方法和成员?/li> <li>dq算W,例如{于、字W串q接和取大小?/li> <li>?CDI 集成Q例如在表达式求值前/?后生成事件?/li> </ul> <h1>Java Message Service 2.0QJSR-343Q?/h1> <ul> <li>化开发——改?JMS ~程模型Q让应用E序开发变得更加简单容易?/li> <li>清除/澄清现有规范中的模糊之处?/li> <li>?CDI 集成?/li> <li>澄清 JMS 和其?Java EE 规范之间的关pR?/li> <li>新的强制?API允许M JMS 提供者能与Q?Java EE 容器集成?/li> <li>来自q_的多U户和其他云相关的功能?/li> </ul> <h1>JavaServer Faces 2.2QJSR-344Q?/h1> <ul> <li>化开发——配置选项动态化Q复合lg中的 <code>cc:interface</code> 可选,Facelet 标记库的速记 URLQ与 CDI 集成QJSF lg?OSGi 支持?/li> <li>支持 Portlet 2.0 桥(JSR-329Q的实现?/li> <li>支持 HTML5 的功能,例如 HTML5 表单、元数据、头部和区段内容模型?/li> <li>管理,面D事g的侦听器Q以?<code>fileUpload</code> ?<code>BackButton</code> {新lg?/li> </ul> <h1>Enterprise JavaBeans 3.2QJSR-345Q?/h1> <ul> <li>增强 EJB 架构以支?PaaSQ例如多U户?/li> <li>对在 EJB 外用容器管理的事务q行工厂化?/li> <li>更进一步用注解?/li> <li>与^C的其他规范对齐和集成?/li> </ul> <h1>Contexts and Dependency Injection 1.1QJSR-346Q?/h1> <ul> <li>拦截器的全局排序和管理内Z下文的装饰器 API?/li> <li>可在 Java EE 容器外启动的嵌入式模式?/li> <li>声明式地控制归中的哪些包和 Bean 被扫描?/li> <li>注入日志之类的静态成员?/li> <li>?Servlet 事g作ؓ CDI 事g发送?/li> </ul> <h1>Bean Validation 1.1QJSR-349Q?/h1> <ul> <li>与其?Java EE 规范集成?/li> <li>JAX-RSQ在 HTTP 调用中验证参数和q回倹{?/li> <li>JAXBQ将U束条g转换?XML 模式描述W中?/li> <li>ҎU别的验证?/li> <li>在组集合上应用约束条件?/li> <li>扩展模型以支持“与”和“或”风格的l合?/li> </ul> <h1>JCache: Java Temporary Caching APIQJSR-107Q?/h1> <ul> <li>在内存中暂存 Java 对象?API 和语义,包括对象的创建、共享访问、缓存池、失效,以及?JVM 的一致性?/li> </ul> <h1>Java State ManagementQJSR-350Q?/h1> <ul> <li>应用E序?Java EE 容器可用该 API 状态管理的d交给h不同 QoS 特征的第三方提供者?/li> <li>Z Java SE 的调用者可通过查询状态提供者来讉K状态数据?/li> <li>可添加具有不?QoS 的提供者,API 调用者能够按自己的规则进行查询?/li> </ul> <h1>Batch Applications for the Java PlatformQJSR-352Q?/h1> <ul> <li>用于批处理应用程序的~程模型Q以及用于调度和执行工作的运行时?/li> <li>为标准编E模型定义批处理工作、批处理工作步骤、批处理应用E序、批处理执行器和批处理工作管理器?/li> </ul> <h1>Concurrency Utilities for Java EEQJSR-236Q?/h1> <ul> <li>提供一个整z、简单且独立?APIQ其能用于M Java EE 容器中?/li> </ul> <h1>Java API for JSON ProcessingQJSR-353Q?/h1> <ul> <li>处理 JSON ?Java API?/li> </ul> </div><img src ="http://www.aygfsteel.com/shinzey/aggbug/369874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shinzey/" target="_blank">蜀山兆孨龘</a> 2012-02-13 22:23 <a href="http://www.aygfsteel.com/shinzey/archive/2012/02/13/369874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非主ƈ发工具之 ForkJoinPoolhttp://www.aygfsteel.com/shinzey/archive/2012/02/09/368312.html蜀山兆孨龘蜀山兆孨龘Thu, 09 Feb 2012 02:40:00 GMThttp://www.aygfsteel.com/shinzey/archive/2012/02/09/368312.htmlhttp://www.aygfsteel.com/shinzey/comments/368312.htmlhttp://www.aygfsteel.com/shinzey/archive/2012/02/09/368312.html#Feedback2http://www.aygfsteel.com/shinzey/comments/commentRss/368312.htmlhttp://www.aygfsteel.com/shinzey/services/trackbacks/368312.html

ForkJoinPool ?Java SE 7 新功能“分?l合框架”的核心c,现在可能乏h问|Q但我觉得它q早会成Z。分?l合框架是一个比较特D的U程池框Ӟ专用于需要将一个Q务不断分解成子Q务(分叉Q,再不断进行汇d到最l结果(l合Q的计算q程。比起传l的U程池类 ThreadPoolExecutorQ?code>ForkJoinPool 实现了工作窃取算法,使得I闲U程能够d分担从别的线E分解出来的子Q务,从而让所有的U程都尽可能处于饱满的工作状态,提高执行效率?/p>

ForkJoinPool 提供了三cL法来调度子Q务:

execute pd
异步执行指定的Q务?/dd>
invoke ?invokeAll
执行指定的Q务,{待完成Q返回结果?/dd>
submit pd
异步执行指定的Q务ƈ立即q回一?Future 对象?/dd>

子Q务由 ForkJoinTask 的实例来代表。它是一个抽象类QJDK 为我们提供了两个实现Q?code>RecursiveTask ?RecursiveActionQ分别用于需要和不需要返回计结果的子Q务?code>ForkJoinTask 提供了三个静态的 invokeAll Ҏ来调度子dQ注意只能在 ForkJoinPool 执行计算的过E中调用它们?/p>

ForkJoinPool ?ForkJoinTask q提供了很多让hD~ؕ的公共方法,其实它们大多数都是其内部实现去调用的Q对于应用开发h员来说意义不大?/p>

下面以统?D 盘文件个Cؓ例。这实际上是对一个文件树的遍历,我们需要递归地统计每个目录下的文件数量,最后汇总,非常适合用分?l合框架来处理:

// 处理单个目录的Q?
public class CountingTask extends RecursiveTask<Integer> {
    private Path dir;

    public CountingTask(Path dir) {
        this.dir = dir;
    }

    @Override
    protected Integer compute() {
        int count = 0;
        List<CountingTask> subTasks = new ArrayList<>();

        // d目录 dir 的子路径?
        try (DirectoryStream<Path> ds = Files.newDirectoryStream(dir)) {
            for (Path subPath : ds) {
                if (Files.isDirectory(subPath, LinkOption.NOFOLLOW_LINKS)) {
                    // Ҏ个子目录都新Z个子d?
                    subTasks.add(new CountingTask(subPath));
                } else {
                    // 遇到文gQ则计数器增?1?
                    count++;
                }
            }

            if (!subTasks.isEmpty()) {
                // 在当前的 ForkJoinPool 上调度所有的子Q务?
                for (CountingTask subTask : invokeAll(subTasks)) {
                    count += subTask.join();
                }
            }
        } catch (IOException ex) {
            return 0;
        }
        return count;
    }
}

// 用一?ForkJoinPool 实例调度“MQ务”,然后敬请期待l果…?
Integer count = new ForkJoinPool().invoke(new CountingTask(Paths.get("D:/")));
    

在我的笔记本上,l多ơ运行这D代码,耗费的时间稳定在 600 豪秒左右。普通线E池Q?code>Executors.newCachedThreadPool()Q耗时 1100 毫秒左右Q见工作窃取的优势?/p>

l束本文前,我们来围观一个最奇的结果:单线E算法(使用 Files.walkFileTree(...)Q比q两个都快,q_耗时 550 毫秒Q这警告我们q引入多线E就能优化性能Qƈ要先经q多ơ测试才能下l论?/p>

蜀山兆孨龘 2012-02-09 10:40 发表评论
]]>
Java |络~程从菜鸟到叫兽 4Q面向流的套接字 I/Ohttp://www.aygfsteel.com/shinzey/archive/2012/01/19/368751.html蜀山兆孨龘蜀山兆孨龘Thu, 19 Jan 2012 06:37:00 GMThttp://www.aygfsteel.com/shinzey/archive/2012/01/19/368751.htmlhttp://www.aygfsteel.com/shinzey/comments/368751.htmlhttp://www.aygfsteel.com/shinzey/archive/2012/01/19/368751.html#Feedback1http://www.aygfsteel.com/shinzey/comments/commentRss/368751.htmlhttp://www.aygfsteel.com/shinzey/services/trackbacks/368751.html

前面已经看到Q?code>Socket cȝ getInputStream() ?getOutStream() Ҏ分别获取套接字的输入和输出。输入流用来dq端发送过来的数据Q输出流则用来向q端发送数据?/p>

输入?/h1>

使用套接字的输入读取数据时Q当前线E会q入d状态,直到套接字收C些数据ؓ止(亦即套接字的接收~冲区有可用数据Q。该输入的 available() Ҏ只是q回接收~冲区的可用字节数量Q不可能知道q端q要发送多字节。用输入流的时候,最好先它包装Z?BufferedInputStreamQ因取接收缓冲区导?JVM 和底层系l之间的切换Q应当尽量减切换次C提高性能?code>BufferedInputStream 的缓冲区大小最好设为套接字接收~冲区的大小?/p>

如果直接调用输入的 close() Ҏ来关闭它Q则导致套接字被关闭。对此,Socket cL供了一?shutdownInput() Ҏ来禁用输入流。调用该Ҏ后,每次L作都返?EOFQ无法再dq端发送的数据。对q个 EOF 的检,不同的输入流包装体现Z同的l果Q可能读?-1 个字节,可能d的字W串?nullQ还可能收到一?EOFException {等。禁用输入流后,q端输出的行ؓ是^台相关的Q?/p>

  • ?BSD q_上,q端的发送的数据能正常接Ӟ然后直接丢弃。远端无法知道本端的输入已用。这?JDK 文档描述的行Z致?/li>
  • ?WINSOCK q_上,q端发送数据将会导致“连接被重置”的错误?/li>
  • ?Linux q_上,q端发送的数据能l接Ӟ直到套接字输入缓冲区填满Q之后远端再也无法发送数据(若用阻塞模式则q入死锁Q?/li>

用输入这U技术ƈ不常用?/p>

输出?/h1>

套接字的输出操作实际上仅仅将数据写到发送缓冲区内,当发送缓冲区填满且上ơ的发送成功后Q由底层pȝ负责发送。如果发送缓冲区的剩余空间不够,当前U程׃d。和输入类|最好将输出包装ؓ BufferedOutputStream?/p>

如果套接字的双发都?ObjectInputStream ?ObjectOutputStream 来读?Java 对象Q则必须先创?ObjectOutputStreamQ因?ObjectInputStream 在构造的时候会试图d对象头部Q如果双发都先创?ObjectInputStreamQ则会互相等待对方的输出Q造成死锁Q?/p>

// 创徏的顺序不能颠倒!
ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
    

cM于输入流Q关闭输出流也导致关闭套接字Q所?Socket cdh供了一?shutdownOutput() 来禁用输出流。禁用输出流后,已写入发送缓冲区的数据会正常发送,之后的Q何写操作都会D IOExceptionQ且q端的输入流始终会读?EOF。禁用输出流非常有用Q例如套接字的双发都在发送完毕数据后用输入,然后双方都会收到 EOFQ从而知道数据已l全部交换完毕,可以安全关闭套接字。直接关闭套接字会同时关闭输入流和输出流Q且断开q接Q达不到q种效果?/p>

使用的d套接字的优缺?/h2>

如果要用流q行输入和输出,只能用d模式的套接字。这里ȝ一下阻塞套接字的优~点。先看看优点Q?/p>

  1. ~程模型单,非常适合初学者上手?/li>
  2. 以装饰器模式设计?Java I/O 使得开发h员可以轻村֜?I/O 读写Q何类型的数据?/li>

但在性能斚w有致命的~点Q?/p>

  1. ׃服务器套接字接受q接Q以及套接字的读写都会阻塞,性能低下?/li>
  2. 如果不对 I/O 手动进行缓Ԍ则可能造成一ơ只处理一个字节,性能低下?/li>
  3. 服务器套接字每次只能接受一个连接,D JVM 和底层系l之间频J的调用切换Q性能低下?/li>

下一文章开始探讨用基?NIO 的套接字通道和缓冲区实现伸羃性更强的 TCP 套接字?/p>

蜀山兆孨龘 2012-01-19 14:37 发表评论
]]>Java |络~程从菜鸟到叫兽 3Q套接字初始化详?/title><link>http://www.aygfsteel.com/shinzey/archive/2012/01/16/368393.html</link><dc:creator>蜀山兆孨龘</dc:creator><author>蜀山兆孨龘</author><pubDate>Mon, 16 Jan 2012 02:31:00 GMT</pubDate><guid>http://www.aygfsteel.com/shinzey/archive/2012/01/16/368393.html</guid><wfw:comment>http://www.aygfsteel.com/shinzey/comments/368393.html</wfw:comment><comments>http://www.aygfsteel.com/shinzey/archive/2012/01/16/368393.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shinzey/comments/commentRss/368393.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shinzey/services/trackbacks/368393.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="article"> <p><code>ServerSocket</code> cd <code>Socket</code> c都提供了多个公共构造方法。不同的构造方法不仅带的参C同,所h的意义也不一栗下面分别解析这两个cȝ实例初始化过E?/p> <h1><code>ServerSocket</code> 实例的初始化</h1> <p><code>ServerSocket</code> cL供了四个构造器Q?/p> <dl> <dt><code>public ServerSocket(int port) throws IOException</code></dt> <dt><code>public ServerSocket(int port, int backlog) throws IOException</code></dt> <dt><code>public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException</code></dt> <dt><code>public ServerSocket() throws IOException</code></dt> </dl> <p>带参构造器用来创徏已绑定的服务器套接字Q也是说构造成功后它就已经开始侦听指定的端口Q且能够调用 <code>accept()</code> Ҏ来接受客Lq接。默认构造器则会创徏未绑定的服务器套接字Q构造成功后必须手动其l定C个本地地址才能用,在绑定之前可以进行一些选项配置?/p> <h2>带参构造器</h2> <p>ȝ来说Q带参构造器提供了三个参敎ͼ</p> <dl> <dt><code>port</code></dt> <dd>指定该服务器套接字所要侦听的本地端口。如果ؓ 0Q则ql自动分配一个端口号Q这必须以另外的方式让客L获取端口受?/dd> <dt><code>backlog</code></dt> <dd>q个名词目前q没有合适的译名。底层系l的 TCP 实现会维护一个连接队列,该队列缓存了已被 TCP 处理完毕Q但q没有被服务器套接字接受的客Lq接。一旦某个连接被接受Q通过调用 <code>accept()</code> ҎQ,它就会被从队列中U除?code>backlog</code> 参数q于指定队列的最大长度,默认gؓ 50Q但q个值只是一个徏议,底层pȝ可能Ҏ需要自动调整。如果队列满了,则其行ؓ是^台相关的Q微软的 WINSOCK 会拒l新的连接,其他实现则什么都不做。严格地_微Y没有遵守规范Q破坏了游戏规则…?/dd> <dt><code>bindAddr</code></dt> <dd>一台机器可能会有多个本?IP 地址Q例如同时用多块网卡。用其他两个带参构造器Ӟ该参Cؓ <code>null</code>Q服务器套接字会在所有的本地 IP 地址Q?code>0.0.0.0</code> ?<code>::0</code>Q上侦听。如果希望只侦听一个地址Q则可用该参数?/dd> </dl> <h2>默认构造器</h2> <p>如果使用默认构造器Q在l定地址前,q可以做些配|。绑定操作由两个 <code>bind</code> Ҏ定义Q参数类g带参构造器。配|项包括以下斚wQ都必须在绑定前配置Q:</p> <dl> <dt>讄是否重用本地地址</dt> <dd>该选项?<code>setReuseAddress(boolean on)</code> Ҏ配置Q对应底层系l的 <code>SO_REUSEADDR</code> 套接字选项。JDK 没有定义该选项的默认倹{如果该选项?<code>false</code>Q则在关?TCP q接ӞZ保证可靠性,该连接可能在关闭后的一D|_大约两分钟)内保持超时状态(通常UCؓ <code>TIME_WAIT</code> 状态或 <code>2MSL</code> {待状态)Q这D|间里无法新建的服务器套接字l定到同一个地址。在开发阶D,服务器可能不断重启,打开攚w项会非常有用?/dd> <dt>讄接收~冲区大?/dt> <dd>该选项?<code>setReceiveBufferSize(int size)</code> Ҏ配置Q对应底层系l的 <code>SO_RCVBUF</code> 套接字选项Q单位是字节。《RFC 1323 - TCP Extensions for High Performance》将~冲区大定义ؓ 64KB。该选项只是一个徏议|底层pȝ可能Ҏ需要自行调整?/dd> <dt>讄时?/dt> <dd>该选项?<code>setSoTimeout(int timeout)</code> Ҏ配置Q对应底层系l的 <code>SO_TIMEOUT</code> 套接字选项Q单位是毫秒。默认gؓ 0。该选项影响 <code>accept</code> Ҏ的阻塞时间长度,如果时引?<code>SocketTimeoutException</code>。如果设?0Q则表示怸时?/dd> <dt>讄性能首选项</dt> <dd>性能首选项包括q接旉、gq和带宽三个选项Q由 <code>setPerformancePreferences(int connectionTime, int latency, int bandwidth) </code> Ҏ配置。这三个数值分别表C短q接旉、低延迟和高带宽的相寚w要性,数D大则重要;其各自的l对值没有意义。该Ҏ的初hZ?Java 能在用非 TCP/IP 实现的套接字环境下工作得更好Q某些需要对|络q行调优的程序也可以这三个首选项作ؓ配置参数提供l用戗?/dd> </dl> <h1><code>Socket</code> 实例的初始化</h1> <p><code>Socket</code> cL供了六个公共构造器Q已q时的除外)Q?/p> <dl> <dt><code>public Socket(String host, int port) throws UnknownHostException, IOException</code></dt> <dt><code>public Socket(InetAddress address, int port) throws IOException</code></dt> <dt><code>public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException</code></dt> <dt><code>public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException</code></dt> <dt><code>public Socket()</code></dt> <dt><code>public Socket(Proxy proxy)</code></dt> </dl> <p>前四个构造器创徏已连接的客户端套接字Q也是说构造的时候就会去q接服务器。前两个构造器需要提供服务器的地址和端口作为参敎ͼ本地地址和端口由pȝ自动分配Q后两个允许手动指定本地地址和端口,但极用。后两个构造器创徏未连接的套接字,创徏后需要调?<code>connect</code> Ҏ手动q接Q连接之前可以做一些配|。最后一个构造器接受一个代表代理服务其?<code>Proxy</code> 对象QJDK 支持 HTTP ?SOCKSQV4 ?V5Q两U代理类型?/p> <h2>q接前的配置</h2> <p>在连接前Q客L套接字不仅像服务器套接字那样可以讄是否重用本地地址、缓冲区大小、超时值和性能首选项Q还能够配置以下各项Q都必须在连接前配置Q:</p> <dl> <dt>讄是否保持z跃</dt> <dd>该选项?<code>setKeepAlive(boolean on)</code> Ҏ配置Q对应底层系l的 <code>SO_KEEPALIVE</code> 套接字选项。默认gؓ <code>false</code>。如果打开该选项Q则套接字会定期自动发送保持活跃的探测性消息,cM于心x。根据《RFC 1122 - Requirements for Internet Hosts》的规定Q保持活跃机制只?TCP 的一个可选功能,如果支持的话Q默认必Mؓ <code>false</code>Q而且q种机制默认在成功徏立连接后Q且q箋两小时没有数据传输的情况下才会被ȀzR从另一斚w来看Q通过套接字的 I/O 操作完全可以知道q接是否q有效,所以该选项的实用hg大?/dd> <dt>讄是否收发带外数据</dt> <dl>该选项?<code>setOOBInline(boolean on)</code> Ҏ配置Q对应底层系l的 <code>SO_OOBINLINE</code> 套接字选项。默认gؓ <code>off</code>。带外数据(Out-of-band DataQ也叫做紧急数据,表示数据很重要,需要用不同于发送普通数据的一个专用通道来发送。打开该选项后,可以调?<code>sendUrgentData(int data)</code> Ҏ发送一个字节的紧急数据。JDK 对带外数据只提供了有限支持,紧急数据将会和普通数据一赯收到Qƈ且无法自动区分。该选项对应用开发h员意义不大?/dl> <dt>讄是否从容关闭q接</dt> <dd>该选项?<code>setSoLinger(boolean on, int linger)</code> Ҏ配置Q对应底层系l的 <code>SO_LINGER</code> 套接字选项。默认ؓ <code>false</code>。该选项只会影响套接字的关闭Q其中的 <code>linger</code> 参数表示时旉Q单位ؓU。如果打开攚w项Q如果将 <code>linger</code> 设ؓ 0Q则关闭套接字的时候,未发送的数据会被丢弃Q且另一端会出现q接被同位体重置的异常;如果 <code>linger</code> ?0Q则关闭套接字的U程被dQ直到数据全部发送或时Q超时后的行Z底层pȝ相关QJDK 无法控制。如果关闭该选项Q则套接字正常关闭,数据也会全部发送。由于底层实现的差异性,不提倡应用开发h员打开该选项?/dd> <dt>讄是否延迟发送数?/dt> <dd>该选项?<code>setTcpNoDelay(boolean on)</code> Ҏ配置Q对应底层系l的 <code>TCP_NODELAY</code> TCP 选项。默认gؓ <code>off</code>。打开该选项禁?Nagle 法QTCP 包会立即发送;关闭该选项则会启用 Nagle 法Q多个较的 TCP 包会被组合成一个大包一起发送,虽然发送gq了Q但有利于避免网l拥塞。默认ؓ <code>false</code>。该选项对实时性很强的E序可能有用Q但一般的E序不需要关心?/dd> <dt>讄量cd</dt> <dd>该选项?<code>setTrafficClass(int tc)</code> Ҏ配置Q对应底层系l的“流量类别”套接字属性。该选项用于向网l(例如路由器)提示从该套接字发送的包需要获取哪些服务类型,Ҏ?TCP 协议栈没有媄响。IPv4 ?IPv6 分别定义了多个不同的|例如 IPv4 ?<code>0x08</code> 定义为最大吞吐量Q?code>0x10</code> 定义为最gq,{等。可以用或运将多个值合qؓ一个选项。该选项用来调整性能Q需要根据实际情况设|。由于只是徏议|可能被网l忽略?/dd> </dl> </div><img src ="http://www.aygfsteel.com/shinzey/aggbug/368393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shinzey/" target="_blank">蜀山兆孨龘</a> 2012-01-16 10:31 <a href="http://www.aygfsteel.com/shinzey/archive/2012/01/16/368393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单例模式的一个疑?/title><link>http://www.aygfsteel.com/shinzey/archive/2012/01/10/368251.html</link><dc:creator>蜀山兆孨龘</dc:creator><author>蜀山兆孨龘</author><pubDate>Tue, 10 Jan 2012 09:39:00 GMT</pubDate><guid>http://www.aygfsteel.com/shinzey/archive/2012/01/10/368251.html</guid><wfw:comment>http://www.aygfsteel.com/shinzey/comments/368251.html</wfw:comment><comments>http://www.aygfsteel.com/shinzey/archive/2012/01/10/368251.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.aygfsteel.com/shinzey/comments/commentRss/368251.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/shinzey/services/trackbacks/368251.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="article"> <p>|上很多关于单例模式写法的文章,不外乎饿汉和懒汉两种形式的讨论。很多h喜欢用懒汉式Q因得它实现了gq加载,可以让系l的性能更好。但事实果真如此吗?我对此存疑?/p> <p>首先我们查一下饿汉和懒汉单例模式最单的写法Q这里不讨论哪种懒汉写法更好Q:</p> <pre class="brush: java"> // 饿汉 public final class HungrySingleton { private static final HungrySingleton INSTANCE = new HungrySingleton(); private HungrySingleton() { System.out.println("Initializing..."); } public static HungrySingleton getInstance() { return INSTANCE; } } // 懒汉 public final class LazySingleton { private static LazySingleton INSTANCE; private LazySingleton() { System.out.println("Initializing..."); } public static synchronized LazySingleton getInstance() { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } return INSTANCE; } } </pre> <p>从理Z来说Q?code>HungrySingleton</code> 的单例在该类W一ơ用的时候创建,?<code>LazySingleton</code> 的单例则在其 <code>getInstance()</code> Ҏ被调用的时候创建。至于网上有人声U“饿汉式不管用不用都会初始化”,U属走\的时候步子迈得太大。谁的加载更q?如果你只是调用它们的 <code>getInstance()</code> Ҏ来得到单例对象,则它们都是gq加载,q样懒汉式没有Q何意义,而且׃ <code>LazySingleton</code> 采取了同步措施,性能更低Q可以说M懒汉式的性能都低于饿汉式Q。当你用一个单例类的时候,NW一步不是调?<code>getInstance()</code> 么?所以在自己的代码里Q我更喜Ƣ用饿汉式?/p> <p>下面用一个例子来试加蝲序Q?/p> <pre class="brush: java"> // 饿汉 System.out.println("Before"); HungrySingleton.getInstance(); System.out.println("After"); // 懒汉 System.out.println("Before"); LazySingleton.getInstance(); System.out.println("After"); </pre> <p>输出l果都是Q?/p> <pre class="output">Before Initializing... After</pre> <p>那么Q懒汉模式还有什么存在意义?如果pȝ使用了某些需要在启动时对c进行扫描的框架Q用饿汉式的话Q启动时间比懒汉式更长,如果使用了大量单例类Q不利于开发阶Dc在pȝ的正式运行阶D,所有的单例c迟早都要加载的Qȝ说来两者性能持^Q但是懒汉式每次都至多一个判断,所以越到后期越体现饿汉的优性?/p> <p>最后,推荐下《Effective Java》第二版指出的用枚Dcd实现的饿汉单例模式:</p> <pre class="brush: java"> // 饿汉 public enum HungrySingleton { INSTANCE; private HungrySingleton() { } } </pre> <p>q种写法不但最z,q能L扩展为实例数量固定的“多例模式”?/p> </div><img src ="http://www.aygfsteel.com/shinzey/aggbug/368251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/shinzey/" target="_blank">蜀山兆孨龘</a> 2012-01-10 17:39 <a href="http://www.aygfsteel.com/shinzey/archive/2012/01/10/368251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">崨</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">뽭</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ٲ</a>| <a href="http://" target="_blank">»Ȱ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">峣</a>| <a href="http://" target="_blank">̨ǰ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">˫</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֶ</a>| <a href="http://" target="_blank">ɯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Թ</a>| <a href="http://" target="_blank">Ͻ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϋ</a>| <a href="http://" target="_blank">˰</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>