﻿<?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>BlogJava-流浪天涯-文章分类-杂谈</title><link>http://www.blogjava.net/hobby8062/category/16774.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:58:35 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:58:35 GMT</pubDate><ttl>60</ttl><item><title>多线程设计要点</title><link>http://www.blogjava.net/hobby8062/articles/78453.html</link><dc:creator>刘浪</dc:creator><author>刘浪</author><pubDate>Wed, 01 Nov 2006 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/hobby8062/articles/78453.html</guid><wfw:comment>http://www.blogjava.net/hobby8062/comments/78453.html</wfw:comment><comments>http://www.blogjava.net/hobby8062/articles/78453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hobby8062/comments/commentRss/78453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hobby8062/services/trackbacks/78453.html</trackback:ping><description><![CDATA[
		<p>
				<font size="+0">
						<strong>1</strong>
				</font>
				<strong>.</strong>多线程中有主内存和工作内存之分， 在JVM中，有一个主内存，专门负责所有线程共享数据；而每个线程都有他自己私有的工作内存， 主内存和工作内存分贝在JVM的stack区和heap区。</p>
		<p>
				<strong>
						<font size="+0">2.</font>
				</strong>线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态，<br />'Ready' 表示线程正在等待CPU分配允许运行的时间。</p>
		<p>
				<font size="+0">
						<strong>3.</strong>
				</font>线程运行次序并不是按照我们创建他们时的顺序来运行的，CPU处理线程的顺序是不确定的，如果需要确定，那么必须手工介入，使用setPriority()方法设置优先级。</p>
		<p>
				<strong>
						<font size="+0">4.</font>
				</strong>我们无从知道一个线程什么时候运行，两个或多个线程在访问同一个资源时，需要synchronized</p>
		<p>
				<strong>
						<font size="+0">5.</font>
				</strong> 每个线程会注册自己，实际某处存在着对它的引用，因此，垃圾回收机制对它就"束手无策"了。</p>
		<p>
				<strong>
						<font size="+0">6.</font>
				</strong> Daemon线程区别一般线程之处是：主程序一旦结束，Daemon线程就会结束。</p>
		<p>
				<strong>
						<font size="+0">7.</font>
				</strong> 一个对象中的所有synchronized方法都共享一把锁，这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。</p>
		<p>
				<strong>
						<font size="+0">8.</font>
				</strong> 对于访问某个关键共享资源的所有方法，都必须把它们设为synchronized，否则就不能正常工作。</p>
		<p>
				<font size="+0">
						<strong>9.</strong>
				</font> 假设已知一个方法不会造成冲突，最明智的方法是不要使用synchronized，能提高些性能。</p>
		<p>
				<strong>
						<font size="+0">10</font>
				</strong>. 如果一个"同步"方法修改了一个变量，而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。</p>
		<p>
				<strong>
						<font size="+0">11.</font>
				</strong> synchronized不能继承，　父类的方法是synchronized，那么其子类重载方法中就不会继承"同步"。</p>
		<p>
				<strong>
						<font size="+0">12.</font>
				</strong> 线程堵塞Blocked有几个原因造成：</p>
		<p>(1)线程在等候一些IO操作 <br />(2)线程试图调用另外一个对象的"同步"方法，但那个对象处于锁定状态，暂时无法使用。</p>
		<p>
				<strong>
						<font size="+0">13.</font>
				</strong>原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的， 但是大部分情况下，我们并不能正确使用，来看看 i = i + 1 , i是int型，属于原始型变量：<br /><br />(1)从主内存中读取i值到本地内存. <br />(2)将值从本地内存装载到线程工作拷贝中. <br />(3)装载变量1. <br />(4)将i 加 1. <br />(5)将结果给变量i. <br />(6)将i保存到线程本地工作拷贝中. <br />(7)写回主内存. </p>
		<p>注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。</p>
		<p>double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。</p>
		<p>
				<font size="+0">
						<strong>14.</strong>
				</font> 由于13条的原因，我们解决办法是：</p>
		<p>class xxx extends Thread{</p>
		<p>//i会被经常修改<br />private int i;<br /><br />public synchronized int read(){ return i;}</p>
		<p>public synchronized void update(){ i = i + 1;}</p>
		<p>..........</p>
		<p>}</p>
		<p>
				<strong>
						<font size="+0">15.</font>
				</strong> Volatile变量， volatile变量表示保证它必须是与主内存保持一致，它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的，如用在long 或 double变量前。<br /></p>
		<p>
				<strong>
						<font size="+0">16.</font>
				</strong> 使用yield()会自动放弃CPU，有时比sleep更能提升性能。</p>
		<p>
				<strong>
						<font size="+0">17.</font>
				</strong> sleep()和wait()的区别是：wait()方法被调用时会解除锁定，但是我们能使用它的地方只是在一个同步的方法或代码块内。</p>
		<p>
				<strong>
						<font size="+0">18.</font>
				</strong> 通过制造缩小同步范围，尽可能的实现代码块同步，wait(毫秒数)可在指定的毫秒数可退出wait；对于wait()需要被notisfy()或notifyAll()踢醒。</p>
		<p>
				<strong>
						<font size="+0">19.</font>
				</strong> 构造两个线程之间实时通信的方法分几步：<br />(1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;<br />PipedReader in = new PipedReader(new PipedWriter())<br />(2). 在需要发送信息的线程开始之前，将外部的PipedWriter导向给其内部的Writer实例out<br />(3). 在需要接受信息的线程开始之前，将外部的PipedReader导向给其内部的Reader实例in<br />(4). 这样放入out的所有东西度可从in中提取出来。</p>
		<p>
				<strong>
						<font size="+0">20.</font>
				</strong> synchronized带来的问题除性能有所下降外，最大的缺点是会带来死锁DeadLock，只有通过谨慎设计来防止死锁，其他毫无办法，这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法</p>
		<p>
				<strong>
						<font size="+0">21.</font>
				</strong> 在大量线程被堵塞时，最高优先级的线程先运行。但是不表示低级别线程不会运行，运行概率小而已。</p>
		<p>
				<strong>
						<font size="+0">22.</font>
				</strong> 线程组的主要优点是：使用单个命令可完成对整个线程组的操作。很少需要用到线程组。</p>
		<p>
				<strong>
						<font size="+0">23.</font>
				</strong> 从以下几个方面提升多线程的性能：</p>
		<p>检查所有可能Block的地方，尽可能的多的使用sleep或yield()以及wait();</p>
		<p>尽可能延长sleep(毫秒数)的时间;</p>
		<p>运行的线程不用超过100个，不能太多；</p>
		<p>不同平台linux或windows以及不同JVM运行性能差别很大。</p>
<img src ="http://www.blogjava.net/hobby8062/aggbug/78453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hobby8062/" target="_blank">刘浪</a> 2006-11-01 13:08 <a href="http://www.blogjava.net/hobby8062/articles/78453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>身为男人应该做的10件事</title><link>http://www.blogjava.net/hobby8062/articles/78446.html</link><dc:creator>刘浪</dc:creator><author>刘浪</author><pubDate>Wed, 01 Nov 2006 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/hobby8062/articles/78446.html</guid><wfw:comment>http://www.blogjava.net/hobby8062/comments/78446.html</wfw:comment><comments>http://www.blogjava.net/hobby8062/articles/78446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hobby8062/comments/commentRss/78446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hobby8062/services/trackbacks/78446.html</trackback:ping><description><![CDATA[
		<p style="TEXT-INDENT: 2em">1.至少挑战一次自己的极限，并且坚持到成功。不管是考试得第一名，或者游泳游过不曾穿越的河流，或者在讲台上当众演讲，你至少要成为一次主角，至少要让成功证明你一次，这样，在漫长而平淡的一生之中，你都始终相信自己是最棒的，自己有权在这个世界好好生活。《阿甘正传》里只知道往前跑的阿甘和《洛奇》里被打倒但绝不服输的洛奇，还能让我们热泪盈眶。</p>
		<p style="TEXT-INDENT: 2em">2.至少要有几个哥们，找到年少轻狂时共同成长的友谊。不管是纵酒狂歌，还是浪迹天涯；不管是春风得意，还是屡败屡战；在一起时，经常握握朋友的手，从中汲取力量；分手之后，有一天记得寻找久已失去联系的旧日朋友。男人的友谊是你面对战场时坚实的依靠。《美国往事》的残酷青春和《英雄本色》的快意恩仇，还能让我们热血沸腾。</p>
		<p style="TEXT-INDENT: 2em">3.至少投入地爱一次。使人燃烧的爱情也许不能持久，但足够点亮男孩子一生的前程。曾经真爱，男人的肩膀才开始变得伟岸，因为只有为了自己的最爱，男人最优秀的品质才得以开发，才成为一个可以托付的大写的人。有人说爱情使人脆弱，但是真正的爱情使人坚强。《罗马假日》里的纯情公主和《情书》里的痴心少年，还能让我们追忆爱情。</p>
		<p style="TEXT-INDENT: 2em">4.至少体验一次挫折，学习承受失败，并且学会反抗。男人的成人礼与他的三十岁生日无关———麦康伯在非洲猎狮子的时候忽然明白这个道理，这时候他被他一直害怕失去的妻子射杀，海明威没有告诉我们是不是误杀———但重要的是，男人不怕失去任何东西，丈夫轻身重一诺，从容游走于困境之中，将它变成辉煌的铺垫。《骇客帝国》里Neo成为TheOne和《狮子王》里辛巴夺回王位，还能让我们天翻地覆中站立起来。</p>
		<p style="TEXT-INDENT: 2em">5.至少定一个计划，并且不折不扣地完成它。如有可能，体验一次军旅生活，在限制中强化律己与责任意识；男人的计划力和执行力决定了这个男人成功的概率，勇于并且善于实现自己的目标，男人的理想就具体为现实的成功，而成功，今天似乎成了男人的硕大特征。《肖申克救赎》里关不住的鸟儿和《辛德勒的名单》里集中营的救星，让我们看到了坚持不懈执行计划的巨大功德。</p>
		<p style="TEXT-INDENT: 2em">6.至少每天衷心夸一次家人，感谢他们与你共同经营一个美满家庭。有机会的话倾听婴儿的第一声啼哭，让孩子带你成长在新时代，让你感受成熟也感受童心。常回家看看父母，陪父母聊聊天，至少像宠孩子一样关心父母。拜访你的恩师，大声说出你的爱，只有爱和感谢可以让你的幸福常在常新。《教父》里的黑手党家族和《一条流过记忆的河》里的钓鱼家庭，都有一种亲情的温暖在其中弥漫。</p>
		<p style="TEXT-INDENT: 2em">7.至少培养一种个人爱好，体验工作和家庭之外的另一种生活方式。寻找适合自己的娱乐及健身方式；珍藏一件特殊的物品；参加一次狂欢活动，感受激情与狂野；在野外远足，小住数日，倾听大自然的声音；买几张彩票，碰碰运气。所有爱好告诉你，生活并不只是按部就班，还有好多梦想来不及实现，稍微收敛一下狂妄之心，去体验丰富多彩生活的各个方面。《美丽人生》里的快乐游戏和《外星人》里的童心童趣，让我们意识到梦和游戏对于生活的重要性。</p>
		<p style="TEXT-INDENT: 2em">8.至少向自己所伤害过的人道一次歉，尽管你的选择迫不得已。至少宽恕一次，那个曾有负于你的人也有不得已之处；重新认识你的对手，从他们身上找到值得你与之竞争的优良素质；接受并珍惜生活赐予你的一切，如有可能，弥补一下生活的缺陷。《活着》的忍受与《耶稣蒙难记》的宽恕，告诉我们生存艰难。</p>
		<p style="TEXT-INDENT: 2em">9.至少每年放纵自己旅行游玩一次。天地很大，你做得再成功也有可能呆在井底———到海阔天空，名山大川去扩充自己的胸襟：飘飘何所似，天地一沙鸥。到文化古迹去追寻历史的脚步：吟诗作对，风流自赏一把；凭吊古战场，感受苍凉和悲壮；纵身大化，然后悲天悯人。《闻香识女人》里盲眼探戈和《泰坦尼克号》里的赌来的船票，让男孩走上了男人之路。</p>
		<p style="TEXT-INDENT: 2em">10.至少写一点小东西，记录成长过程中的酸甜苦辣。写一个小自传，看看自己能写下的东西有多少；想象生命的最后一刻，假如明天来临，能否感悟生死；写下遗嘱，看看一生的安排是否已经妥当，是否还有未了的心愿，抓紧现在赶紧去做，因为身为男人，你今生一定有机会有能力去做自己想做的事！《阳光灿烂的日子》里的动物凶猛和《公民凯恩》里的玫瑰花蕾，让男人把自己想说的话说出来，而且还要去做自己想做的事。 </p>
<img src ="http://www.blogjava.net/hobby8062/aggbug/78446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hobby8062/" target="_blank">刘浪</a> 2006-11-01 11:49 <a href="http://www.blogjava.net/hobby8062/articles/78446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个美国老工程师的心理话: 给年轻工程师的十大忠告</title><link>http://www.blogjava.net/hobby8062/articles/78442.html</link><dc:creator>刘浪</dc:creator><author>刘浪</author><pubDate>Wed, 01 Nov 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/hobby8062/articles/78442.html</guid><wfw:comment>http://www.blogjava.net/hobby8062/comments/78442.html</wfw:comment><comments>http://www.blogjava.net/hobby8062/articles/78442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hobby8062/comments/commentRss/78442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hobby8062/services/trackbacks/78442.html</trackback:ping><description><![CDATA[1、好好规划自己的路，不要跟着感觉走！根据个人的理想决策安排，绝大部分人并不指望成为什么院士或教授，而是希望活得滋润一些，爽一些。那么，就需要慎重安排自己的轨迹。从哪个行业入手，逐渐对该行业深入了解，不要频繁跳槽，特别是不要为了一点工资而转移阵地，从长远看，这点钱根本不算什么，当你对一个行业有那么几年的体会，以后钱根本不是问题。频繁地动荡不是上策，最后你对哪个行业都没有摸透，永远是新手！<br /><br />2、可以做技术，切不可沉湎于技术。千万不可一门心思钻研技术！给自己很大压力，如果你的心思全部放在这上面，那么注定你将成为孔乙己一类的人物！适可而止为之，因为技术只不过是你今后前途的支柱之一，而且还不是最大的支柱，除非你只愿意到老还是个工程师！<br /><br />3、不要去做技术高手，只去做综合素质高手！在企业里混，我们时常瞧不起某人，说他“什么都不懂，凭啥拿那么多钱，凭啥升官！”这是普遍的典型的工程师的迂腐之言。8051很牛吗？人家能上去必然有他的本事，而且是你没有的本事。你想想，老板搞经营那么多年，难道见识不如你这个新兵？人家或许善于管理，善于领会老板意图，善于部门协调等等。因此务必培养自己多方面的能力，包括管理，亲和力，察言观色能力，攻关能力等，要成为综合素质的高手，则前途无量，否则只能躲在角落看示波器！技术以外的技能才是更重要的本事！！从古到今，美国*本，一律如此！<br /><br />4、多交社会三教九流的朋友！不要只和工程师交往，认为有共同语言，其实更重要的是和其他类人物交往，如果你希望有朝一*当老板或高层管理，那么你整*面对的就是这些人。了解他们的经历，思维习惯，爱好，学习他们处理问题的模式，了解社会各个角落的现象和问题，这是以后发展的巨大的本钱，没有这些以后就会笨手笨脚，跌跌撞撞，遇到重重困难，交不少学费，成功的概率大大降低！<br /><br />5、知识涉猎不一定专，但一定要广！多看看其他方面的书，金融，财会，进出口，税务，法律等等，为以后做一些积累，以后的用处会更大！会少交许多学费！！<br /><br />6、抓住时机向技术管理或市场销售方面的转变！要想有前途就不能一直搞开发，适当时候要转变为管理或销售，前途会更大，以前搞技术也没有白搞，以后还用得着。搞管理可以培养自己的领导能力，搞销售可以培养自己的市场概念和思维，同时为自己以后发展积累庞大的人脉！应该说这才是前途的真正支柱！！！<br /><br />7、逐渐克服自己的心里弱点和性格缺陷！多疑，敏感，天真（贬义，并不可爱），犹豫不决，胆怯，多虑，脸皮太薄，心不够黑，教条式思维。。。这些工程师普遍存在的性格弱点必须改变！很难吗？只在床上想一想当然不可能，去帮朋友守一个月地摊，包准有效果，去实践，而不要只想！不克服这些缺点，一切不可能，甚至连项目经理都当不好--尽管你可能技术不错！<br /><br />8、工作的同时要为以后做准备！建立自己的工作环境！及早为自己配置一个工作环境，装备电脑，示波器（可以买个二手的），仿真器，编程器等，业余可以接点活，一方面接触市场，培养市场感觉，同时也积累资金，更重要的是准备自己的产品，咱搞技术的没有钱，只有技术，技术的代表不是学历和证书，而是产品，拿出象样的产品，就可技术转让或与人合作搞企业！先把东西准备好，等待机会，否则，有了机会也抓不住！<br /><br />9、要学会善于推销自己！不仅要能干，还要能说，能写，善于利用一切机会推销自己，树立自己的品牌形象，很必要！要创造条件让别人了解自己，不然老板怎么知道你能干？外面的投资人怎么相信你？提早把自己推销出去，机会自然会来找你！搞个个人主页是个好注意！！特别是培养自己在行业的名气，有了名气，高薪机会自不在话下，更重要的是有合作的机会。<br /><br />10该出手时便出手！永远不可能有100%把握！！！条件差不多就要大胆去干，去闯出自己的事业，不要犹豫，不要彷徨，干了不一定成功，但至少为下一次冲击积累了经验，不干永远没出息，而且要干成必然要经历失败。不经历风雨，怎么见彩虹，没有人能随随便便成功！<img src ="http://www.blogjava.net/hobby8062/aggbug/78442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hobby8062/" target="_blank">刘浪</a> 2006-11-01 11:45 <a href="http://www.blogjava.net/hobby8062/articles/78442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>