﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-信心比金钱更重要！-随笔分类-Java</title><link>http://www.cppblog.com/luofeng225/category/19276.html</link><description>目标明确==&gt;&gt;&gt;计划跟踪==&gt;&gt;&gt;行动执行！</description><language>zh-cn</language><lastBuildDate>Wed, 09 May 2012 22:34:56 GMT</lastBuildDate><pubDate>Wed, 09 May 2012 22:34:56 GMT</pubDate><ttl>60</ttl><item><title>并发基础 www</title><link>http://www.cppblog.com/luofeng225/archive/2012/05/07/173897.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Mon, 07 May 2012 06:14:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/05/07/173897.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/173897.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/05/07/173897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/173897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/173897.html</trackback:ping><description><![CDATA[<br />《并发编程实践》<br />-----------------------<br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">并发基础</strong><span class="Apple-converted-space">&nbsp;</span><br /><br />编写线程安全的代码, 本质上就是管理对状态的访问,而且通常都是共享的, 可变的状态.<span class="Apple-converted-space">&nbsp;<br /><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">竞争条件</strong><span class="Apple-converted-space">&nbsp;</span><br />最常见的一种竞争条件是"检查再运行(check-then-act)", 使用一个潜在的过期值作为下一步操作的依据.<span class="Apple-converted-space">&nbsp;</span><br /><br />检查再运行: 你观察到一些事情为真, 然后基于你的观察去执行一些动作, 但事实上, 从观察到执行操作的这段时间内, 观察结果可能已经无效了, 从而引发错误.<span class="Apple-converted-space">&nbsp;<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">原子操作</strong><span class="Apple-converted-space">&nbsp;</span><br />假设有操作a和b, 如果从执行a的线程的角度看, 当其他线程执行b时, 要么b全部执行完成, 要么一点也没有执行, 那么a和b就互为原子操作.<span class="Apple-converted-space">&nbsp;</span><br /><br />为了保证线程安全, "检查再运行"操作和"读-改-写"操作必须是原子操作.<span class="Apple-converted-space">&nbsp;</span></span></span><br /><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">锁的可重入特点</strong><span class="Apple-converted-space">&nbsp;</span><br />线程在试图获得它自己占有的锁时, 请求线程将会成功, 重进入意味着所有的请求都是基于"每线程", 而不是基于"每调用".<span class="Apple-converted-space">&nbsp;<br /></span></span></span><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">共享对象</strong><span class="Apple-converted-space">&nbsp;</span><br />同步同样还有一个重要而微妙的方面: 内存可见性. 我们不仅希望能够避免一个线程修改其他线程正在使用的对象的状态, 而且希望确保当一个线程修改了对象的状态之后, 他线程能够真正看到改变.<span class="Apple-converted-space">&nbsp;</span></span></span><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left">锁不仅是关于同步与互斥的, 也是关于内存可见的, 为了保证所有线程都能看到共享的, 可变变量的最新值, 读取和写入线程必须使用公共的锁进行同步.<span class="Apple-converted-space">&nbsp;</span><br /></span></span><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">逸出</strong><span class="Apple-converted-space">&nbsp;</span><br />如果一个对象还没有完成构造就发布了, 这种情况就是逸出.</span></span><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; orphans: 2; widows: 2; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 25px; font-family: Helvetica, Tahoma, Arial, sans-serif; text-align: left"><strong style="font-weight: bold">死锁</strong><span class="Apple-converted-space">&nbsp;</span><br />当每个人都拥有他人需要的资源, 并且等待其他人正在占有的资源, 如果大家一直占有资源, 直到获得自己需要却没被占用的资源, 那么就会产生死锁.<span class="Apple-converted-space">&nbsp;</span><br />当一个线程永远占有一个锁, 而其他线程尝试去获得这个锁, 那么它们将永远被阻塞. 当线程占有锁L时, 想要获得锁M, 但是同时, 线程B持有M, 并尝试获得L, 两个线程将永远等待下去, 这种情况是死锁的最简单的形式.<span class="Apple-converted-space">&nbsp;</span></span></span><br /><br /><br /><br /></span></span></span></span></span></span><img src ="http://www.cppblog.com/luofeng225/aggbug/173897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-05-07 14:14 <a href="http://www.cppblog.com/luofeng225/archive/2012/05/07/173897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>并发编程实践</title><link>http://www.cppblog.com/luofeng225/archive/2012/05/07/173889.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Mon, 07 May 2012 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/05/07/173889.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/173889.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/05/07/173889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/173889.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/173889.html</trackback:ping><description><![CDATA[<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">1, 保证线程安全的三种方法 :<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />a, 不要跨线程访问共享变量<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />b, 使共享变量是 final类型的<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />c, 将共享变量的操作加上同步<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">2, 一开始就将类设计成线程安全的 , 比在后期重新修复它 ,更容易 .</span></span><br /><br />编写多线程程序, 首先保证它是正确的, 其次再考虑性能.<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">7, 对于 volatile 声明的数值类型变量进行运算 , 往往是不安全的 (volatile 只能保证可见性 , 不能保证原子性 ).<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />详见 volatile 原理与技巧中 , 脏数据问题讨论 .<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">8, 当一个线程请求获得它自己占有的锁时 ( 同一把锁的嵌套使用 ), 我们称该锁为可重入锁 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />在 jdk1.5 并发包中 , 提供了可重入锁的 java 实现 -ReentrantLock.<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">10,虽然缩小同步块的范围 , 可以提升系统性能 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />但在保证原子性的情况下 , 不可将原子操作分解成多个 synchronized块<span class="Apple-converted-space">&nbsp;<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"><br /><strong>15, 发布 (publish) 对象 , 指的是使它能够被当前范围之外的代码所使用 .( 引用传递 )<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />对象逸出 (escape), 指的是一个对象在尚未准备好时将它发布 .<br /></strong>&nbsp;原则: 为防止逸出, 对象必须要被完全构造完后, 才可以被发布(最好的解决方式是采用同步) 
<p>&nbsp;&nbsp;&nbsp; this关键字引用对象逸出</p>
<p>&nbsp;&nbsp;&nbsp; 例子: 在构造函数中, 开启线程, 并将自身对象this传入线程, 造成引用传递.而此时, 构造函数尚未执行完, 就会发生对象逸出了.<br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">16, 必要时 , 使用 ThreadLocal变量确保线程封闭性 (封闭线程往往是比较安全的 , 但一定程度上会造成性能损耗 )<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />封闭对象的例子在实际使用过程中 , 比较常见 , 例如 hibernate openSessionInView机制 , jdbc的 connection机制<span class="Apple-converted-space">&nbsp;<br /></span></span></span><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">18, 保证共享变量的发布是安全的<span class="Apple-converted-space">&nbsp;</span></strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />a, 通过静态初始化器初始化对象 (jls 12.4.2 叙述 , jvm 会保证静态初始化变量是同步的 )<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />b, 将对象申明为 volatile 或使用 AtomicReference<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />c, 保证对象是不可变的<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />d, 将引用或可变操作都由锁来保护</span></span><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">9, 设计线程安全的类 , 应该包括的基本要素 :<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />a, 确定哪些是可变共享变量<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />b, 确定哪些是不可变的变量<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />c, 指定一个管理并发访问对象状态的策略</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">20, 将数据封装在对象内部 , 并保证对数据的访问是原子的 .</strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />建议采用 volatile javabean 模型或者构造同步的 getter,setter.</p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif">22, 编写并发程序 , 需要更全的注释 , 更完整的文档说明 .<br /><br /><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">3, 在需要细分锁的分配时 , 使用 java监视器模式好于使用自身对象的监视器锁 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />前者的灵活性更好 .</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">Object target = new Object();<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />// 这里使用外部对象来作为监视器 , 而非 this<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />synchronized(target) {<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />// TODO<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />}</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">针对 java monitor pattern, 实际上 ReentrantLock的实现更易于并发编程 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />功能上 , 也更强大 .</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">24,<span class="Apple-converted-space">&nbsp;</span><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">设计并发程序时 , 在保证伸缩性与性能折中的前提下 , 优先考虑将共享变量委托给线程安全的类 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />由它来控制全局的并发访问 .</strong></p>
<p><br /><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px"><strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">26, 在并发编程中 , 需要容器支持的时候 , 优先考虑使用 jdk 并发容器<span class="Apple-converted-space">&nbsp;</span></strong><br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />(ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList&#8230;).</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">27, ConcurrentHashMap, CopyOnWriteArrayList<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />并发容器的迭代器 , 以及全范围的 size(), isEmpty() 都表现出弱一致性 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />他们只能标示容器当时的一个数据状态 . 无法完整响应容器之后的变化和修改<span class="Apple-converted-space">&nbsp;</span></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; color: rgb(51,51,51); line-height: 20px; font-family: 'Microsoft YaHei', Verdana, Tahoma, Arial, Helvetica, sans-serif"></p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">29, 当一个方法 , 能抛出 InterruptedException, 则意味着 , 这个方法是一个可阻塞的方法 , 如果它被中断 , 将提前结束阻塞状态 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />当你调用一个阻塞方法 , 也就意味着 , 本身也称为了一个阻塞方法 , 因为你必须等待阻塞方法返回 .</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 10px; padding-top: 0px">如果阻塞方法抛出了中断异常 , 我们需要做的是 , 将其往上层抛 , 除非当前已经是需要捕获异常的层次 .<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />如果当前方法 , 不能抛出 InterruptedException, 可以使用 Thread.currentThread.interrupt() 方法 , 手动进行中断<br /></p>
<p><a href="http://java.chinaitlab.com/advance/824034.html"><br />======================<br />http://java.chinaitlab.com/advance/824034.html</a><br /><a href="http://kenwublog.com/category/concurrency">http://kenwublog.com/category/concurrency</a></span></span></span></span></span></span></span></span></span></span></p></span></span></span></span></span></strong></span></span></span></span></span></span> <img src ="http://www.cppblog.com/luofeng225/aggbug/173889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-05-07 11:58 <a href="http://www.cppblog.com/luofeng225/archive/2012/05/07/173889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式</title><link>http://www.cppblog.com/luofeng225/archive/2012/03/22/168583.html</link><dc:creator>luofeng</dc:creator><author>luofeng</author><pubDate>Thu, 22 Mar 2012 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/luofeng225/archive/2012/03/22/168583.html</guid><wfw:comment>http://www.cppblog.com/luofeng225/comments/168583.html</wfw:comment><comments>http://www.cppblog.com/luofeng225/archive/2012/03/22/168583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/luofeng225/comments/commentRss/168583.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/luofeng225/services/trackbacks/168583.html</trackback:ping><description><![CDATA[<div><span style="border-collapse: collapse; font-size: 12px; line-height: 18px; font-family: Simsun; "><div><br /><div><p><span class="Apple-style-span" style="font-weight: normal; "><strong></strong></span></p><div style="display: inline !important; "><div style="display: inline !important; "><strong><strong>java.util.regex.Pattern&nbsp;</strong></strong></div></div>正则表达式的编译表示形式。<strong>&nbsp;</strong><br />指定为字符串的正则表达式必须首先被编译为此类的实例。然后，可将得到的模式用于创建 <a title="java.util.regex 中的类" href=""><code>Matcher</code></a>  对象，依照正则表达式，该对象可以与任意<a title="java.lang 中的接口" href=""><code></code>字符序列<code></code></a>匹配。执行匹配所涉及的所有状态都驻留在匹配器中，所以多个匹配器可以共享同一模式。<br /><div>=此类的实例是不可变的，可供多个并发线程安全使用。</div> &nbsp;<br /><p>&nbsp;</p></div><strong>java.util.regex.Matcher&nbsp;</strong>过解释 <a title="java.util.regex 中的类" href=""><code>Pattern</code></a> 对 <a title="java.lang 中的接口" href=""><code></code>character  sequence<code></code></a> 执行匹配操作的引擎。</div><br />4种常用功能：<br />查询<br />提取<br />分割<br />替换<br /><br /><div><div>======================</div><div><ul><li>&nbsp;正则表达式的构造</li><li>&nbsp;转义字符（区分 java实现层次，文字表述层次）</li><li>&nbsp;模式：懒惰，贪婪，(Greedy ，Reluctant，Possessive)</li><li>&nbsp;分组 group</li></ul>&nbsp;<br />----<br /><div><strong>转义字符（区分 java实现层次，文字表述层次）</strong><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><font class="Apple-style-span" color="#008080"><br /></font></div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;体会Escape(转义符号)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;字符串层次的表示&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;和正则表达式层次的表示&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;的区别！<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;testEscape()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Pattern.compile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a\\\b</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Pattern.compile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a\\b</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;m2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p2.matcher(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a\b</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m2.matches());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;m3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p3.matcher(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">a\b</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(m3.matches());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><strong><br />关于三种数量词</strong><div>Greedy ，Reluctant，Possessive)：</div><div><span style="color: #333333; font-family: arial; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: separate; line-height: normal; "><a id="Editor_Edit_hlEntryLink" title="view: 正则表达式三种数量词  todo" href="http://www.cppblog.com/luofeng225/archive/2012/03/23/168691.html" target="_blank" style="color: #cc0066; background: inherit; background-color: #f5f5f5; ">http://www.cppblog.com/luofeng225/archive/2012/03/23/168691.html<br /><br /><br /><strong>分组与捕获</strong><br /></a><div><a id="Editor_Edit_hlEntryLink" title="view: 正则表达式三种数量词  todo" href="http://www.cppblog.com/luofeng225/archive/2012/03/23/168691.html" target="_blank" style="color: #cc0066; background: inherit; background-color: #f5f5f5; "></a><a href="http://www.cppblog.com/luofeng225/archive/2012/03/23/168697.html">http://www.cppblog.com/luofeng225/archive/2012/03/23/168697.html<br /><br /><br /></a></div></span></div>================<br /><strong>关于效率？</strong></div><div><span class="Apple-style-span" style="white-space: pre; "><br /></span><span class="Apple-style-span" style="white-space: pre; "><br /></span><span class="Apple-style-span" style="white-space: pre; "><br /></span><span class="Apple-style-span" style="white-space: pre; ">=============</span><span class="Apple-style-span" style="white-space: pre; "><br /></span><div style="white-space: pre; ">Jakarta-ORO正则表达式库<br />，它是最全面的正则表达式API之一，而且它与Perl 5正则表达式完全兼容。另外，它也是优化得最好的API之一。</div><span class="Apple-style-span" style="white-space: pre; "><br /></span><span class="Apple-style-span" style="white-space: pre; "><br /></span><span class="Apple-style-span" style="white-space: pre; "><br /></span></div></div></span></div>  <img src ="http://www.cppblog.com/luofeng225/aggbug/168583.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/luofeng225/" target="_blank">luofeng</a> 2012-03-22 11:10 <a href="http://www.cppblog.com/luofeng225/archive/2012/03/22/168583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>