ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲精品一区,亚洲mv在线,日韩精品一区国产http://www.aygfsteel.com/DLevin/category/50406.htmlIn general the OO style is to use a lot of little objects with a lot of little methods that give us a lot of plug points for overriding and variation. To do is to be -Nietzsche, To bei is to do -Kant, Do be do be do -Sinatrazh-cnSat, 05 Sep 2015 04:44:37 GMTSat, 05 Sep 2015 04:44:37 GMT60[转]高性能IO模型‹¹…析http://www.aygfsteel.com/DLevin/archive/2015/09/04/427118.htmlDLevinDLevinFri, 04 Sep 2015 07:16:00 GMThttp://www.aygfsteel.com/DLevin/archive/2015/09/04/427118.htmlhttp://www.aygfsteel.com/DLevin/comments/427118.htmlhttp://www.aygfsteel.com/DLevin/archive/2015/09/04/427118.html#Feedback0http://www.aygfsteel.com/DLevin/comments/commentRss/427118.htmlhttp://www.aygfsteel.com/DLevin/services/trackbacks/427118.html高性能IO模型‹¹…析

转自åQšhttp://www.cnblogs.com/fanzhidongyzby/p/4098546.html

服务器端¾~–程¾lå¸¸éœ€è¦æž„造高性能的IO模型åQŒå¸¸è§çš„IO模型有四¿Uï¼š

åQ?åQ?/span>同步é˜Õd¡žIOåQˆBlocking IOåQ‰ï¼šå³ä¼ ¾lŸçš„IO模型ã€?/span>

åQ?åQ?/span>同步非阻å¡?/span>IOåQˆNon-blocking IOåQ‰ï¼šé»˜è®¤åˆ›å¾çš„socket都是é˜Õd¡žçš„,非阻塞IO要求socket被设¾|®äØ“NONBLOCK。注意这里所说的NIOòq‰™žJavaçš„NIOåQˆNew IOåQ‰åº“ã€?/span>

åQ?åQ?/span>IO多èµ\复用åQˆIO MultiplexingåQ‰ï¼šå³ç»å…¸çš„Reactor设计模式åQŒæœ‰æ—¶ä¹Ÿ¿UîCؓ异步é˜Õd¡žIOåQŒJava中的Selectorå’ŒLinux中的epoll都是˜q™ç§æ¨¡åž‹ã€?/span>

åQ?åQ?/span>异步IOåQˆAsynchronous IOåQ‰ï¼šå³ç»å…¸çš„Proactor设计模式åQŒä¹Ÿ¿UîCؓ异步非阻塞IOã€?/span>

同步和异æ­?/span>的概忉|˜q°çš„æ˜¯ç”¨æˆïLº¿½E‹ä¸Žå†…核的交互方式:同步是指用户¾U¿ç¨‹å‘è“vIOè¯äh±‚后需要等待或者轮询内核IO操作完成后才能ç‘ô¾l­æ‰§è¡Œï¼›è€Œå¼‚步是指用æˆïLº¿½E‹å‘èµ·IOè¯äh±‚后仍¾l§ç®‹æ‰§è¡ŒåQŒå½“内核IO操作完成后会通知用户¾U¿ç¨‹åQŒæˆ–者调用用æˆïLº¿½E‹æ³¨å†Œçš„回调函数ã€?/span>

é˜Õd¡žå’Œéžé˜Õd¡žçš„æ¦‚忉|˜q°çš„æ˜¯ç”¨æˆïLº¿½E‹è°ƒç”¨å†…æ ¸IO操作的方式:é˜Õd¡žæ˜¯æŒ‡IO操作需要彻底完成后才返回到用户½Iºé—´åQ›è€Œéžé˜Õd¡žæ˜¯æŒ‡IO操作被调用后立即˜q”回¾l™ç”¨æˆ·ä¸€ä¸ªçŠ¶æ€å€û|¼Œæ— éœ€½{‰åˆ°IO操作å½Õdº•完成ã€?/span>

另外åQ?/span>Richard Stevens åœ¨ã€ŠUnix ¾|‘络¾~–程》卷1中提到的åŸÞZºŽä¿¡å·é©±åŠ¨çš„IOåQˆSignal Driven IOåQ‰æ¨¡åž‹ï¼Œç”׃ºŽè¯¥æ¨¡åž‹åƈ不常用,本文不作涉及。接下来åQŒæˆ‘们详¾l†åˆ†æžå››¿Uå¸¸è§çš„IOæ¨¡åž‹çš„å®žçŽ°åŽŸç†ã€‚äØ“äº†æ–¹ä¾¿æ˜qŽÍ¼Œæˆ‘们¾lŸä¸€ä½¿ç”¨IOçš„è¯»æ“ä½œä½œäØ“½CÞZ¾‹ã€?/span>

一ã€?/span>同步é˜Õd¡žIO

同步é˜Õd¡žIO模型是最½Ž€å•çš„IO模型åQŒç”¨æˆïLº¿½E‹åœ¨å†…æ ¸˜q›è¡ŒIO操作时被é˜Õd¡žã€?/span>

å›?/span>1 åŒæ­¥é˜Õd¡žIO

如图1所½Cºï¼Œç”¨æˆ·¾U¿ç¨‹é€šè¿‡¾pȝ»Ÿè°ƒç”¨read发è“vIOè¯ÀL“ä½œï¼Œç”Þq”¨æˆïL©ºé—´è{到内核空间。内核等到数据包到达后,然后ž®†æŽ¥æ”¶çš„æ•°æ®æ‹¯‚´åˆ°ç”¨æˆïL©ºé—ß_¼Œå®Œæˆread操作ã€?/span>

用户¾U¿ç¨‹ä½¿ç”¨åŒæ­¥é˜Õd¡žIO模型的伪代码描述为:

{
    read(socket, buffer);
    process(buffer);
}

即用户需要等待readž®†socket中的数据è¯Õd–到buffer后,才ç‘ô¾l­å¤„理接收的数据。整个IOè¯äh±‚的过½E‹ä¸­åQŒç”¨æˆïLº¿½E‹æ˜¯è¢«é˜»å¡žçš„åQŒè¿™å¯ÆD‡´ç”¨æˆ·åœ¨å‘èµ·IOè¯äh±‚æ—Óž¼Œä¸èƒ½åšä“Q何事情,对CPU的资源利用率不够ã€?/span>

二�/span>同步非阻塞IO

同步非阻塞IO是在同步é˜Õd¡žIO的基¼‹€ä¸Šï¼Œž®†socket讄¡½®ä¸ºNONBLOCK。这样做用户¾U¿ç¨‹å¯ä»¥åœ¨å‘èµ·IOè¯äh±‚后可以立卌™¿”回ã€?/span>

 

å›? åŒæ­¥éžé˜»å¡žIO

如图2所½Cºï¼Œç”׃ºŽsocket是非é˜Õd¡žçš„æ–¹å¼ï¼Œå› æ­¤ç”¨æˆ·¾U¿ç¨‹å‘è“vIOè¯äh±‚时立卌™¿”回。但òq¶æœªè¯Õd–åˆîC“Q何数据,用户¾U¿ç¨‹éœ€è¦ä¸æ–­åœ°å‘è“vIOè¯äh±‚åQŒç›´åˆ°æ•°æ®åˆ°è¾‘֐ŽåQŒæ‰çœŸæ­£è¯Õd–到数据,¾l§ç®‹æ‰§è¡Œã€?/span>

用户¾U¿ç¨‹ä½¿ç”¨åŒæ­¥éžé˜»å¡žIO模型的伪代码描述为:

{
    
while(read(socket, buffer) != SUCCESS) { }
    process(buffer);
}

å? 用户需要不断地调用readåQŒå°è¯•读取socket中的数据åQŒç›´åˆ°è¯»å–成功后åQŒæ‰¾l§ç®‹å¤„理接收的数据。整个IOè¯äh±‚的过½E‹ä¸­åQŒè™½ç„¶ç”¨æˆïLº¿½E‹æ¯‹Æ¡å‘èµ·IOè¯? 求后可以立即˜q”回åQŒä½†æ˜¯äؓ了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU的资源。一般很ž®‘直接ä‹É用这¿Uæ¨¡åž‹ï¼Œè€Œæ˜¯åœ¨å…¶ä»–IO模型中ä‹É用非é˜? 塞IO˜q™ä¸€ç‰ÒŽ€§ã€?/span>

三ã€?/span>IO多èµ\复用

IO多èµ\复用模型是徏立在内核提供的多路分¼›Õd‡½æ•°select基础之上的,使用select函数可以避免同步非阻塞IO模型中轮询等待的问题ã€?/span>

å›? å¤šèµ\分离函数select

如图3所½Cºï¼Œç”¨æˆ·é¦–å…ˆž®†éœ€è¦è¿›è¡ŒIO操作的socketæ·ÕdŠ åˆ°select中,然后é˜Õd¡ž½{‰å¾…select¾pȝ»Ÿè°ƒç”¨˜q”回。当数据到达æ—Óž¼Œsocket被激‹z»ï¼Œselect函数˜q”回。用æˆïLº¿½E‹æ­£å¼å‘èµ·readè¯äh±‚åQŒè¯»å–æ•°æ®åÆˆ¾l§ç®‹æ‰§è¡Œã€?/span>

ä»? ‹¹ç¨‹ä¸Šæ¥çœ‹ï¼Œä½¿ç”¨select函数˜q›è¡ŒIOè¯äh±‚和同步阻塞模型没有太大的区别åQŒç”šè‡Œ™¿˜å¤šäº†æ·ÕdŠ ç›‘è§†socketåQŒä»¥åŠè°ƒç”¨select函数的额外操作,æ•? 率更差。但是,使用select以后最大的优势是用户可以在一个线½E‹å†…同时处理多个socketçš„IOè¯äh±‚。用户可以注册多个socketåQŒç„¶åŽä¸æ–­åœ°è°? 用selectè¯Õd–被激‹zȝš„socketåQŒå³å¯è¾¾åˆ°åœ¨åŒä¸€ä¸ªçº¿½E‹å†…同时处理多个IOè¯äh±‚的目çš?/span>。而在同步é˜Õd¡žæ¨¡åž‹ä¸­ï¼Œå¿…须通过多线½E‹çš„æ–¹å¼æ‰èƒ½è¾‘Öˆ°˜q™ä¸ªç›®çš„ã€?/span>

用户¾U¿ç¨‹ä½¿ç”¨select函数的伪代码描述为:

{
    select(socket);
    
while(1) {
        sockets 
= select();
        
for(socket in sockets) {
            
if(can_read(socket)) {
                read(socket, buffer);
                process(buffer);
            }
        }
    }
}

其中while循环前将socketæ·ÕdŠ åˆ°select监视中,然后在while内一直调用select获取被激‹zȝš„socketåQŒä¸€æ—¦socket可读åQŒä¾¿è°ƒç”¨read函数ž®†socket中的数据è¯Õd–出来ã€?/span>

ç„? 而,使用selectå‡½æ•°çš„ä¼˜ç‚¹åÆˆä¸ä»…é™äºŽæ­¤ã€‚è™½ç„¶ä¸Š˜q°æ–¹å¼å…è®¸å•¾U¿ç¨‹å†…处理多个IOè¯äh±‚åQŒä½†æ˜¯æ¯ä¸ªIOè¯äh±‚的过½E‹è¿˜æ˜¯é˜»å¡žçš„åQˆåœ¨select函数上阻 塞)åQŒåã^均时间甚è‡Ïx¯”同步é˜Õd¡žIO模型˜q˜è¦é•ѝ€‚如果用æˆïLº¿½E‹åªæ³¨å†Œè‡ªå·±æ„Ÿå…´­‘£çš„socket或者IOè¯äh±‚åQŒç„¶åŽåŽ»åšè‡ªå·Þqš„事情åQŒç­‰åˆ°æ•°æ®åˆ°æ¥æ—¶å†è¿›è¡Œå¤„ 理,则可以提高CPU的利用率ã€?/span>

IO多èµ\复用模型使用了Reactor设计模式实现了这一机制ã€?/span>

å›? Reactor设计模式

å¦? å›?所½Cºï¼ŒEventHandler抽象¾c»è¡¨½CºIO事äšg处理器,它拥有IOæ–‡äšg句柄HandleåQˆé€šè¿‡get_handle获取åQ‰ï¼Œä»¥åŠå¯¹Handleçš? 操作handle_eventåQˆè¯»/写等åQ‰ã€‚ç‘ô承于EventHandler的子¾cÕd¯ä»¥å¯¹äº‹äšgå¤„ç†å™¨çš„è¡ŒäØ“˜q›è¡Œå®šåˆ¶ã€‚Reactor¾cȝ”¨äºŽç®¡ç? EventHandleråQˆæ³¨å†Œã€åˆ é™¤ç­‰åQ‰ï¼Œòq¶ä‹É用handle_events实现事äšg循环åQŒä¸æ–­è°ƒç”¨åŒæ­¥äº‹ä»¶å¤šè·¯åˆ†¼›Õd™¨åQˆä¸€èˆ¬æ˜¯å†…æ ¸åQ‰çš„多èµ\分离函数 selectåQŒåªè¦æŸä¸ªæ–‡ä»¶å¥æŸ„被‹È€‹z»ï¼ˆå¯è¯»/写等åQ‰ï¼Œselectž®Þp¿”回(é˜Õd¡žåQ‰ï¼Œhandle_eventsž®×ƒ¼šè°ƒç”¨ä¸Žæ–‡ä»¶å¥æŸ„关联的事äšg处理器的 handle_event˜q›è¡Œç›¸å…³æ“ä½œã€?/span>

å›?/span>5 IO多èµ\复用

å¦? å›?所½Cºï¼Œé€šè¿‡Reactor的方式,可以ž®†ç”¨æˆïLº¿½E‹è½®è¯¢IO操作状态的工作¾lŸä¸€äº¤ç»™handle_events事äšg循环˜q›è¡Œå¤„理。用æˆïLº¿½E‹æ³¨å†Œäº‹ä»¶å¤„ç? 器之后可以ç‘ô¾l­æ‰§è¡Œåšå…¶ä»–的工作(异步åQ‰ï¼Œè€ŒReactor¾U¿ç¨‹è´Ÿè´£è°ƒç”¨å†…核的select函数‹‚€æŸ¥socket状态。当有socket被激‹zÀL—¶åQŒåˆ™é€šçŸ¥ 相应的用æˆïLº¿½E‹ï¼ˆæˆ–执行用æˆïLº¿½E‹çš„回调函数åQ‰ï¼Œæ‰§è¡Œhandle_event˜q›è¡Œæ•°æ®è¯Õd–、处理的工作。由于select函数是阻塞的åQŒå› æ­¤å¤šè·¯IO复用 模型也被¿UîCؓ异步é˜Õd¡žIO模型。注意,˜q™é‡Œçš„æ‰€è¯´çš„é˜Õd¡žæ˜¯æŒ‡select函数执行时线½E‹è¢«é˜Õd¡žåQŒè€Œä¸æ˜¯æŒ‡socket。一般在使用IO多èµ\复用模型 æ—Óž¼Œsocket都是讄¡½®ä¸ºNONBLOCK的,不过˜q™åƈ不会产生影响åQŒå› ä¸ºç”¨æˆ·å‘èµ·IOè¯äh±‚æ—Óž¼Œæ•°æ®å·²ç»åˆ°è¾¾äº†ï¼Œç”¨æˆ·¾U¿ç¨‹ä¸€å®šä¸ä¼šè¢«é˜Õd¡žã€?/span>

用户¾U¿ç¨‹ä½¿ç”¨IO多èµ\复用模型的伪代码描述为:

void UserEventHandler::handle_event() {
    
if(can_read(socket)) {
        read(socket, buffer);
        process(buffer);
    }
}

{
    Reactor.register(
new UserEventHandler(socket));
}

用户需要重写EventHandlerçš„handle_event函数˜q›è¡Œè¯Õd–数据、处理数据的工作åQŒç”¨æˆïLº¿½E‹åªéœ€è¦å°†è‡ªå·±çš„EventHandler注册到Reactor卛_¯ã€‚Reactor中handle_events事äšg循环的伪代码大致如下ã€?/span>

Reactor::handle_events() {
    
while(1) {
       sockets 
= select();
       
for(socket in sockets) {
            get_event_handler(socket).handle_event();
       }
    }
}

事äšg循环不断地调用select获取被激‹zȝš„socketåQŒç„¶åŽæ ¹æ®èŽ·å–socket对应的EventHandleråQŒæ‰§è¡Œå™¨handle_event函数卛_¯ã€?/span>

IO多èµ\å¤ç”¨æ˜¯æœ€å¸æ€‹É用的IO模型åQŒä½†æ˜¯å…¶å¼‚æ­¥½E‹åº¦˜q˜ä¸å¤?#8220;å½Õdº•”åQŒå› ä¸ºå®ƒä½¿ç”¨äº†ä¼šé˜Õd¡ž¾U¿ç¨‹çš„select¾pȝ»Ÿè°ƒç”¨ã€‚å› æ­¤IO多èµ\复用只能¿UîCؓ异步é˜Õd¡žIOåQŒè€ŒéžçœŸæ­£çš„异步IOã€?/span>

四�/span>异步IO

“çœ? æ­?#8221;的异步IO需要操作系¾lŸæ›´å¼ºçš„æ”¯æŒã€‚在IO多èµ\复用模型中,事äšg循环ž®†æ–‡ä»¶å¥æŸ„的状态事仉™€šçŸ¥¾l™ç”¨æˆïLº¿½E‹ï¼Œç”Þq”¨æˆïLº¿½E‹è‡ªè¡Œè¯»å–数据、处理数据。而在å¼? æ­¥IO模型中,当用æˆïLº¿½E‹æ”¶åˆ°é€šçŸ¥æ—Óž¼Œæ•°æ®å·²ç»è¢«å†…核读取完毕,òq¶æ”¾åœ¨äº†ç”¨æˆ·¾U¿ç¨‹æŒ‡å®šçš„缓冲区内,内核在IO完成后通知用户¾U¿ç¨‹ç›´æŽ¥ä½¿ç”¨å›_¯ã€?/span>

异步IO模型使用了Proactor设计模式实现了这一机制�/span>

å›? Proactor设计模式

å¦? å›?åQŒProactor模式和Reactoræ¨¡å¼åœ¨ç»“æž„ä¸Šæ¯”è¾ƒç›æ€¼¼åQŒä¸˜q‡åœ¨ç”¨æˆ·åQˆClientåQ‰ä‹É用方式上差别较大。Reactor模式中,用户¾U¿ç¨‹é€šè¿‡ 向Reactor对象注册感兴­‘£çš„事äšg监听åQŒç„¶åŽäº‹ä»¶è§¦å‘时调用事äšg处理函数。而Proactor模式中,用户¾U¿ç¨‹ž®? AsynchronousOperationåQˆè¯»/写等åQ‰ã€Proactor以及操作完成时的CompletionHandler注册åˆ? AsynchronousOperationProcessor。AsynchronousOperationProcessor使用Facade模式æ? 供了一¾l„异步操作APIåQˆè¯»/写等åQ‰ä¾›ç”¨æˆ·ä½¿ç”¨åQŒå½“用户¾U¿ç¨‹è°ƒç”¨å¼‚æ­¥API后,便ç‘ô¾l­æ‰§è¡Œè‡ªå·Þqš„ä»ÕdŠ¡ã€? AsynchronousOperationProcessor ä¼šå¼€å¯ç‹¬ç«‹çš„内核¾U¿ç¨‹æ‰§è¡Œå¼‚步操作åQŒå®žçŽ°çœŸæ­£çš„å¼‚æ­¥ã€‚å½“å¼‚æ­¥IO操作完成 æ—Óž¼ŒAsynchronousOperationProcessorž®†ç”¨æˆïLº¿½E‹ä¸ŽAsynchronousOperation一èµäh³¨å†Œçš„Proactor å’ŒCompletionHandler取出åQŒç„¶åŽå°†CompletionHandler与IO操作的结果数据一赯‚{发给 ProactoråQŒProactor负责回调每一个异步操作的事äšg完成处理函数handle_event。虽然Proactor模式中每个异步操作都可以 ¾l‘定一个Proactor对象åQŒä½†æ˜¯ä¸€èˆ¬åœ¨æ“ä½œ¾pȝ»Ÿä¸­ï¼ŒProactor被实çŽîCØ“Singleton模式åQŒä»¥ä¾¿äºŽé›†ä¸­åŒ–分发操作完成事件ã€?/span>

å›?/span>7 å¼‚æ­¥IO

å¦? å›?所½Cºï¼Œå¼‚æ­¥IO模型中,用户¾U¿ç¨‹ç›´æŽ¥ä½¿ç”¨å†…核提供的异步IO API发è“vreadè¯äh±‚åQŒä¸”发è“v后立卌™¿”回,¾l§ç®‹æ‰§è¡Œç”¨æˆ·¾U¿ç¨‹ä»£ç ã€‚不˜q‡æ­¤æ—¶ç”¨æˆïLº¿½E‹å·² ¾lå°†è°ƒç”¨çš„AsynchronousOperationå’ŒCompletionHandler注册到内核,然后操作¾pȝ»Ÿå¼€å¯ç‹¬ç«‹çš„内核¾U¿ç¨‹åŽÕd¤„理IOæ“? 作。当readè¯äh±‚的数据到达时åQŒç”±å†…核负责è¯Õd–socket中的数据åQŒåƈ写入用户指定的缓冲区中。最后内核将read的数据和用户¾U¿ç¨‹æ³¨å†Œçš? CompletionHandler分发¾l™å†…部ProactoråQŒProactorž®†IO完成的信息通知¾l™ç”¨æˆïLº¿½E‹ï¼ˆä¸€èˆ¬é€šè¿‡è°ƒç”¨ç”¨æˆ·¾U¿ç¨‹æ³¨å†Œçš„完成事ä»? 处理函数åQ‰ï¼Œå®Œæˆå¼‚æ­¥IOã€?/span>

用户¾U¿ç¨‹ä½¿ç”¨å¼‚æ­¥IO模型的伪代码描述为:


void UserCompletionHandler::handle_event(buffer) {
    process(buffer);
}

{
    aio_read(socket, 
new UserCompletionHandler);
}

用户需要重写CompletionHandlerçš„handle_event函数˜q›è¡Œå¤„理数据的工作,参数buffer表示Proactor已经准备好的数据åQŒç”¨æˆïLº¿½E‹ç›´æŽ¥è°ƒç”¨å†…核提供的异步IO APIåQŒåƈž®†é‡å†™çš„CompletionHandler注册卛_¯ã€?/span>

ç›? 比于IO多èµ\复用模型åQŒå¼‚æ­¥IOòq¶ä¸ååˆ†å¸¸ç”¨åQŒä¸ž®‘高性能òq¶å‘服务½E‹åºä½¿ç”¨IO多èµ\复用模型+多线½E‹ä“Q务处理的架构基本可以满èƒö需求。况且目前操作系¾lŸå¯¹ 异步IOçš„æ”¯æŒåÆˆéžç‰¹åˆ«å®Œå–„ï¼Œæ›´å¤šçš„æ˜¯é‡‡ç”¨IO多èµ\复用模型模拟异步IO的方式(IO事äšg触发时不直接通知用户¾U¿ç¨‹åQŒè€Œæ˜¯ž®†æ•°æ®è¯»å†™å®Œæ¯•后攑ֈ°ç”¨æˆ·æŒ‡å®šçš? ¾~“冲åŒÞZ¸­åQ‰ã€‚Java7之后已经支持了异步IOåQŒæ„Ÿå…´è¶£çš„读者可以尝试ä‹É用ã€?/span>

本文从基本概å¿üc€å·¥ä½œæµ½E‹å’Œä»£ç ½C? 例三个层‹Æ¡ç®€è¦æ˜qîCº†å¸¸è§çš„å››¿Ué«˜æ€§èƒ½IO模型的结构和原理åQŒç†æ¸…了同步、异步、阻塞、非é˜Õd¡ž˜q™äº›å®ÒŽ˜“æ·äh·†çš„æ¦‚å¿üc€‚通过寚w«˜æ€§èƒ½IO模型的理解,可以在服 务端½E‹åºçš„开发中选择更符合实际业务特点的IO模型åQŒæé«˜æœåŠ¡è´¨é‡ã€‚å¸Œæœ›æœ¬æ–‡å¯¹ä½ æœ‰æ‰€å¸®åŠ©ã€?/span>


ç›æ€¼¼çš„:
http://www.cnblogs.com/nufangrensheng/p/3588690.html
http://www.ibm.com/developerworks/cn/linux/l-async/



DLevin 2015-09-04 15:16 发表评论
]]>
[转]HotSpot术语è¡?/title><link>http://www.aygfsteel.com/DLevin/archive/2015/08/10/426721.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Mon, 10 Aug 2015 12:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2015/08/10/426721.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/426721.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2015/08/10/426721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/426721.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/426721.html</trackback:ping><description><![CDATA[<p>非常好的术语参考表åQŒçºªå½•下来以防以后忘了。è{自:<a >http://openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html</a><br /><br /></p><h1 style="font-size: 12.5pt; padding: 0pt; margin: 0ex 0.5ex 1ex 0pt; font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica;">HotSpot Glossary of Terms</h1><p style="padding: 0pt; margin: 1ex 0em; font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica; font-size: 13.3333330154419px; line-height: 18.6666660308838px;">A work in progress, especially as the HotSpot VM evolves. But a place to put definitions of things so we only have to define them once. There are empty entries (marked <em>TBD</em> for "to be defined") because we think of things that we need to define faster than we think of good definitions.</p><dl style="font-family: 'DejaVu Sans', 'Bitstream Vera Sans', 'Luxi Sans', Verdana, Arial, Helvetica; font-size: 13.3333330154419px; line-height: 18.6666660308838px;"><dt><a name="adaptiveSpinning" id="adaptiveSpinning"><strong>adaptive spinning</strong></a></dt><dd>An optimization technique whereby a thread spins waiting for a change-of-state to occur (typically a flag that represents some event has occurred - such as the release of a lock) rather than just blocking until notified that the change has occurred. The "adaptive" part comes from the policy decisions that control how long the thread will spin until eventually deciding to block.</dd><dt><a name="biasedLocking" id="biasedLocking"><strong>biased locking</strong></a></dt><dd>An optimization in the VM that leaves an object as logically locked by a given thread even after the thread has released the lock. The premise is that if the thread subsequently reacquires the lock (as often happens), then reacquisition can be achieved at very low cost. If a different thread tries to acquire a biased lock then the bias must be revoked from the current bias owner.</dd><dt><a name="blockStartTable" id="blockStartTable"><strong>block start table</strong></a></dt><dd>A table that shows, for a region of the heap, where the object starts that comes on to this region from lower addresees. Used, for example, with the<a style="text-decoration: none; color: #666666;">card table</a> variant of the <a style="text-decoration: none; color: #666666;">remembered set</a>.</dd><dt><a name="bootstrapClassloader" id="bootstrapClassloader"><strong>bootstrap classloader</strong></a></dt><dd>The logical classloader that has responsibility for loading the classes (and resources) that are found in the boot-classpath - typically the core Java platform classes. Typically implemented as part of the VM, by historical convention the bootstrap classloader is represented by NULL at the Java API level.</dd><dt><a name="bytecodeVerification" id="bytecodeVerification"><strong>bytecode verification</strong></a></dt><dd>A step in the linking process of a class where the methods bytecodes are analyzed to ensure type-safety.</dd><dt><a name="C1Compiler" id="C1Compiler"><strong>C1 compiler</strong></a></dt><dd>Fast, lightly optimizing bytecode compiler. Performs some value numbering, inlining, and class analysis. Uses a simple CFG-oriented SSA "high" IR, a machine-oriented "low" IR, a linear scan register allocation, and a template-style code generator.</dd><dt><a name="C2Compiler" id="C2Compiler"><strong>C2 compiler</strong></a></dt><dd>Highly optimizing bytecode compiler, also known as 'opto'. Uses a "sea of nodes" SSA "ideal" IR, which lowers to a machine-specific IR of the same kind. Has a graph-coloring register allocator; colors all machine state, including local, global, and argument registers and stack. Optimizations include global value numbering, conditional constant type propagation, constant folding, global code motion, algebraic identities, method inlining (aggressive, optimistic, and/or multi-morphic), intrinsic replacement, loop transformations (unswitching, unrolling), array range check elimination.</dd><dt><a name="cardTable" id="cardTable"><strong>card table</strong></a></dt><dd>A kind of <a style="text-decoration: none; color: #666666;">remembered set</a> that records where oops have changed in a generation.</dd><dt><a name="classDataSharing" id="classDataSharing"><strong>class data sharing</strong></a></dt><dd>A startup optimization that records the in-memory form of some classes, so that that form can be mapped into memory by a subsequent run of the virtual machine, rather than loading those classes from their class files.</dd><dt><a name="classHierachyAnalysis" id="classHierachyAnalysis"><strong>class hierachy analysis</strong></a></dt><dd>Also known as 'CHA'. Analysis of the class tree used by a compiler to determine if the receiver at a virtual call site has a single implementor. If so, the callee can be inlined or the compiler can employ some other static call mechanism.</dd><dt><a name="codeCache" id="codeCache"><strong>code cache</strong></a></dt><dd>A special heap that holds compiled code. These objects are not relocated by the GC, but may contain oops, which serve as GC roots.</dd><dt><a name="compaction" id="compaction"><strong>compaction</strong></a></dt><dd>A garbage collection technique that results in live objects occupying a dense portion of the virtual address space, and available space in another portion of the address space. Cf. <a style="text-decoration: none; color: #666666;">free list</a>.</dd><dt><a name="concurrency" id="concurrency"><strong>concurrency</strong></a></dt><dd>Concurrency, or more specifically concurrent programming, is the logical simultaneous execution of multiple instruction streams. If multiple processors are available then the logical simultaneity can be physical simultaneity - this is known as 'parallelism'</dd><dt><a name="concurrentGarbageCollection" id="concurrentGarbageCollection"><strong>concurrent garbage collection</strong></a></dt><dd>A garbage collection algorithm that does most (if not all) of its work while the Java application threads are still running.</dd><dt><a name="copyingGarbageCollection" id="copyingGarbageCollection"><strong>copying garbage collection</strong></a></dt><dd>A garbage collection algorithm that moves objects during the collection.</dd><dt><a name="deoptimization" id="deoptimization"><strong>deoptimization</strong></a></dt><dd>The process of converting an compiled (or more optimized) stack frame into an interpreted (or less optimized) stack frame. Also describes the discarding of an nmethod whose dependencies (or other assumptions) have been broken. Deoptimized nmethods are typically recompiled to adapt to changing application behavior. Example: A compiler initially assumes a reference value is never null, and tests for it using a trapping memory access. Later on, the application uses null values, and the method is deoptimized and recompiled to use an explicit test-and-branch idiom to detect such nulls.</dd><dt><a name="dependency" id="dependency"><strong>dependency</strong></a></dt><dd>An optimistic assumption associated with an nmethod, which allowed the compiler to emit improved code into the nmethod. Example: A given class has no subclasses, which simplifies method dispatch and type testing. The loading of new classes (or replacement of old classes) can cause dependencies to become false, which requires dependent nmethods to be discarded and activations of those nmethods to be deoptimized.</dd><dt><a name="eden" id="eden"><strong>eden</strong></a></dt><dd>A part of the Java object heap where object can be created efficiently.</dd><dt><a name="freeList" id="freeList"><strong>free list</strong></a></dt><dd>A storage management technique in which unused parts of the Java object heap are chained one to the next, rather than having all of the unused part of the heap in a single block.</dd><dt><a name="garbageCollection" id="garbageCollection"><strong>garbage collection</strong></a></dt><dd>The automatic management of storage.</dd><dt><a name="garbageCollectionRoot" id="garbageCollectionRoot"><strong>garbage collection root</strong></a></dt><dd>A pointer into the Java object heap from outside the heap. These come up, e.g., from static fields of classes, local references in activation frames, etc.</dd><dt><a name="GCMap" id="GCMap"><strong>GC map</strong></a></dt><dd>A description emitted by the JIT (C1 or C2) of the locations of oops in registers or on stack in a compiled stack frame. Each code location which might execute a safepoint has an associated GC map. The GC knows how to parse a frame from a stack, to request a GC map from a frame's nmethod, and to unpack the GC map and manage the indicated oops within the stack frame.</dd><dt><a name="generationalGarbageCollection" id="generationalGarbageCollection"><strong>generational garbage collection</strong></a></dt><dd>A storage management technique that separates objects expected to be referenced for different lengths of time into different regions of the heap, so that different algorithms can be applied to the collection of those regions.</dd><dt><a name="handle" id="handle"><strong>handle</strong></a></dt><dd>A memory word containing an oop. The word is known to the GC, as a root reference. C/C++ code generally refers to oops indirectly via handles, to enable the GC to find and manage its root set more easily. Whenever C/C++ code blocks in a safepoint, the GC may change any oop stored in a handle. Handles are either 'local' (thread-specific, subject to a stack discipline though not necessarily on the thread stack) or global (long-lived and explicitly deallocated). There are a number of handle implementations throughout the VM, and the GC knows about them all.</dd><dt><a name="hotLock" id="hotLock"><strong>hot lock</strong></a></dt><dd>A lock that is highly contended.</dd><dt><a name="interpreter" id="interpreter"><strong>interpreter</strong></a></dt><dd>A VM module which implements method calls by individually executing bytecodes. The interpreter has a limited set of highly stylized stack frame layouts and register usage patterns, which it uses for all method activations. The Hotspot VM generates its own interpreter at start-up time.</dd><dt><a name="JITCompilers" id="JITCompilers"><strong>JIT compilers</strong></a></dt><dd>An on-line compiler which generates code for an application (or class library) during execution of the application itself. ("JIT" stands for "just in time".) A JIT compiler may create machine code shortly before the first invocation of a Java method. Hotspot compilers usually allow the interpreter ample time to "warm up" Java methods, by executing them thousands of times. This warm-up period allows a compiler to make better optimization decisions, because it can observe (after initial class loading) a more complete class hierarchy. The compiler can also inspect branch and type profile information gathered by the interpreter.</dd><dt><a name="JNI" id="JNI"><strong>JNI</strong></a></dt><dd>The Java Native Interface - a specification and API for how Java code can call out to native C code, and how native C code can call into the Java VM</dd><dt><a name="JVMTI" id="JVMTI"><strong>JVM TI</strong></a></dt><dd>The Java Virtual Machine Tools Interface - a standard specification and API that is used by development and monitoring tools. See <a style="text-decoration: none; color: #666666;">JVM TI</a> for more information.</dd><dt><a name="klassPointer" id="klassPointer"><strong>klass pointer</strong></a></dt><dd>The second word of every object header. Points to another object (a metaobject) which describes the layout and behavior of the original object. For Java objects, the "klass" contains a C++ style "vtable".</dd><dt><a name="markWord" id="markWord"><strong>mark word</strong></a></dt><dd>The first word of every object header. Usually a set of bitfields including synchronization state and identity hash code. May also be a pointer (with characteristic low bit encoding) to synchronization related information. During GC, may contain GC state bits.</dd><dt><a name="nmethod" id="nmethod"><strong>nmethod</strong></a></dt><dd>A block of executable code which implements some Java bytecodes. It may be a complete Java method, or an 'OSR' method. It routinely includes object code for additional methods inlined by the compiler.</dd><dt><a name="objectHeader" id="objectHeader"><strong>object header</strong></a></dt><dd>Common structure at the beginning of every GC-managed heap object. (Every oop points to an object header.) Includes fundamental information about the heap object's layout, type, GC state, synchronization state, and identity hash code. Consists of two words. In arrays it is immediately followed by a length field. Note that both Java objects and VM-internal objects have a common object header format.</dd><dt><a name="objectPromotion" id="objectPromotion"><strong>object promotion</strong></a></dt><dd>The act of copying an object from one generation to another.</dd><dt><a name="oldGeneration" id="oldGeneration"><strong>old generation</strong></a></dt><dd>A region of the Java object heap that holds object that have remained referenced for a while.</dd><dt><a name="onStackReplacement" id="onStackReplacement"><strong>on-stack replacement</strong></a></dt><dd>Also known as 'OSR'. The process of converting an interpreted (or less optimized) stack frame into a compiled (or more optimized) stack frame. This happens when the interpreter discovers that a method is looping, requests the compiler to generate a special nmethod with an entry point somewhere in the loop (specifically, at a backward branch), and transfers control to that nmethod. A rough inverse to deoptimization.</dd><dt><a name="oop" id="oop"><strong>oop</strong></a></dt><dd>An object pointer. Specifically, a pointer into the GC-managed heap. (The term is traditional. One 'o' may stand for 'ordinary'.) Implemented as a native machine address, not a handle. Oops may be directly manipulated by compiled or interpreted Java code, because the GC knows about the liveness and location of oops within such code. (See GC map.) Oops can also be directly manipulated by short spans of C/C++ code, but must be kept by such code within handles across every safepoint.</dd><dt><a name="parallelClassloading" id="parallelClassloading"><strong>parallel classloading</strong></a></dt><dd>The ability to have multiple classes/type be in the process of being loaded by the same classloader at the same time.</dd><dt><a name="parallelGarbageCollection" id="parallelGarbageCollection"><strong>parallel garbage collection</strong></a></dt><dd>A garbage collection algorithm that uses multiple threads of control to perform more efficiently on multi-processor boxes.</dd><dt><a name="permanentGeneration" id="permanentGeneration"><strong>permanent generation</strong></a></dt><dd>A region of the address space that holds object allocated by the virtual machine itself, but which is managed by the garbage collector. The permanent generation is mis-named, in that almost all of the objects in it <em>can</em>be collected, though they tend to be referenced for a long time, so they rarely become garbage.</dd><dt><a name="rememberedSet" id="rememberedSet"><strong>remembered set</strong></a></dt><dd>A data structure that records pointers between generations.</dd><dt><a name="safepoint" id="safepoint"><strong>safepoint</strong></a></dt><dd>A point during program execution at which all GC roots are known and all heap object contents are consistent. From a global point of view, all threads must block at a safepoint before the GC can run. (As a special case, threads running JNI code can continue to run, because they use only handles. During a safepoint they must block instead of loading the contents of the handle.) From a local point of view, a safepoint is a distinguished point in a block of code where the executing thread may block for the GC. Most call sites qualify as safepoints. There are strong invariants which hold true at every safepoint, which may be disregarded at non-safepoints. Both compiled Java code and C/C++ code be optimized between safepoints, but less so across safepoints. The JIT compiler emits a GC map at each safepoint. C/C++ code in the VM uses stylized macro-based conventions (e.g., TRAPS) to mark potential safepoints.</dd><dt><a name="seaOfNodes" id="seaOfNodes"><strong>sea-of-nodes</strong></a></dt><dd>The high-level intermediate representation in C2. It is an SSA form where both data and control flow are represented with explicit edges between nodes. It differs from forms used in more traditional compilers in that nodes are not bound to a block in a control flow graph. The IR allows nodes to float within the sea (subject to edge constraints) until they are scheduled late in the compilation process.</dd><dt><a name="sa" id="sa"><strong>Serviceability Agent (SA)</strong></a></dt><dd>The Serviceablity Agent is collection of Sun internal code that aids in debugging HotSpot problems. It is also used by several JDK tools - jstack, jmap, jinfo, and jdb. See <a style="text-decoration: none; color: #666666;">SA</a> for more information.</dd><dt><a name="stackmap" id="stackmap"><strong>stackmap</strong></a></dt><dd>Refers to the StackMapTable attribut e or a particular StackMapFrame in the table.</dd><dt><a name="StackMapTable" id="StackMapTable"><strong>StackMapTable</strong></a></dt><dd>An attribute of the Code attribute in a classfile which contains type information used by the new verifier during verification. It consists of an array of StackMapFrames. It is generated automatically by javac as of JDK6.</dd><dt><a name="survivorSpace" id="survivorSpace"><strong>survivor space</strong></a></dt><dd>A region of the Java object heap used to hold objects. There are usually a pair of survivor spaces, and collection of one is achieved by copying the referenced objects in one survivor space to the other survivor space.</dd><dt><a name="synchronization" id="synchronization"><strong>synchronization</strong></a></dt><dd>In general terms this is the coordination of concurrent activities to ensure the safety and liveness properties of those activities. For example, protecting access to shared data by using a lock to guard all code paths to that data.</dd><dt><a name="TLAB" id="TLAB"><strong>TLAB</strong></a></dt><dd>Thread-local allocation buffer. Used to allocate heap space quickly without synchronization. Compiled code has a "fast path" of a few instructions which tries to bump a high-water mark in the current thread's TLAB, successfully allocating an object if the bumped mark falls before a TLAB-specific limit address.</dd><dt><a name="uncommonTrap" id="uncommonTrap"><strong>uncommon trap</strong></a></dt><dd>When code generated by C2 reverts back to the interpreter for further execution. C2 typically compiles for the common case, allowing it to focus on optimization of frequently executed paths. For example, C2 inserts an uncommon trap in generated code when a class that is uninitialized at compile time requires run time initialization.</dd><dt><a name="verifier" id="verifier"><strong>verifier</strong></a></dt><dd>The software code in the VM which performs bytecode verification.</dd><dt><a name="VMOperations" id="VMOperations"><strong>VM Operations</strong></a></dt><dd>Operations in the VM that can be requested by Java threads, but which must be executed, in serial fashion by a specific thread known as the VM thread. These operations are often synchronous, in that the requester will block until the VM thread has completed the operation. Many of these operations also require that the VM be brought to a safepoint before the operation can be performed - a garbage collection request is a simple example.</dd><dt><a name="writeBarrier" id="writeBarrier"><strong>write barrier</strong></a></dt><dd>Code that is executed on every oop store. For example, to maintain a remembered set.</dd><dt><a name="youngGeneration" id="youngGeneration"><strong>young generation</strong></a></dt><dd>A region of the Java object heap that holds recently-allocated objects.</dd></dl><img src ="http://www.aygfsteel.com/DLevin/aggbug/426721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2015-08-10 20:27 <a href="http://www.aygfsteel.com/DLevin/archive/2015/08/10/426721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]自旋锁、排队自旋锁、MCS锁、CLHé”?/title><link>http://www.aygfsteel.com/DLevin/archive/2015/08/07/416102.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 06 Aug 2015 16:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2015/08/07/416102.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/416102.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2015/08/07/416102.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/416102.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/416102.html</trackback:ping><description><![CDATA[转自åQšhttp://coderbee.net/index.php/concurrent/20131115/577<br /><br /><h3>自旋锁(Spin lockåQ?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">自旋锁是指当一个线½E‹å°è¯•获取某个锁æ—Óž¼Œå¦‚果该锁已被其他¾U¿ç¨‹å ç”¨åQŒå°±ä¸€ç›´åó@环检‹¹‹é”æ˜¯å¦è¢«é‡Šæ”¾ï¼Œè€Œä¸æ˜¯è¿›å…¥çº¿½E‹æŒ‚èµähˆ–睡眠状态ã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">自旋锁适用于锁保护的äÍ界区很小的情况,临界区很ž®çš„话,锁占用的旉™—´ž®±å¾ˆçŸ­ã€?/p><h4>½Ž€å•的实现</h4><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: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReference;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> SpinLock {<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicReference</span><span style="color: #000000; "><</span><span style="color: #000000; ">Thread</span><span style="color: #000000; ">></span><span style="color: #000000; "> owner </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicReference</span><span style="color: #000000; "><</span><span style="color: #000000; ">Thread</span><span style="color: #000000; ">></span><span style="color: #000000; ">();<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock() {<br />        Thread currentThread </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Thread.currentThread();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> å¦‚果锁未被占用,则设¾|®å½“前线½E‹äؓ锁的拥有è€?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (owner.compareAndSet(</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">, currentThread)) { }<br />    }<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock() {<br />        Thread currentThread </span><span style="color: #000000; ">=</span><span style="color: #000000; "> Thread.currentThread();</span><span style="color: #008000; ">//</span><span style="color: #008000; "> åªæœ‰é”çš„æ‹¥æœ‰è€…才能释æ”ùN”</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        owner.compareAndSet(currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">);<br />    }<br />}</span></div><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><br />SimpleSpinLock里有一个owner属性持有锁当前拥有者的¾U¿ç¨‹çš„å¼•ç”¨ï¼Œå¦‚æžœè¯¥å¼•ç”¨äØ“nullåQŒåˆ™è¡¨ç¤ºé”æœªè¢«å ç”¨ï¼Œä¸äØ“null则被占用ã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">˜q™é‡Œç”¨AtomicReferenceæ˜¯äØ“äº†ä‹É用它的原子性的compareAndSetæ–ÒŽ³•åQˆCAS操作åQ‰ï¼Œè§£å†³äº†å¤š¾U¿ç¨‹òq¶å‘æ“ä½œå¯ÆD‡´æ•°æ®ä¸ä¸€è‡´çš„问题åQŒç¡®ä¿å…¶ä»–线½E‹å¯ä»¥çœ‹åˆ°é”çš„真实状æ€?br /></p><h4>¾~ºç‚¹</h4><ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">CAS操作需要硬件的配合åQ?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">保证各个CPU的缓存(L1、L2、L3、跨CPU Socket、主存)的数据一致性,通讯开销很大åQŒåœ¨å¤šå¤„理器¾pȝ»Ÿä¸Šæ›´ä¸¥é‡åQ?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">没法保证公åã^性,不保证等待进½E?¾U¿ç¨‹æŒ‰ç…§FIFO™åºåºè޷得锁ã€?/li></ol><h3>Ticket Lock</h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">Ticket Lock æ˜¯äØ“äº†è§£å†³ä¸Šé¢çš„å…¬åã^性问题,¾cÖM¼¼äºŽçŽ°å®žä¸­é“¶è¡ŒæŸœå°çš„æŽ’é˜Ÿå«åøP¼šé”æ‹¥æœ‰ä¸€ä¸ªæœåŠ¡å·åQŒè¡¨½Cºæ­£åœ¨æœåŠ¡çš„¾U¿ç¨‹åQŒè¿˜æœ‰ä¸€ä¸ªæŽ’队号åQ›æ¯ä¸ªçº¿½E‹å°è¯•获取锁之前先拿一个排队号åQŒç„¶åŽä¸æ–­è½®è¯¢é”çš„当前服务号是否是自å·Þqš„æŽ’é˜ŸåøP¼Œå¦‚果是,则表½Cø™‡ªå·±æ‹¥æœ‰äº†é”ï¼Œä¸æ˜¯åˆ™ç‘ô¾l­è½®è¯¢ã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">当线½E‹é‡Šæ”ùN”æ—Óž¼Œž®†æœåŠ¡å·åŠ?åQŒè¿™æ ·ä¸‹ä¸€ä¸ªçº¿½E‹çœ‹åˆ°è¿™ä¸ªå˜åŒ–,ž®±é€€å‡ø™‡ªæ—‹ã€?/p><h4>½Ž€å•的实现</h4><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: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicInteger;  <br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> TicketLock {<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicInteger serviceNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicInteger(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> æœåŠ¡å?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> AtomicInteger ticketNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">new</span><span style="color: #000000; "> AtomicInteger(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> æŽ’队å?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> lock() { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> é¦–先原子性地获得一个排队号</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> myTicketNum </span><span style="color: #000000; ">=</span><span style="color: #000000; "> ticketNum.getAndIncrement(); </span><span style="color: #008000; ">//</span><span style="color: #008000; "> åªè¦å½“前服务号不是自å·Þqš„ž®×ƒ¸æ–­è½®è¯?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (serviceNum.get() </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> myTicketNum) { }<br />        </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> myTicketNum;<br />    }<br />    <br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> myTicket) { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> åªæœ‰å½“前¾U¿ç¨‹æ‹¥æœ‰è€…才能释æ”ùN”</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> myTicket </span><span style="color: #000000; ">+</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />        serviceNum.compareAndSet(myTicket, next);<br />    }<br />}</span></div><h4>¾~ºç‚¹</h4><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">Ticket Lock 虽然解决了公òqÏx€§çš„问题åQŒä½†æ˜¯å¤šå¤„理器系¾lŸä¸ŠåQŒæ¯ä¸ªè¿›½E?¾U¿ç¨‹å ç”¨çš„处理器都在è¯Õd†™åŒä¸€ä¸ªå˜é‡serviceNum åQŒæ¯‹Æ¡è¯»å†™æ“ä½œéƒ½å¿…须在多个处理器¾~“存之间˜q›è¡Œ¾~“存同步åQŒè¿™ä¼šå¯¼è‡´ç¹é‡çš„¾pȝ»Ÿæ€Èº¿å’Œå†…存的‹¹é‡åQŒå¤§å¤§é™ä½Žç³»¾lŸæ•´ä½“的性能ã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">下面介绍的CLH锁和MCSé”éƒ½æ˜¯äØ“äº†è§£å†Œ™¿™ä¸ªé—®é¢˜çš„ã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">MCS 来自于其发明人名字的首字母: John Mellor-Crummeyå’ŒMichael Scottã€?/p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">CLH的发明äh是:CraigåQŒLandin and Hagerstenã€?/p><h3>MCSé”?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">MCS Spinlock 是一¿UåŸºäºŽé“¾è¡¨çš„可扩展、高性能、公òq³çš„自旋锁,甌™¯·¾U¿ç¨‹åªåœ¨æœ¬åœ°å˜é‡ä¸Šè‡ªæ—‹ï¼Œç›´æŽ¥å‰é©±è´Ÿè´£é€šçŸ¥å…¶ç»“束自旋,从而极大地减少了不必要的处理器¾~“存同步的次敎ͼŒé™ä½Žäº†æ€Èº¿å’Œå†…存的开销ã€?/p><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: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReferenceFieldUpdater;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> MCSLock {<br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> MCSNode {<br />        </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> MCSNode next;<br />        </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> isBlock </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> é»˜è®¤æ˜¯åœ¨½{‰å¾…é”?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br /><br />    </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> MCSNode queue;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> æŒ‡å‘最后一个申请锁的MCSNode</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> AtomicReferenceFieldUpdater UPDATER </span><span style="color: #000000; ">=</span><span style="color: #000000; "> AtomicReferenceFieldUpdater<br />            .newUpdater(MCSLock.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, MCSNode.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, </span><span style="color: #000000; ">"</span><span style="color: #000000; ">queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock(MCSNode currentThread) {<br />        MCSNode predecessor </span><span style="color: #000000; ">=</span><span style="color: #000000; "> UPDATER.getAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread);</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 1</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (predecessor </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {<br />            predecessor.next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> currentThread;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 2</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (currentThread.isBlock) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 3</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            }<br />        }<br />    }<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(MCSNode currentThread) {<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (currentThread.isBlock) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> é”æ‹¥æœ‰è€…进行释æ”ùN”æ‰æœ‰æ„ä¹‰</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />        }<br /><br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (currentThread.next </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> ‹‚€æŸ¥æ˜¯å¦æœ‰äººæŽ’在自己后é?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (UPDATER.compareAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)) {</span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 4<br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> compareAndSet˜q”回true表示¼‹®å®žæ²¡æœ‰äººæŽ’在自己后é?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />            } </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "> {<br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> ½Hç„¶æœ‰äh排在自己后面了,可能˜q˜ä¸çŸ¥é“是谁åQŒä¸‹é¢æ˜¯½{‰å¾…后箋è€?br />                </span><span style="color: #008000; ">//</span><span style="color: #008000; "> ˜q™é‡Œä¹‹æ‰€ä»¥è¦å¿™ç­‰æ˜¯å› ä¸ºï¼šstep 1执行完后åQŒstep 2可能˜q˜æ²¡æ‰§è¡Œå®?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                </span><span style="color: #0000FF; ">while</span><span style="color: #000000; "> (currentThread.next </span><span style="color: #000000; ">==</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) { </span><span style="color: #008000; ">//</span><span style="color: #008000; "> step 5</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">                }<br />            }<br />        }<br /><br />        currentThread.next.isBlock </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />        currentThread.next </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> for GC</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br />}</span></div><h3>CLHé”?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">CLH锁也是一¿UåŸºäºŽé“¾è¡¨çš„可扩展、高性能、公òq³çš„自旋锁,甌™¯·¾U¿ç¨‹åªåœ¨æœ¬åœ°å˜é‡ä¸Šè‡ªæ—‹ï¼Œå®ƒä¸æ–­è½®è¯¢å‰é©Þqš„状态,如果发现前驱释放了锁ž®Þq»“束自旋ã€?br /></p><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: #0000FF; ">import</span><span style="color: #000000; "> java.util.concurrent.atomic.AtomicReferenceFieldUpdater;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> CLHLock {<br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> CLHNode {<br />        </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; "> isLocked </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> é»˜è®¤æ˜¯åœ¨½{‰å¾…é”?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">    }<br /><br />    @SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unused</span><span style="color: #000000; ">"</span><span style="color: #000000; "> )<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">volatile</span><span style="color: #000000; "> CLHNode tail ;<br />    </span><span style="color: #0000FF; ">private</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">final</span><span style="color: #000000; "> AtomicReferenceFieldUpdater</span><span style="color: #000000; "><</span><span style="color: #000000; ">CLHLock, CLHNode</span><span style="color: #000000; ">></span><span style="color: #000000; "> UPDATER </span><span style="color: #000000; ">=</span><span style="color: #000000; "> AtomicReferenceFieldUpdater<br />                  . newUpdater(CLHLock.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">, CLHNode .</span><span style="color: #0000FF; ">class</span><span style="color: #000000; "> , </span><span style="color: #000000; ">"</span><span style="color: #000000; ">tail</span><span style="color: #000000; ">"</span><span style="color: #000000; "> );<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> lock(CLHNode currentThread) {<br />        CLHNode preNode </span><span style="color: #000000; ">=</span><span style="color: #000000; "> UPDATER.getAndSet( </span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread);<br />        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(preNode </span><span style="color: #000000; ">!=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">) {</span><span style="color: #008000; ">//</span><span style="color: #008000; ">已有¾U¿ç¨‹å ç”¨äº†é”åQŒè¿›å…¥è‡ªæ—?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            </span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(preNode.isLocked ) {<br />            }<br />        }<br />    }<br /><br />    </span><span style="color: #0000FF; ">public</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">void</span><span style="color: #000000; "> unlock(CLHNode currentThread) {<br />        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> å¦‚果队列里只有当前线½E‹ï¼Œåˆ™é‡Šæ”‘Ö¯¹å½“前¾U¿ç¨‹çš„引用(for GCåQ‰ã€?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (</span><span style="color: #000000; ">!</span><span style="color: #000000; ">UPDATER .compareAndSet(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">, currentThread, </span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)) {<br />            </span><span style="color: #008000; ">//</span><span style="color: #008000; "> ˜q˜æœ‰åŽç®‹¾U¿ç¨‹</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">            currentThread. isLocked </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">false</span><span style="color: #000000; "> ;</span><span style="color: #008000; ">//</span><span style="color: #008000; "> æ”¹å˜çŠ¶æ€ï¼Œè®©åŽ¾l­çº¿½E‹ç»“束自æ—?/span><span style="color: #008000; "><br /></span><span style="color: #000000; ">        }<br />    }<br />}</span></div><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><br /></p><h3>CLHé”?ä¸?MCSé”?的比è¾?/h3><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">下图是CLH锁和MCS锁队列图½Cºï¼š<br /><img src="http://coderbee.net/wp-content/uploads/2013/11/CLH-MCS-SpinLock.png" alt="CLH-MCS-SpinLock" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; max-width: 100%; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(0, 0, 0, 0.2) 0px 1px 4px;" /></p><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;">差异åQ?/p><ol style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; list-style-position: outside; list-style-image: initial; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从代码实现来看,CLH比MCS要简单得多ã€?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从自旋的条äšg来看åQŒCLH是在本地变量上自旋,MCS是自旋在其他对象的属性ã€?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">从链表队列来看,CLH的队列是隐式的,CLHNodeòq¶ä¸å®žé™…持有下一个节点;MCS的队列是物理存在的ã€?/li><li style="margin: 0px 0px 0px 2.571428571rem; padding: 0px; border: 0px; vertical-align: baseline;">CLH锁释放时只需要改变自å·Þqš„属性,MCS锁释攑ֈ™éœ€è¦æ”¹å˜åŽ¾l§èŠ‚ç‚¹çš„å±žæ€§ã€?/li></ol><p style="margin: 0px 0px 1.714285714rem; padding: 0px; border: 0px; vertical-align: baseline; line-height: 24px; color: #444444; font-family: 'Open Sans', Helvetica, Arial, sans-serif; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">注意åQšè¿™é‡Œå®žçŽ°çš„é”éƒ½æ˜¯ç‹¬å çš„åQŒä¸”不能重入的ã€?/strong></p><img src ="http://www.aygfsteel.com/DLevin/aggbug/416102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2015-08-07 00:18 <a href="http://www.aygfsteel.com/DLevin/archive/2015/08/07/416102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet中web.xml配置文äšg(è½?http://www.aygfsteel.com/DLevin/archive/2014/05/18/413796.htmlDLevinDLevinSat, 17 May 2014 16:43:00 GMThttp://www.aygfsteel.com/DLevin/archive/2014/05/18/413796.htmlhttp://www.aygfsteel.com/DLevin/comments/413796.htmlhttp://www.aygfsteel.com/DLevin/archive/2014/05/18/413796.html#Feedback1http://www.aygfsteel.com/DLevin/comments/commentRss/413796.htmlhttp://www.aygfsteel.com/DLevin/services/trackbacks/413796.html阅读全文

DLevin 2014-05-18 00:43 发表评论
]]>
【è{】一个不错的eclipse反编译插ä»?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390685.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Fri, 02 Nov 2012 07:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390685.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/390685.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390685.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/390685.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/390685.html</trackback:ping><description><![CDATA[在CSDN论坛上看到的一个不错的eclipse反编译插ä»Óž¼Œæ„Ÿè§‰çœ‹è“v来不错的样子åQŒå› è€Œè®°ä¸‹ï¼ŒåŽŸç½‘å€æ˜¯ï¼š<a >http://topic.csdn.net/u/20121030/14/CDE52930-BAF2-4F88-B751-3797A7EB3C44.html</a><br /><br />闲暇之余åQŒå†™äº†ä¸€ä¸ªEclipse下的Java反编译插ä»Óž¼šEclipse Class DecompileråQŒæ•´åˆäº†ç›®å‰æœ€å¥½çš„2个Java反编译工具Jadå’ŒJD-CoreåQŒåƈ且和Eclipse Class Viewer无缝集成åQŒèƒ½å¤Ÿå¾ˆæ–¹ä¾¿çš„ä‹É用本插äšg查看¾cÕdº“源码åQŒä»¥åŠé‡‡ç”¨æœ¬æ’äšg˜q›è¡ŒDebug调试ã€?br /><br /><strong sizset="44" sizcache="0">Eclipse Class Decompiler插äšg更新站点åQ?<a title="http://feeling.sourceforge.net/update" target="_blank">http://feeling.sourceforge.net/update</a></strong><br /><br />直接使用Eclipse˜q›è¡Œæ›´æ–°åQŒæ”¯æŒEclipse 3.x, 4.xåQŒä¸ä¾èµ–ä»ÖM½•其他插äšgåQŒç›´æŽ¥å‹¾é€‰æ›´æ–°æ’件即可ã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/install.png" /><br /><br /><br />下图为Eclipse Class Decompiler的首选项™åµé¢åQŒå¯ä»¥é€‰æ‹©¾~ºçœçš„反¾~–è¯‘å™¨å·¥å…øP¼Œòq¶è¿›è¡Œå¾~–译器的基本讄¡½®ã€‚ç¼ºçœçš„åç¼–è¯‘å·¥å…·äØ“JD-CoreåQŒJD-Coreæ›´äØ“å…ˆè¿›ä¸€äº›ï¼Œæ”¯æŒæ³›åž‹ã€Enum、注解等JDK1.5以后才有的新语法ã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/preferences.png" /><br /><br />首选项配置选项åQ?br />1.重用¾~“存代码åQšåªä¼šå¾~–译一‹Æ¡ï¼Œä»¥åŽæ¯æ¬¡æ‰“开该类文äšgåQŒéƒ½æ˜„¡¤ºçš„æ˜¯¾~“存的反¾~–译代码ã€?br />2.忽略已存在的源代码:若未选中åQŒåˆ™æŸ¥çœ‹Classæ–‡äšg是否已绑定了Java源代码,如果已绑定,则显½CºJava源代码,如果未绑定,则反¾~–译Classæ–‡äšg。若选中此项åQŒåˆ™å¿½ç•¥å·²ç»‘定的Java源代码,昄¡¤ºåç¼–译结果ã€?br />3.昄¡¤ºåç¼–译器报告åQšæ˜¾½Cºå¾~–译器反¾~–è¯‘åŽç”Ÿæˆçš„æ•°æ®æŠ¥å‘ŠåŠå¼‚å¸æ€¿¡æ¯ã€?br />4.使用Eclipseä»£ç æ ¼å¼åŒ–å·¥å…øP¼šä½¿ç”¨Eclipse格式化工具对反编译结果重新格式化排版åQŒå¾~–译整个Jar包时åQŒæ­¤æ“ä½œä¼šæ¶ˆè€—一些时间ã€?br />5.使用Eclipse成员排序åQšä‹É用Eclipse成员排序对反¾~–译¾l“果重新格式化排版,反编译整个Jar包时åQŒæ­¤æ“ä½œä¼šæ¶ˆè€—大量时间ã€?br />6.以注释方式输出原始行号信息:如果Classæ–‡äšg包含原始行号信息åQŒåˆ™ä¼šå°†è¡Œå·ä¿¡æ¯ä»¥æ³¨é‡Šçš„æ–¹å¼æ‰“印到反¾~–译¾l“果中ã€?br />7.æ ÒŽ®è¡Œå·å¯šw½æºä»£ç ä»¥ä¾¿äºŽè°ƒè¯•åQšè‹¥é€‰ä¸­è¯¥é¡¹åQŒæ’件会采用AST工具分析反编译结果,òq¶æ ¹æ®è¡Œå·ä¿¡æ¯è°ƒæ•´ä»£ç é¡ºåºï¼Œä»¥ä¾¿äºŽDebug˜q‡ç¨‹ä¸­çš„单步跟踪调试ã€?br />8.讄¡½®¾cÕd¾~–译查看器作为缺省的¾cÀL–‡ä»¶ç¼–辑器åQšé»˜è®¤äؓ选中åQŒå°†å¿½ç•¥Eclipse自带的Class VieweråQŒæ¯‹Æ¡Eclipse启动后,默认使用本插件提供的¾cÀLŸ¥çœ‹å™¨æ‰“å¼€Classæ–‡äšgã€?br /><br /><br />插äšg提供了系¾lŸèœå•,工具栏,当打开了插件提供的¾cÕd¾~–译查看器后åQŒä¼š‹È€‹z»èœå•和工具栏选项åQŒå¯ä»¥æ–¹ä¾¿çš„˜q›è¡Œé¦–选项配置åQŒåˆ‡æ¢å¾~–译工具重新反编译,以及导出反编译结果ã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/MenuBar.png" /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/ToolBar.png" /><br /><br /><br />¾cÕd¾~–译查看器右键菜单包含了Eclipse自带¾cÀLŸ¥çœ‹å™¨å³é”®èœå•的全部选项åQŒåƈ增加了一ä¸?#8220;导出反编译源代码”菜单™åV€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/export.png" /><br /><br />打开™å¹ç›®è·¯å¾„下的Classæ–‡äšgåQŒå¦‚果设¾|®ç±»åç¼–译查看器为缺省的查看器,直接双击Classæ–‡äšg卛_¯åQŒå¦‚果没有设¾|®äØ“¾~ºçœæŸ¥çœ‹å™¨ï¼Œå¯ä»¥ä½¿ç”¨å³é”®èœå•˜q›è¡ŒæŸ¥çœ‹ã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/open.png" /><br /><br /><br />Eclipse Class Decompiler插äšg也提供了反编译整个Jaræ–‡äšg或者Java包的反编译。该操作支持Package Explorer对包昄¡¤ºå¸ƒå±€çš„æ“ä½œï¼Œå¦‚果是åã^铺模式布局åQŒåˆ™å¯¼å‡ºçš„æºä»£ç ä¸åŒ…含子包,如果是层¾U§æ¨¡å¼å¸ƒå±€åQŒåˆ™å¯¼å‡ºé€‰ä¸­çš„包及其所有的子包ã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/ExportPackage.png" /><br /><br /><br />Debug调试åQšå¯ä»¥åœ¨é¦–选项选中寚w½è¡Œå·˜q›è¡Œå•步跟踪调试åQŒå’Œæ™®é€šçš„包含源代码时的调试操作完全一è‡ß_¼ŒåŒæ ·çš„也可以讄¡½®æ–­ç‚¹˜q›è¡Œè·Ÿè¸ªã€?br /><br /><img alt="" src="http://www.aygfsteel.com/images/blogjava_net/cnfree/Debug.png" /><br /><img src ="http://www.aygfsteel.com/DLevin/aggbug/390685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-11-02 15:05 <a href="http://www.aygfsteel.com/DLevin/archive/2012/11/02/390685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【è{】Log4j/common log和各¿UæœåŠ¡å™¨é›†æˆçš„é—®é¢?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390639.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 01 Nov 2012 18:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390639.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/390639.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/11/02/390639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/390639.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/390639.html</trackback:ping><description><![CDATA[转自åQ?a >http://xinyanfei.blog.sohu.com/72361504.html</a><br />我从转到Java开发后åQŒä¸€ç›´åœ¨å¼€å‘Application ServeråQŒæ‰€ä»¥åŸºæœ¬æ²¡æœ‰å’Œå¤§åž‹çš„Web Server打过交道åQŒæ‰€ä»¥å…³äºŽcommon logging在这些server上部¾|²æ—¶é‡åˆ°çš„问题也只能是从理论上去解释。感觉这½‹‡æ–‡ç« ä»‹¾lçš„不错åQŒæ‰€ä»¥è{载过来ã€?br /><br /><span id="wmqeeuq" class="Apple-style-span" style="color: #62613b; font-family: Verdana, Arial, Helvetica, 宋体, sans-serif; line-height: 25px; ">  目前的很多商业和非商业的服务器中间äšg都默认集成了common-log甚至是log4j.因此当我门把我们的应用发布在上面的时å€?都会遇到关于logæ–šw¢çš„é—®é¢?<br style="line-height: 25px; " />  1.webshpere下面集成log4j.<br style="line-height: 25px; " />  "WebSphere的类装入器方式有两种方式åQšPARENT_FIRSTå’ŒPARENT_LAST。默认值是PARENT_FIRSTåQŒè¿™¿Uæ–¹å¼åœ¨è½½å…¥å½“前classpath的类之前先蝲入其上一¾U§classloader能够装入的类。这是标准的JVM classloader的默认策略。如果采用PARENT_LASTåQŒåˆ™˜q‡ç¨‹æ­£å¥½ç›¸ååQŒå³å…ˆè²å…¥å½“前classpath的类åQŒå†è½½å…¥å…¶ä¸Šä¸€¾U§classloader能够装入的类åQŒè¿™æ ·å¯ä»¥ç”¨å½“前classpath中更新的¾c»è¦†ç›–其上一¾U§classloader的相同类。受¾c»è£…入器方式影响的classloader包括application classloader、WAR classloader以及å…׃ín¾cÕdº“çš„classloaderã€?<br style="line-height: 25px; " /> å› äØ“websphere在共享类库的classloader中有一套common logging,但是¼‹®æ²¡æœ‰åˆé€‚配¾|®æ–‡ä»?如果我们把配¾|®æ­£¼‹®çš„log4j.propertiesæ–‡äšg攑֜¨å…׃ín¾cÕdº“ä¸?我们会发现log4j可以˜qè¡Œ.但还有另外一个很通用的方å¼?-改变webshpere的类库加载顺åº?我们让他先加载我们web应用所需的类åº?åÏxˆ‘们把web应用的加栽方式改为PARENT_LAST.<br style="line-height: 25px; " />  å“?ž®½ç®¡æˆ‘小心的提防,今天˜q˜æ˜¯ä¸­æ‹›äº?在我的配¾|®é‡Œ,log4j的配¾|®æ–‡ä»¶åªèƒ½è¯»å–一‹Æ?不能一个应用一个配¾|®æ–‡ä»?ä¸ÞZº†è®©å®ƒåŠ è²è‡ªå·±çš„é…¾|?可以自己å†?或者用springçš?servlet/listeneråŽÀL‰‹åŠ¨åŠ è½½è¿™ä¸ªé…¾|®æ–‡ä»?<br style="line-height: 25px; " /> 2.jboss下面的集成log4j<br style="line-height: 25px; " />  å¤§å®¶å¯èƒ½éƒ½æ›¾åœ¨äØ“jboss下面配置log4j郁闷˜q?jboss比webshpereèµ°çš„˜q˜è¿œ.无论你的™å¹ç›®æ˜¯å¦ä½¿ç”¨äº†log4j,jboss在自己启动的时候就已经˜qè¡Œä»–了.也就是说在jboss加蝲自己å…׃ín¾cÕdº“的时å€?已经è¯Õd–了自己log4j.xmlæ–‡äšg配置.˜q™ä¸ªæ–‡äšg在conf中可以找åˆ?å¦‚æžœä½ éœ€è¦äØ“ä½ çš„åº”ç”¨å•ç‹¬é…ç½®ä¸€ä¸ªcatagory,你需要直接在˜q™é‡Œé…ç½®åQ?br style="line-height: 25px; " />   åœ¨webloader装蝲应用的时å€?如果应用中有log4j的包,ä¼ég¹Žæ€Õd‡ºçްappender已被占用的问é¢?½W”者把log4j的包˜qžå¸¦åº”用中的log4j配置文äšg一òq¶ç§»åŽ?世界清净äº?<br style="line-height: 25px; " />关于ä¸ÞZº†è®©åº”用自带的log4j配置文äšg生效,有äh廸™®®ä¿®æ”¹<br style="line-height: 25px; " /> <attribute name="Java2ClassLoadingCompliance">false</attribute><br style="line-height: 25px; " />å’?br style="line-height: 25px; " /> <attribute name="UseJBossWebLoader">false</attribute><br style="line-height: 25px; " />˜q™ä¸¤ä¸ªå±žæ€§ï¼Ž<br style="line-height: 25px; " /> åQ“.sunone下面集成log4j<br style="line-height: 25px; " />    距离上次用SunOne服务器已¾lå¥½é•¿æ—¶é—´äº†,ä¼ég¹ŽsunOneçš„log有些¾cÖM¼¼jboss,也是一个服务器的log集中½Ž¡ç†.ç”׃ºŽä½¿ç”¨çš„不是很å¤?暂且在这里站个位å­?<br style="line-height: 25px; " />随手贴点关于log的信æ?<br style="line-height: 25px; " /><a style="line-height: 21px; color: #62613b; font: normal normal normal 12px/normal Verdana, Arial, Helvetica, 宋体, sans-serif; text-decoration: underline; ">http://wiki.apache.org/jakarta-commons/Logging/FrequentlyAskedQuestions</a><br style="line-height: 25px; " /><a style="line-height: 21px; color: #62613b; font: normal normal normal 12px/normal Verdana, Arial, Helvetica, 宋体, sans-serif; text-decoration: underline; ">http://www-128.ibm.com/developerworks/cn/websphere/library/techarticles/0408_baigang/part3.html</a></span><br /><img src ="http://www.aygfsteel.com/DLevin/aggbug/390639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-11-02 02:08 <a href="http://www.aygfsteel.com/DLevin/archive/2012/11/02/390639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【è{ã€‘äØ“ä»€ä¹ˆå¾ˆå¤šç¨‹åºå‘˜éƒ½é€‰æ‹©è·Ïx§½åQ?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/09/04/386964.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Tue, 04 Sep 2012 07:10:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/09/04/386964.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/386964.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/09/04/386964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/386964.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/386964.html</trackback:ping><description><![CDATA[<p sizset="27" sizcache="1">转自åQšé¾™é“­æ´ªåšå®¢ <a >http://blog.csdn.net/long892230</a><br /><br />今天看到一个帖子:“<a >½E‹åºå‘?/a>内部晋升­‘Šæ¥­‘Šå›°éš¾ï¼Œä½†æ˜¯å¤–部来的大P­‘Šæ¥­‘Šå¤šåQŒæ‰€ä»¥å¾ˆå¤šäh都选择è·Ïx§½”åQŒä¹‹åŽæˆ‘从三个方面简要的˜q›è¡Œäº†å›ž½{”:“外面来的æ€ÀL˜¯æœ‰åŒ…装的åQŒå†…部的都是肉èínPKåQŒæ­¤ä¸€è¾“;外面来的æ€ÀL˜¯ž®è‚¡äººé©¬åQŒå†…部的一æ‰Òމ¹çš„,升谁都伤感情åQŒæ­¤äºŒè¾“åQ›å¤–面来的通常都是大ä{推荐的,没有特别重大æœÞZ¼šåQŒäh不会来,内部的就不解释了åQŒæˆæžœéƒ½è¢«å¤§ä½¬å¸æ”Óž¼Œéš¾æœ‰æœÞZ¼šåQŒæ­¤ä¸‰è¾“”。之后讨è®ÞZ¸æ–­ï¼Œæˆ‘也余兴未了åQŒç‘ô¾l­å†™æ¥ã€?/p> <p>˜q™ä¸ªä¸–界上有一¾cÖMh特别苦é€û|¼Œè‹¦é€¼åˆ°ä»€ä¹ˆç¨‹åº¦å‘¢åQŸä»–们省吃ä„P用攒é’׃¹°æˆ¿ï¼Œ¾l“果房ä­h­‘Šæ¥­‘Šè´µåQ›å…¬å¸å¤–部竞争激烈,他们工作异常¾Jå¿™åQŒæŠ«æ˜Ÿæˆ´æœˆï¼Œæ—¥å¤ä¸€æ—¥ï¼›æŠ€æœ¯æ›´æ–°è¡Œä¸šç½•见,他们要随时调整心情,随时学习知识åQ›ä»–们长期和机器ä¸ÞZ¼åQŒå¤§å¤šæ¯”较呆傻,比较单纯åQ›è¿˜æœ‰å¾ˆå¤šä¸ä¸€ä¸€ä¾‹ä‹DåQŒè¿™ä¸€¾cÖMhž®±æ˜¯½E‹åºå‘˜ã€?/p> <p>而就是这么一¾cȝ¨‹åºå‘˜˜q‡ç€˜q™ä¹ˆè‹¦é€¼çš„生活åQŒåœ¨å…¬å¸å†…部却难以获得公òq³çš„æ™‹å‡æœÞZ¼šåQŒå¤–来的和尚æ€ÀL˜¯åœ¨ä¸æ–­æ‰“ç ´åã^衡,甚至是刚毕业的新和尚拿得都比老和ž®šå¤šåQŒè¿™æ˜¯å…¨è¡Œä¸šéƒ½ç½•见的奇观åQŒIT人有òq¸ç»åŽ†äº†ã€?/p> <p>某创业公司,某个½E‹åºå‘˜è¦¼›»èŒåQŒè€æ¿ç”šè‡³ä¸é—®é—®ä»–直接领导的意见,ž®±åŒæ„äº†åQŒæ²¡æœ‰æŒ½ç•™ï¼Œä¹‹åŽå¤§éª‚不忠诚,˜q™ä¸ªäººæ‹¿3kåQŒæ‹¿äº?òqß_¼Œä»–走了以后,老板ç”?k雇了个新面孔åQŒä½†ž®±æ˜¯ä¸æ„¿æ„ç»™˜q™ä¸ªè€äh晋升åQŒä¸æ„¿æ„¾l™åŠ åˆ°å“ªæ€•æ˜¯4kã€?/p> <p>某上市公司,游戏部门½Hç„¶ä»Žå¤–部空降了一个领å¯û|¼ŒåŽŸå› æ˜¯åŽŸå¤§ä{被挖èµîC»¥åŽï¼Œå‰©ä¸‹çš„äh升谁都有意见åQŒéš¾ä»¥æœä¼—,不从外部请äh来镇不住局面,˜q™ä¸ªäºÞZ¸€æ¥ï¼Œå¤§å®¶æ˜¯å›¢¾l“了åQŒå›¢¾l“è“v来和˜q™ä¸ªäººæ–—åQŒä½†æœ€åŽè¿˜æ˜¯å’Œè§£äº†ã€?/p> <p>某国际大公司åQŒæŸäºÞZ¼ªé€ ç®€åŽ†ï¼ŒåŒ…è£…çš„å¦‚èŠ×ƒ¼¼çŽ‰ï¼ŒèŽ·å¾—é«˜èŒåQŒå·¥ä½œä¸»è¦æœ‰ä¸‹å±žå®ŒæˆåQŒä»–只需要汇众汇报即可,­‘ŠæØœè·¯è¶Šå®½ï¼Œç›´åˆ°æŸå¤©äº‹å‘åQŒä¾ç„¶æ˜¯é«˜å®˜ã€?/p> <p sizset="28" sizcache="1">某IT企业åQŒæŸæ¸…华同学¼›»èŒæ—¶è¯­é‡å¿ƒé•¿çš„å¯ÒŽˆ‘è¯ß_¼ŒXXåQˆå¯ä»¥ç†è§£äØ“¾|‘游åQŒæœç´¢ï¼Œç”µå•†ä»ÀL„ä¸€¿Uï¼‰æ˜?0-02òq´æ¯•业的˜q™äº›äººæ¸…华äh的机会,我们ž®±æ˜¯æ¯”某人强十倍也没有æœÞZ¼šåQŒä¹Ÿå¾—从下面做è“våQŒæœç´¢çš„天时不属于我åQŒæ­¤äººåŽ»äº†æŸé‡‘èžåˆ†æžè½¯äšg公司åQŒç›®å‰æ˜¯é«˜ç®¡åQŒåŒæœŸç•™åœ¨æŸ<a href="http://http//blog.csdn.net">IT</a>企业的其他同学依然过着苦逼的生活ã€?/p> <h3>举了˜q™ä¹ˆå¤šä¾‹å­ï¼Œæˆ‘æƒ³è¯´å¾—æ˜¯äØ“ä»€ä¹ˆä¸¾l™ä½ æ™‹å‡˜q™ä¸ªé—®é¢˜åQŒæˆ–者晋升很难,ä¸ÞZ»€ä¹ˆï¼Ÿ</h3> <p><strong>1åQ‰å¤§ä½¬çš„问题</strong></p> <p>你晋升困难,最大的主观原因在你自己åQŒæœ€å¤§çš„客观原因在你的直接上司。付责ä“Q人的è¯ß_¼Œç›®å‰å¾ˆå¤šä¼ä¸šçš„领导是不合格的åQŒä»–们大å¤?0后,没有ä¸ÞZ»–人着想的思想基础åQŒä¸€å‘³çš„考虑自己åQŒä¸™å¾ä¸‹å±žï¼Œæ›„¡»æˆ‘对某ähè¯ß_¼Œä½ è¯´ä½ æ˜¯åˆæ ¼çš„领å¯û|¼Œä½ è¯´å‡ÞZ½ ä¸‹å±žæ¯ä¸ªå‘˜å·¥¿UŸæˆ¿åœ¨å“ªé‡Œï¼Œæ¯æœˆå¤šå°‘房租åQŒæˆ‘ž®±åŒæ„ä½ æ˜¯åˆæ ¼çš„领导åQŒç»“果他¾Ÿžæ„§ä¸è¨€ã€‚你晋升不了åQŒå¾ˆå¤§ç¨‹åº¦ä¸Šæ˜¯ä½ çš„领导没有帮你,˜qžä½ æ¯æœˆæˆ¿ç§Ÿå¤šå°‘都不知道åQŒä½ æŒ‡æœ›ä»–帮助你提高技术水òq»I¼Œå¸®åŠ©ä½ æ™‹å‡ï¼Ÿ</p> <p><strong>2åQ‰å¤§ä½¬çš„大ä{的问é¢?/strong></p> <p>你大佬的大ä{åQŒlevel很高åQŒä»–需要引入新鲜血æ¶ÔŒ¼Œä»–知道这个队伍缺什么,˜q™ä¸ªæ˜¯ä»–思考的问题åQŒä»–需要找牛的人来补这个缺口,于是一个光鲜照人的牛äh˜q›æ¥äº†ï¼ˆè™½ç„¶ä¸¤å¹´åŽä¹Ÿä¼šæ³¯ä¸ÞZ¼—人)¾l™é˜Ÿä¼å¸¦æ¥äº†æ–°é²œçš„è¡€æ¶ÔŒ¼Œä½†ä½ çš„大佬升不上去,你大佬边上的位置被这个äh占了åQŒä½ çš„位¾|®åœ¨å“ªï¼Ÿ</p> <p><strong>3åQ‰å…¬å¸çš„问题</strong></p> <p>各大企业¾l™å‘˜å·¥çš„再教育和培训都是不尽相同的,但大多口åäh˜¯ä¸€è‡´çš„åQŒåœ¨å·¥ä½œä¸­é”»ç‚¼æˆé•¿ï¼Œ˜q™å¥è¯æ˜¯æœ€æ‰¯æÙE的,国外很多大公司是有很完善的培训和再教育计划的åQŒä¼š¾l™å‘˜å·¥ä¸€ä¸ªå……ç”늚„æœÞZ¼šåQŒåƈ且给其一个完善的培训后,以便于让他在新升职的岗位上能够很好的胜ä“Q。在国内大公叔Rƒ½åœ¨æ‰¾ç‰›ähåQŒå°±æ˜¯ä¸æ„¿æ„è‡ªå·±åŸ¹å…»åQŒåŽŸå› æ˜¯ä»€ä¹ˆï¼Œä¸è§£é‡Šï¼Œä½ æ‡‚å¾—ã€?/p> <p><strong>4åQ‰ä½ çš„å…„å¼?/strong></p> <p>å¾ˆå¤šæ—¶å€™è®©ä½ å‡ä¸äº†èŒæ°æ°æ˜¯å› äØ“å’Œä½ ä¸€èµähˆ˜æ–—的兄弟åQŒä»–们工作也很不错,你升职了åQŒä»–们怎么办?˜q™ä¹Ÿæ˜¯ä¸€ä¸ªåã^衡的问题åQŒä½ å¾ˆåŠªåŠ›ï¼Œä¸ÞZ»€ä¹ˆä½ æ²¡æœ‰å¸¦åŠ¨ä½ çš„å…„å¼Ÿä¸€èµ·åŠªåŠ›ï¼Œä½ ä¸ŠåŽÖMº†åQŒéœ€è¦ä½ ˜q™å¸®å…„弟的支持,他们会支持你吗?曾有一个说了一句话åQŒæˆ‘觉得很值得回味åQ?#8220;当大安™ƒ½è®¤äؓ你该升职了,ž®±æ˜¯ä½ å‡èŒçš„æ—¶å€™äº†”åQŒç»†¾l†å“å‘»I¼Œå¾ˆæœ‰é“理ã€?/p> <p><strong>5åQ‰ä½ è‡ªå·±çš„é—®é¢?/strong></p> <p>最后你升不了职是你自己的问题,每天工作很忙åQŒæ²¡æ—‰™—´å……电åQŒæ¯å¤©å·¥ä½œåŽ‹åŠ›å¾ˆå¤§ï¼Œæ¥ä¸åŠå­¦ä¹ ï¼Œæ¯å¤©˜q™ä¸ªé‚£ä¸ªåQŒä¸€òq´ä¸‹æ¥ç¢Œ¼„Œæ— ä¸ºã€‚你提高了自å·Þqš„æ•ˆçŽ‡äº†å˜›åQŸä½ å‘¨å›´æœ‰æœ‹å‹å†å¸®ä½ å—?你知道你要学什么嘛åQŸä½ çŸ¥é“什么样的工作才能超出领导的期望?åQŒä½ ­‘…出领导期望后却没有升职和领导沟通过吗?我曾在某企业åQŒæˆ‘周围的几乎所有äh加薪升职都是和领导沟通后才获得的。指望主动给你加薪升职,不如指望自己的沟通ã€?/p> <p><strong>6åQ‰è¿˜æ˜¯ä½ è‡ªå·±çš„é—®é¢?/strong></p> <p>你选择的这个行业是不是对的åQŒå…¬å¸æ˜¯ä¸æ˜¯å¯¹çš„åQŒå°±å¥½åƒæˆ‘说的这个清华的同学˜q™ä¸ªä¾‹å­ã€‚如果你能耐大可以选大公司åQŒPKåˆîC¸€¼œ¨ç‰›äºÞZ¸ŠåŽ»ï¼Œå¦‚æžœä½ èƒ½è€ä¸å¤§ï¼ŒåŽÀLˆç†Ÿå¤§å…¬å¸åQŒè¿˜å¿ƒç†æœŸç›¼é«˜è–ªå‡èŒž®×ƒ¸çŽ°å®žäº†ï¼Œä¸å¦‚åŽÖM¸€ä¸ªæœ‰å‰é€”的中小公司åQŒå¼€åˆ›è‡ªå·Þqš„事业ã€?/p> <h3>从企业角度出发,如何创徏一个合理公òq³çš„æ™‹å‡æœºåˆ¶å‘¢ï¼Ÿ</h3> <p>1åQ‰ç¬¬ä¸€‹¹å¤§ä½¬æ‰ä¼šæ‹›½W¬ä¸€‹¹çš„人,½W¬äºŒ‹¹å¤§ä½¬åªä¼šæ‹›½W¬ä¸‰‹¹çš„人,因此公司一把手必须是第一‹¹çš„åQŒä­h倯D§‚才能靠谱åQŒåˆ¶åº¦æ‰é è°±åQŒæ²¡ç†Ÿè¯»åŽ†å²åQŒä¸ç†è§£ä¸­å›½æ–‡åŒ–çš„ï¼Œå»ø™®®ä¸è¦åšå…¬åæ€¸€æŠŠæ‰‹ã€?/p> <p>2åQ‰æ™‹å‡çš„制度必须公åã^åQŒé¢å‘每一个ähåQŒæ¯ä¸€ä¸ªå±‚‹Æ¡ï¼Œ˜q™å¾€å¾€å¾ˆéš¾åšåˆ°åQŒåšå‰ç«¯çš„和做后台的不好比,但做前端的可以和做前端的比。必™å»è¦æœ‰å…¬å¼€å…¬åã^的比æ‹û|¼Œå·²èŽ·å¾—å‡èŒæœºä¼šã€‚ä¾‹å¦‚æŸå…¬å¸åšä¸€ä¸ªé«˜¾l´çŸ©é˜µåˆ†è§£çš„éšùN¢˜åQŒå¤§å®¶æœºä¼šå‡½{‰ï¼Œæ€§èƒ½æœ€å¿«ï¼Œæ•ˆæžœæœ€å¥½ï¼Œèƒœå‡ºè€…升职,带领团队ã€?/p> <p>3åQ‰é¼“励公司职员交‹¹ï¼Œä¼ æ’­å’Œå¸®åŠ©ä»–äººçš„æ–‡åŒ–åQŒä¸€ä¸ªäh如果乐于助ähåQŒå¸®åŠ©ä»–äººæé«˜æŠ€æœ¯æ°´òq»I¼Œ˜q™ä¸ªäººå‡èŒå‡ä¸Šæ¥åQŒå¤§å®‰™ƒ½ä¼šé¡¶åQŒåä¹‹ï¼Œä½ ä¿å®ˆï¼Œä¸å¸®åŠ©ä»–äººï¼Œæ°´åã^再牛åQŒå‡èŒä¸Šæ¥ä¹Ÿæ²¡äh支持ã€?/p> <p>4åQ‰å¯ä»¥ç»™èŒå‘˜ä¸€äº›æŒ‘战的æœÞZ¼šåQŒæä¾›æ›´å¤šçš„资源åQŒæ¯”如某公司的闪电计划,­‘…越了谷歌搜索效果,ž®±æ˜¯ä¸€ä¸ªå¾ˆå¥½çš„例子åQŒè¦æ•¢äºŽ¾l™ä¸€äº›å‹‡äºŽæŒ‘战的职员更多的资源,在严é…ïLš„æˆ˜æ–—中考验åQŒåƈ提供充分弹药ã€?/p> <p>5åQ‰ç»™äºˆå†…è®­æœºä¼šï¼Œé‚€è¯·ä¸šç•Œç‰›äºø™®²åº§ï¼Œé€èŒå‘˜åŽ»¾ŸŽå¸è€ƒå¯Ÿå¼€ä¼šä¹ƒè‡›_·¥ä½œç­‰½{‰ã€‚培训机会是发达国家企业的一¿Uéžå¸¸å¥½çš„æ¿€åŠ±æŽªæ–½ï¼Œä¸€ä¸ªå²—ä½?个äh培训åQŒæœ€å¥½çš„上岗åQŒè¿™æ˜¯ä¸€ä¸ªå¾ˆå…¬åã^的机会,培训机构­‘›_¤Ÿç‹¬ç«‹ã€?nbsp;  <br />æ–ÒŽ³•有很多,只要˜q™ç¬¬ä¸€‹¹çš„大ä{åQŒå¿ƒä¸­æœ‰ç€˜q™å¸®æ‰“生打死的兄弟,办法æ€ÀL˜¯æœ‰çš„åQŒä¸è¦æ€ÀL˜¯è€ƒè™‘自己的业¾l©ï¼Œè€ƒè™‘自己的乌¾U±å¸½åQŒåšåˆ°è¿™ä¸€ç‚¹å¾ˆéš‘Ö¾ˆéš¾ï¼Œä½†åˆ¶åº¦ä¸æ˜¯åªæœ‰è¿™ä½å¤§ä½¬å¯ä»¥åˆ¶å®šï¼Œä»ÖM½•职员都应该积极投íw«åˆ°åˆ¶åº¦å»ºç«‹çš„过½E‹ä¸­åQŒè¦æ•¢äºŽæå‡ºè‡ªå·±çš„观点,毕竟公司是大家的公司ã€?/p> <p sizset="29" sizcache="1">我就写这么多åQŒæˆ‘是一个十òq´ä¸€¾U?strong sizset="29" sizcache="1"><a >½E‹åºå‘?/a></strong>çš„èín份写˜q™ç¯‡åšå®¢çš„ï¼Œæˆ‘åŠªåŠ›åšåˆ°å®¢è§‚ï¼Œä½†æˆ‘ç›æ€¿¡æˆ‘更多代表的是劳方立场ã€?/p><img src ="http://www.aygfsteel.com/DLevin/aggbug/386964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-09-04 15:10 <a href="http://www.aygfsteel.com/DLevin/archive/2012/09/04/386964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>20世纪《福布斯》二十本最具媄响力的商业书¾c?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/07/12/368317.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Thu, 12 Jul 2012 03:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/07/12/368317.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/368317.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/07/12/368317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/368317.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/368317.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="floatright"><span><a class="image" title="" ><div><div><br /><a >http://docs.huihoo.com/java/jmx/jmx_base.html</a></div>http://blog.csdn.net/honno/article/details/1798476</div><img alt="" src="http://wiki.mbalib.com/w/images/3/37/Most_Influential_Business_Books.jpg" width="185" longdesc="/wiki/Image:Most_Influential_Business_Books.jpg" height="97" /></a></span></div> <p>  ã€?a title="¼›å¸ƒæ–? >¼›å¸ƒæ–?/a>》杂志评å‡ÞZº†ä¸Šä¸ªä¸–纪末最具媄响力的二十本商业书籍。上世纪70òq´ä»£æœ«ï¼Œ¾ŸŽå›½¾læµŽé™·å…¥è¡°é€€çš„阵痛期åQŒæ¥è‡ªé˜¿æ‹‰ä¼¯ä¸–界的石油威胁及来自日本的经‹¹ŽåŽ‹åŠ›ä‹É¾ŸŽå›½äººçš„æ—¥å­å¾ˆä¸å¥½è¿‡åQŒå•†ä¸šä¹¦¾cä¹Ÿå› æ­¤è¢«å°˜ž®ä¸€æ—¶ã€‚但在接下来çš?0å’?0òq´ä»£åQŒç¾Žå›½ç»‹¹Žä¿æŒäº†äºŒåòq´çš„æŒç®‹å¢žé•¿åQŒä¸€å¤§æ‰¹ä¼˜ç§€çš?a title="CEO" >CEO</a>å¦?a title="比尔·ç›–茨" >比尔·ç›–茨</a>ã€?a title="æ?#183;艄¡§‘å? >æ?#183;艄¡§‘å?/a>ã€?a title="唐纳å¾?#183;ç‰ÒŽœ—æ™? >唐纳å¾?#183;ç‰ÒŽœ—æ™?/a>åQŒå‡ºçŽ°åœ¨äºÞZ»¬çš„视野中。商业书¾cçš„出版和发行也因此½Iºå‰‹z»è·ƒåQŒæœ¬‹Æ¡è¯„出的二十本书按类别分为管理类、叙事类、投资类及传记类。它们分别是åQ?</p> <p>  <strong>汤姆·å½¼å¾—斯错了吗åQ?/strong> </p> <p>  ½Ž¡ç†¾cÖM¹¦¾cåœ¨æ•´ä¸ªæŽ’行榜上所占的比重最大,其中<a title="汤姆·å½¼å¾—æ–? >汤姆·å½¼å¾—æ–?/a>(<a title="Thomas Peters" >Thomas Peters</a>)çš?a title="《追求卓­‘Šã€? >《追求卓­‘Šã€?/a>高居榜首。这本书出版äº?982òqß_¼Œæœ€å¼€å§‹æºè‡ªè‘—名的咨询公司<a title="麦肯é”? >麦肯é”?/a>的一个内部项目。当时的¾ŸŽå›½å•†ä¸šç•Œæ­£å€å—日本公司咄咄é€égh的扩张姿态的困扰åQŒæ—¥æœ¬å…¬å¸æ™®éé‡‡ç”¨çš„严格çš?a title="制度化管ç? >制度化管ç?/a>让这个战败国的经‹¹Žè¿…速崛赗÷€‚面对强烈个äºÞZ¸»ä¹‰ç²¾¼œžçš„员工åQŒç¾Žå›½å…¬å”R¢†å¯¼æˆäº†è¢«é•¿æœŸè®¥ç¬‘的低能者ã€?a title="汤姆·å½¼å¾—æ–? >汤姆·å½¼å¾—æ–?/a>ä¸?a title="¾|—伯ç‰?#183;沃特æ›? >¾|—伯ç‰?#183;沃特æ›?/a>的《追求卓­‘Šã€‹æˆäº†ç¾Žå›½å•†ä¸šçš„æ‹¯æ•‘者。这本书为管理设定了一个积极的目标åQŒè€Œéžå¼ø™°ƒé¢äÍ的难题。彼得斯提出的杰å‡ÞZ¼ä¸šçš„ 8ä¸ªç‰¹æ€§å‡ ä¹ŽäØ“æœªæ¥20òq´çš„商业½Ž¡ç†å¥ å®šäº†æ ¼å±€åQ?</p> <p>  1.偏好行动而不是沉æ€?</p> <p>  2.在äñ”品和服务上接˜q‘顾客的需æ±?</p> <p>  3.鼓励自治和放松,而不是紧密监ç?</p> <p>  4.寚w›‡å‘˜çš„æ€åº¦æ˜¯é¼“励其生äñ”力,避免“我们”å’?#8220;他们”˜q™ç§å¯¹ç«‹æƒ…çÈA </p> <p>  5.以一¿Uè¢«¿UîCØ““<a title="走动式管ç? >走动式管ç?/a>”保持与大家的紧密接触 </p> <p>  6.“专注于自íw?#8221;以保持商业优势,因此避免了无关的风险 </p> <p>  7.¾l„织¾l“æž„½Ž€‹zï¼Œäººå‘˜¾_‘Ö¹² </p> <p>  8.对目标同时保持松紧有度的ç‰ÒŽ€§ï¼Œä½†å´ä¸çª’息创新的控制¾pȝ»Ÿã€?</p> <p>  今日的企业领袖没有äh不承认深受汤å§?#183;彼得斯原则的影响。《追求卓­‘Šã€‹æˆä¸ºç¬¬ä¸€æœ¬é”€é‡è¶…˜q‡ç™¾ä¸‡çš„商业书籍åQŒè¿™æœ¬ä¹¦ç”šè‡³ä¿ƒæˆäº†å•†ä¸šä¹¦¾cå‡ºç‰ˆä¸šçš„æˆç†Ÿã€‚汤å§?#183;彼得斯也成了一位标志性的明星人物ã€?</p> <p>  今日的汤å§?#183;彼得斯已¾lå¤±åŽÖMº†æœ€åˆçš„光彩åQŒäh们甚臛_¼€å§‹é—忘他了。在《追求卓­‘Šã€‹å‡ºç‰?0周年之际åQŒæ±¤å§?#183;彼得斯亲自撰文,讲述他写˜q™æœ¬ä¹¦çš„初衷和过½E‹ï¼Œä»–的观点对在哪里åQŒé”™åœ¨å“ªé‡Œï¼Œä»–承认当时自å·Þp¯´äº†ä¸€äº›è°Žè¯ã€‚å¯¹äºŽè¯•å›¾äØ“å•†ç•Œ¼‹®å®šæœªæ¥æ—¥ç¨‹çš„精英来è¯ß_¼Œã€Šè¿½æ±‚卓­‘Šã€‹èƒŒåŽçš„æ•…事提供了一¾pÕdˆ—不可多得的教训。此书引导的潮流向我们展½CÞZº†20òq´æ¥å•†ä¸šä¸–界急剧变化的生动图景ã€?</p> <p>  “我们忘了贴一个警告标½{¾ã€‚注意!没有永恒的东è¥Ñ€‚ä“Q何东西吃得太多都会有毒。请è®îC½åQšå•†ä¸šä¸­æ‰€æœ‰äº‹æƒ…éƒ½æ˜¯æ‚–è®ºã€‚äØ“è¾‘Öˆ°˜q½æ±‚åQŒå¿…™åÀLŒä¹‹ä»¥æ’。而当你持之以恒之æ—Óž¼Œä½ å°±å®ÒŽ˜“受到æ”Õd‡»ã€‚你看,˜q™å°±æ˜¯æ‚–论。面对它吧!”˜q™æ˜¯æ­¤ä¹¦å‡ºç‰ˆ20òq´ä¹‹åŽæ±¤å§?#183;彼得斯的再一‹Æ¡è¡¨ç™½ï¼Œ“卓越只是一¿Uè¿‡äºŽé™æ€çš„观念åQŒè€Œä¸–界实在变化太快了ã€?#8221; </p> <p>  <strong>好公司能否变成卓­‘Šå…¬å?/strong> </p> <p>  排名½W¬äºŒçš„æ˜¯<a title="吉姆·æŸ¯æž—æ–? >吉姆·æŸ¯æž—æ–?/a>(<a title="James C. Collins" >James C. Collins</a>)å’?a title="杰里·æ³¢æ‹‰æ–? >杰里·æ³¢æ‹‰æ–?/a>(<a title="Jerry I. Porras" >Jerry I. Porras</a>)的著ä½?a title="《基业长青ã€? >《基业长青ã€?/a>。在书中作者对那些有见识有˜qœè§çš„公司进行了介绍。许多ähè®¤äØ“ä¸€é—´å…¬å¸çš„æŒç®‹æˆé•¿ä¾èµ–äºŽå‡ ä½ä¼˜¿U€çš?a title="CEO" >CEO</a>的持¾l­è¿ä½œï¼Œä½†æœ¬ä¹¦çš„作者却告诉äºÞZ»¬åQŒå¯¹ä¸€ä¸ªä¼ä¸šè€Œè¨€åQŒä¸€¾Ÿ¤èªæ˜Žäh在维持现状的基础上敢于进行新ž®è¯•比拥有一个有™ì…力的领袖更重要åQŒè€Œæ‹¥æœ‰ä¸€ä¸ªæ ¸å¿ƒçš„理念òq¶äؓ之奋斗则是企业的关键所在ã€?</p> <p>  <a title="吉姆·æŸ¯æž—æ–? >吉姆·æŸ¯æž—æ–?/a>的另一本书<a title="《从优秀到卓­‘Šã€? >《从优秀到卓­‘Šã€?/a>同样榜上有名ã€?</p> <p>  <a title="《基业长青ã€? >《基业长青ã€?/a>˜q™æœ¬ä¹¦ç ”½I¶äº†18个基业常青公司的成功¾léªŒã€‚这些公司包æ‹?a title="沃尔çŽ? >沃尔çŽ?/a>ã€?a title="惠普" >惠普</a>ã€?a title="宝洁" >宝洁</a>ã€?a title="3M" >3M</a>å’?a title="索尼" >索尼</a>½{‰è¡Œä¸šé¢†è¢–,本书研究的是事äšgåQŒæ˜¯äººæ€§ã€‚作者从人的角度让我们看åˆîCº†å…¬å¸çš„æˆé•¿å’Œå·©å›ºã€‚作者分析的是公司、组¾l‡ä»¥åŠäh在组¾l‡ä¸­çš„作用。作者从公司的角度分析了使得企业长远发展的优势,以此分析企业取得˜q™äº›ä¼˜åŠ¿òq‰™•¿æœŸå‘展的原因。企业在发展˜q‡ç¨‹ä¸­å¿…™åÖM¸æ–­è‡ªæˆ‘改革、自我反省来辑ֈ°˜q™äº›ä¼˜åŠ¿åQŒä‹É其成为公司特性,从而保证长久发展ã€?</p> <p>  ä¸ÞZº†˜q›ä¸€æ­¥æŽ¢å¯»é‚£äº›ä¼˜¿U€çš„公司走向不同发展道路的因素åQ?001òqß_¼Œ<a title="吉姆·æŸ¯æž—æ–? >吉姆·æŸ¯æž—æ–?/a>又出版了一本《从优秀到卓­‘Šã€‹ï¼Œ˜q™æœ¬ä¹¦å¯è¯´æ˜¯ã€ŠåŸºä¸šé•¿é’》的姊妹½‹‡ã€‚还在出版《基业长青》之æ—Óž¼ŒæŸ¯æž—斯就提出åQŒå¥½çš„公司能否变成卓­‘Šçš„公司åQŸå¦‚果能够,他们如何才能实现呢?之后åQŒä»–们对1400多个公司˜q›è¡Œäº†ç ”½IÓž¼Œæœ€åŽå¾—å‡ÞZº†¾l“论åQŒè¿™æ˜¯å¯ä»¥è¾¾åˆ°çš„。那些由优秀的公司变ä¸ÞZ¼Ÿå¤§å…¬å¸çš„ä½ég½¼è€…åÆˆä¸ä¸€å®šéƒ½æ‹¥æœ‰æœ€æ–°çš„æŠ€æœ¯ã€æœ€æ“…é•¿½Ž¡ç†çš„CEOåQŒä»–们最有力的武器是他们的公司文化,一¿Uæ¿€åŠ±æ¯ä¸ªäh都按照他们想要的方式åŽÕd·¥ä½œçš„æ–‡åŒ–。综合这两本书,我们已经知道如何ç”׃¸€ä¸ªä¼˜¿U€çš„公司发展成ä¸ÞZ¸€ä¸ªå“­‘Šçš„公司åQŒè¿™äº›å…¬å”Rƒ½æ˜¯ç»åŽ†äº†æ—‰™—´è€ƒéªŒçš„。那些正在变革的路口åQŒä¸çŸ¥è¦åŽÕd‘何方的公司或许能在科林斯的书中找åˆîC¸€äº›æ½Cºå’Œæ–¹å‘ã€?</p> <p>  <strong>《公司再造》潮‹¹çš„赯‚½</strong> </p> <p>  《追求卓­‘Šã€‹å’Œã€ŠåŸºä¸šé•¿é’》集中介¾lä¼ä¸šå¦‚何取得超人的成就åQŒè€ŒæŽ’名第三的<a title="《公司再造ã€? >《公司再造ã€?/a>(<a title="Reengineering the CorporationåQšA Manifesto for Business Revolution" >Reengineering the CorporationåQšA Manifesto for Business Revolution</a>)则聚焦在企业如何˜q›è¡Œè‡ªæˆ‘攚w€ ã€‚书中研½I¶äº†<a title="¼›ç‰¹" >¼›ç‰¹</a>ã€?a title="IBM" >IBM</a>å?a title="贝尔公司" >贝尔公司</a>çš„æ¡ˆä¾‹åÆˆä»‹ç»äº†ç›¸å…³çš„æˆåŠŸ¾léªŒã€?</p> <p>  1993òqß_¼Œ<a title="˜qˆå…‹ž®?#183;汉默" >˜qˆå…‹ž®?#183;汉默</a>(<a title="Michael Hammer" >Michael Hammer</a>)ä¸?a title="James Champy" >James Champy</a>出版äº?a title="《企业再造ã€? >《企业再造ã€?/a>一书,¾pȝ»Ÿé˜è¿°äº?a title="BPR" >BPR</a>(Business Process Reengineering)的思想åQŒæå‡ºå†é€ ä¼ä¸šçš„首要ä»ÕdŠ¡æ˜¯BPRåQŒåªæœ‰å¾è®‘Ö¥½BPRåQŒæ‰èƒ½ä‹É企业å½Õdº•摆脱困境。至此,BPRä½œäØ“ä¸€¿Uæ–°çš„管理思想åQŒåƒä¸€è‚¡é£Žæ½®å¸­å·äº†æ•´ä¸ª¾ŸŽå›½å’Œå…¶ä»–工业化国家ã€?</p> <p>  BPRž®±æ˜¯ž®†ä¼ä¸šçš„业务˜q‡ç¨‹æç»˜æˆä¸€ä¸?a title="价值链" >价值链</a>(Value Chain)åQŒç«žäº‰ä¸æ˜¯å‘生在企业与企业之é—ß_¼Œè€Œæ˜¯å‘生在企业各自的价值链之间。只有对价值链的各个环èŠ?<a title="业务‹¹ç¨‹" >业务‹¹ç¨‹</a>)实行有效½Ž¡ç†çš„企业,才有可能真正获得市场上的<a title="竞争优势" >竞争优势</a>åQŒä¹ŸæƒŸå…¶å¦‚æ­¤åQŒBPRæ‰è¢«æ§äØ““恢复¾ŸŽå›½ç«žäº‰åŠ›çš„æƒŸä¸€é€”å¾„”ã€?</p> <p>  BPRçš„äñ”生,òq¶ä¸ä»…仅是一本书那么½Ž€å•,隐藏在BPR背后的是深刻的技术、经‹¹Žä»¥åŠç®¡ç†å˜é©èƒŒæ™¯ã€?</p> <p>  资本ä¸ÖM¹‰˜q›å…¥70òq´ä»£ä»¥æ¥åQŒå…¨çƒç»‹¹ŽçŽ¯å¢ƒå‘ç”Ÿäº†å·¨å¤§çš„å˜åŒ–ï¼Œä¾›å¤§äºŽæ±‚çš„çŽ°çŠ¶ä¿ƒæˆäº†<a title="卖方市场" >卖方市场</a>转向<a title="买方市场" >买方市场</a>。进å…?0òq´ä»£åQŒä»¥¾ŸŽå›½ä¸ÞZ»£è¡¨çš„资本ä¸ÖM¹‰å‘达国家¾læµŽé™·å…¥å¢žé•¿¾~“æ…¢å’?a title="通货膨胀" >通货膨胀</a>的尴ž®¬å›°å¢ƒï¼Œä¼ä¸šé™·å…¥äº†æˆæœ¬å¢žåŠ ã€æ•ˆç›Šé™ä½Žçš„å±€é¢ï¼Œ<a title="产品竞争åŠ? >产品竞争åŠ?/a>与亚太国家相比陷入不断下降的局面。美国的企业˜q«åˆ‡æœŸæœ›æ”¹å˜˜q™ç§çŽ°çŠ¶åQŒèµ°å‡ÞZ½Žè°øP¼Œä»?0åˆ?0òq´ä»£é™†ç®‹å‡ºçŽ°çš„æ–°åž‹ç®¡ç†æ‰‹ŒDµä»¥åŠç®¡ç†æ–¹æ³•䨓BPR奠定了腾½Iø™€Œå‡ºçš„基¼‹€æ¡äšgã€?</p> <p>  90òq´ä»£åˆåº”˜qè€Œç”Ÿçš„BPR正好˜qŽåˆäº†ä¼ä¸šçš„˜q™ç§æ€æƒ³å’Œéœ€è¦ã€‚BPR完全满èƒö了欧¾ŸŽä¼ä¸šæ€¥äºŽèµ°å‡º<a title="¾læµŽè§æ¡" >¾læµŽè§æ¡</a>、寻求持¾l­å¢žé•¿å’Œé€‚应新的商业规则的心理需求,也满­‘³äº†å­¦æœ¯ç•Œåœ¨˜q¯‚Œ«ä¸­å¯»æ±‚管理思想革新的迫切心理ã€?</p> <p>  BPRä»?990òq´æ¦‚å¿ëŠš„诞生åQŒçŸ­çŸ?òq´çš„æ—‰™—´åQŒåˆ°1993òq´è¾¾åˆ°é¡¶å³ŽÍ¼Œåœ¨ç¾Žå›½å‡ ä¹ŽåŞ成一股风潮,同时˜q˜æ‡L及到日本、å¯d国等其他工业化国家ã€?990òq´åˆ°1995òq´æ˜¯BPR在欧¾ŸŽæœ€ä¸ºé¼Žç››çš„æ—¶æœŸã€?0òq´ä»£æœ«æœŸåQŒç»‹¹Žçš„æŒç®‹½E›_®šå¯ÆD‡´BPRæˆäØ“¾ŸŽå›½ä¼ä¸šçŽ‡å…ˆé—å¼ƒçš„å¯¹è±¡ã€?</p> <p>  另一本受‹Æ¢è¿Žçš„书¾c?a title="《高效äh¾Ÿ¤çš„七种习惯ã€? >《高效äh¾Ÿ¤çš„七种习惯ã€?/a>着重介¾lä¸ªäººç®¡ç†ã€‚这本书虽然已经出版了十多年之久åQŒåƈ已达åˆîCº†ä¸Šåƒä¸‡çš„销量,但时至今日仍然是图书市场上的宠儿。有­‘£çš„æ˜¯ï¼Œè™½ç„¶æ•îC»¥åƒä¸‡è®¡çš„äºø™´­ä¹îCº†å®ƒï¼Œä½†äh们的òq›_‡å·¥ä½œæ•ˆçއä¼ég¹Žòq¶æ²¡æœ‰æ¯”十年前有所提高。本书作è€?a title="史蒂èŠ?#183;柯维" >史蒂èŠ?#183;柯维</a>却因此名声大振,他的¿Uäh公司<a class="new" title="富兰克林·æŸ¯ç»´" >富兰克林·æŸ¯ç»´</a>(Franklin Covey)åœ?001òq´çš„销售额高达5äº?000万美元ã€?</p> <p>  ˜q˜æœ‰ä¸€ä½å€¼å¾—一提的作者当æ•?a title="彼得·å¾·é²å…? >彼得·å¾·é²å…?/a>。他所写的½Ž¡ç†å­¦è‘—作早åœ?a title="汤姆·å½¼å¾—æ–? >汤姆·å½¼å¾—æ–?/a>的《追求卓­‘Šã€‹ä¹‹å‰ã€‚在本次评选中åQŒä»–çš?a class="new" title="《å¯d鲁克的核心思想ã€? >《å¯d鲁克的核心思想ã€?/a>è¢«å…¬è®¤äØ“æ˜¯æœ€æœ‰åª„å“åŠ›çš„å•†ä¸šä¹¦¾cä¹‹ä¸€ã€?</p> <p>  <strong><a title="杰克·éŸ¦å°”å¥? >杰克·éŸ¦å°”å¥?/a>åQšå†è€ä¹Ÿä¼šè®©ä½ æƒŠè®?/strong> </p> <p>  <a title="CEO" >CEO</a>的传记历来都是出版商˜q½æ§çš„对象,然而最早的CEOä¼ è®°——1985òq´ç”±Bantam出版公司推出çš?a class="new" title="《艾¿U‘卡ã€? >《艾¿U‘卡ã€?/a>(《Lacoccaã€? 在此‹Æ¡è¯„选中却榜上无名。同样名噪一时的传记体书¾c?a class="new" title="《交易的艺术ã€? >《交易的艺术ã€?/a>(1988òqß_¼ŒRandom House公司出版)也与排行榜无¾~˜ã€?</p> <p>  由华¾U›_…¬å¸å‡ºç‰ˆçš„<a title="《杰å…?#183;韦尔奇自传ã€? >《杰å…?#183;韦尔奇自传ã€?/a>受到评选äh士的一致认可。近来,CEO<a title="杰克·éŸ¦å°”å¥? >杰克·éŸ¦å°”å¥?/a>虽然在婚姻问题上颇受争议åQŒä½†ä»–仍然被公认ä¸ÞZ»£è¡¨äº†ä¸€ä¸ªæ—¶ä»£çš„æœ€æ°å‡ºçš„CEO人选。同他合著该书的ã€?a title="商业周刊" >商业周刊</a>》的<a class="new" title="¾U¦ç¿°·ä¼¯æ©" >¾U¦ç¿°·ä¼¯æ©</a>的著ä½?a class="new" title="《ä­h值链ã€? >《ä­h值链ã€?/a>也在评选中颇受å…Ïx³¨ã€?</p> <p>  杰克·éŸ¦å°”奇在担ä“Q<a title="通用公司" >通用公司</a>CEOçš?0òq´ä¸­åQŒå¸¦é¢†è¿™ä¸ªå·¥ä¸šå·¨äººç§¯ç´¯äº†­‘…过4500亿美元的市场资本åQŒåƈ使自己成为全世界最受ähž®Šæ•¬çš„企业领对{€‚ä»–æå€¡åÆˆä¿ƒè¿›äº†çŽ°ä»£ä¼ä¸šçš„<a title="电子商务" >电子商务</a>ã€?a title="六西格玛" >六西格玛</a>体系——卛_œ¨100万次生äñ”或服务作业中的瑕ç–늎‡ä¸è¶…˜q?‹Æ¡ã€è´¨é‡ä½“¾pÕd’Œå…¨çƒåŒ–è¿›½E‹ã€‚同æ—Óž¼Œä»–徏立了一套独特的<a title="企业哲学" >企业哲学</a>和管理方法。其理念是打破一切界限地吸收有用的思想åQ›æŠŠäººå½“成企业的核心åQ›å¾ç«‹è‡ªç”Þqš„æŠ•入产出模式åQŒä»¥æŠµå±M<a title="官僚ä¸ÖM¹‰" >官僚ä¸ÖM¹‰</a>çš„äñ”生ã€?</p> <p>  杰克带领通用公司˜q›å…¥äº?#8220;中子杰克”时代åQŒä»–在每一个通用企业中推è¡?#8220;整顿、出售和关闭”的策略,从而ä‹É通用公司逐步裁减äº?0ä¸‡é›‡å‘˜ï¼›ä»–é€šè¿‡è´­åÆˆ<a title="RCA公司" >RCA公司</a>为通用未来的赢利奠定了基础……当然åQŒä¹Ÿæœ‰å¤±è¯¯çš„æ—¶å€™ï¼Œä½†æ˜¯æ°å…‹èƒ½å¤Ÿç”¨ä¸€¿Uå¦è¯šçš„心态去面对å¤Þp¯¯ã€‚在“自大的自å·?#8221;˜q™ä¸€ç« ä¸­åQŒä»–承认收购<a class="new" title="Kidder Peabody公司" >Kidder Peabody公司</a>是自己最大的å¤ÞpÓ|åQŒå› ä¸ø™¯¥å…¬å¸å’Œé€šç”¨å…¬å¸çš„æ–‡åŒ–背道而驰。对于在职业生æ„Óæœ€åŽä¸€òq´ç…žè´¹è‹¦å¿ƒåœ°æ”¶è´­<a title="霍尼韦尔" >霍尼韦尔</a>òq‰™­é‡å¤±è´¥çš„全过½E‹ï¼Œæœ¬ä¹¦ä¹Ÿåšäº†è¯¦ž®½çš„交代。这位善于自嘲的¾lç†äºø™¯´˜q™è®©ä»–明白了一个道理:再老也会有让你惊讶的事情。的¼‹®ï¼Œå¦‚果韦尔奇撰写自传箋集的话,他会向读者解释他的婚å§Õd±æœºå’Œå…³äºŽå·¨é¢é€€ä¼‘金的满城风雨吗åQ?</p> <p>  在传记类作品中,另一本著名的传记<a title="《摩根胦团ã€? >《摩根胦团ã€?/a>äº?990òq´é—®ä¸–,书中描述äº?a title="J.P.æ‘©æ ¹" >J.P.æ‘©æ ¹</a>的帝国如何从诞生到陨落的˜q‡ç¨‹åQŒè¯¥ä¹¦èŽ·å¾—äº†1990 òq´å…¨¾ŸŽæœ€ä½›_›¾ä¹¦å¥–åQŒåƈ在商界äh士之中广泛流传ã€?a title="å¾®èÊY" >å¾®èÊY</a>的总裁<a title="比尔·ç›–茨" >比尔·ç›–茨</a>是这个时代最富有的ähåQŒä»–的两本描˜qîC¿¡æ¯ä¸–界的ä¹?a class="new" title="《未来之路ã€? >《未来之路ã€?/a>å’?a class="new" title="《未来时速ã€? >《未来时速ã€?/a>虽然引äh注目åQŒä½†å´æ²¡æœ‰è£ç™ÀLœ¬‹Æ¡æŽ’行榜ã€?</p> <div style="float: right; margin-left: 5px" class="editsection">[<a title="¾~–辑ŒDµè½: 排名榜单" >¾~–辑</a>]</div><a name=".E6.8E.92.E5.90.8D.E6.A6.9C.E5.8D.95"></a> <h2>排名榜单</h2> <table class="wikitable"> <tbody> <tr> <th>排名(Rank)</th> <th>书名(Title)</th> <th>作è€?Author)</th> <th>出版å•?Publisher)</th> <th>òq´ä†¾(Year)</th> <th>¾cÕdž‹(Genre) </th></tr> <tr> <td>1</td> <td><a title="《追求卓­‘Šã€? >《追求卓­‘Šã€?/a>(<a title="In Search of Excellence: Lessons from America's Best-Run Companies" >In Search of Excellence: Lessons from America's Best-Run Companies</a>)</td> <td><a title="汤姆·å½¼å¾—æ–? >汤姆·å½¼å¾—æ–?/a>(<a title="Thomas Peters" >Thomas Peters</a>), <a title="¾|—伯ç‰?#183;沃特æ›? >¾|—伯ç‰?#183;沃特æ›?/a>(<a title="Robert H. Waterman" >Robert H. Waterman</a>)</td> <td>哈珀与罗出版公司(Harper & Row)</td> <td>1982</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>2</td> <td><a title="《基业长青ã€? >《基业长青ã€?/a>(<a title="Built to Last: Successful Habits of Visionary Companies" >Built to Last: Successful Habits of Visionary Companies</a>)</td> <td><a title="吉姆·æŸ¯æž—æ–? >吉姆·æŸ¯æž—æ–?/a>(<a title="James C. Collins" >James C. Collins</a>), <a title="杰里·æ³¢æ‹‰æ–? >杰里·æ³¢æ‹‰æ–?/a>(<a title="Jerry I. Porras" >Jerry I. Porras</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集å›?HarperCollins)</td> <td>1994</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>3</td> <td><a title="《公司再造ã€? >《公司再造ã€?/a>(<a title="Reengineering the CorporationåQšA Manifesto for Business Revolution" >Reengineering the CorporationåQšA Manifesto for Business Revolution</a>)</td> <td><a title="˜qˆå…‹ž®?#183;哈默" >˜qˆå…‹ž®?#183;哈默</a>(<a title="Michael Hammer" >Michael Hammer</a>), <a title="詹姆æ–?#183;é’Þqš®" >詹姆æ–?#183;é’Þqš®</a>(<a title="James A. Champy" >James A. Champy</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集å›?HarperCollins)</td> <td>1993</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>4</td> <td><a title="《门口的野蛮人ã€? >《门口的野蛮人ã€?/a>(<a title="Barbarians at the Gate: The Fall of RJR Nabisco" >Barbarians at the Gate: The Fall of RJR Nabisco</a>)</td> <td><a class="new" title="布赖æ?#183;伯勒" >布赖æ?#183;伯勒</a>(<a class="new" title="Bryan Burrough" >Bryan Burrough</a>), <a class="new" title="¾U¦ç¿°·å¸Œåˆ©äºšå°”" >¾U¦ç¿°·å¸Œåˆ©äºšå°”</a>(<a class="new" title="John Helyar" >John Helyar</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集团(HarperCollinsåQ?/td> <td>1990</td> <td>ž®è¯´(Narrative) </td></tr> <tr> <td>5</td> <td><a title="《竞争优åŠÑ€? >《竞争优åŠÑ€?/a>(<a title="Competitive Advantage: Creating and Sustaining Superior Performance" >Competitive Advantage: Creating and Sustaining Superior Performance</a>)</td> <td><a title="˜qˆå…‹ž®?#183;波特" >˜qˆå…‹ž®?#183;波特</a>(<a title="Michael E. Porter" >Michael E. Porter</a>)</td> <td>自由出版½C?Free Press)</td> <td>1998</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>6</td> <td><a title="《引爆流è¡?ž®äº‹å¦‚何产生大变化ã€? >《引爆流è¡?ž®äº‹å¦‚何产生大变化ã€?/a>(<a title="The Tipping Point: How Little Things Can Make a Big Difference" >The Tipping Point: How Little Things Can Make a Big Difference</a>)</td> <td><a title="马尔¿U‘姆·æ ÆDޱ德十ž®? >马尔¿U‘姆·æ ÆDޱ德十ž®?/a>(<a title="Malcolm Gladwell" >Malcolm Gladwell</a>)</td> <td>利特ž®?amp;布朗出版½C?Little Brown)</td> <td>2000</td> <td>ž®è¯´(Narrative) </td></tr> <tr> <td>7</td> <td><a title="《跨­‘Šé¿`沟ã€? >《跨­‘Šé¿`沟ã€?/a>(<a title="Crossing the Chasm: Marketing and Selling Technology Products to Mainstream Customers" >Crossing the Chasm: Marketing and Selling Technology Products to Mainstream Customers</a>)</td> <td><a title="杰弗ç‘?#183;æ‘©å°”" >杰弗ç‘?#183;æ‘©å°”</a>(<a title="Geoffrey A. Moore" >Geoffrey A. Moore</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集团商业分½C?HarperBusiness)</td> <td>1999</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>8</td> <td><a title="《摩根胦团ã€? >《摩根胦团ã€?/a>(<a title="The House of Morgan: An American Banking Dynasty and the Rise of Modern Finance" >The House of Morgan: An American Banking Dynasty and the Rise of Modern Finance</a>)</td> <td><a class="new" title="¾|—恩·å½»è¯º" >¾|—恩·å½»è¯º</a>(<a class="new" title="Ron Chernow" >Ron Chernow</a>)</td> <td>亚特兰大月刊出版½C¾Atlantic Monthly Press</td> <td>1990</td> <td>人物传记(Biography) </td></tr> <tr> <td>9</td> <td><a title="《六西格玛之路ã€? >《六西格玛之路ã€?/a>(<a title="The Six Sigma Way" >The Six Sigma Way</a>)</td> <td><a class="new" title="彼得·æ½˜è’‚" >彼得·æ½˜è’‚</a>(<a class="new" title="Peter S. Pande et al" >Peter S. Pande et al</a>), <a class="new" title="¾|—伯ç‰?#183;¾U½æ›¼" >¾|—伯ç‰?#183;¾U½æ›¼</a><a class="new" title="Robert P. Neuman" >Robert P. Neuman</a>, <a class="new" title="¾|—å…°·å¡æ³•那夫" >¾|—å…°·å¡æ³•那夫</a>(<a class="new" title="Roland R. Cavanagh" >Roland R. Cavanagh</a>)</td> <td><a title="麦格åŠ?#183;希尔公司" >麦格åŠ?#183;希尔公司</a>(McGraw-Hill)</td> <td>2000</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>10</td> <td><a title="《高效äh士的七个习惯ã€? >《高效äh士的七个习惯ã€?/a>(<a title="Seven Habits of Highly Effective People: Powerful Lessons in Personal Change" >Seven Habits of Highly Effective People: Powerful Lessons in Personal Change</a>)</td> <td><a title="斯蒂èŠ?#183;¿U‘ç»´" >斯蒂èŠ?#183;¿U‘ç»´</a>(<a title="Stephen R. Covey" >Stephen R. Covey</a>)</td> <td>西蒙和舒斯特公司(Simon & Schuster)</td> <td>1990</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>11</td> <td><a title="《谎­a€å®¶çš„¾U¸ç‰Œã€? >《谎­a€å®¶çš„¾U¸ç‰Œã€?/a>(<a title="Liar's Poker" s Poker</a>)</td> <td><a class="new" title="˜qˆå…‹ž®?#183;刘易æ–? >˜qˆå…‹ž®?#183;刘易æ–?/a>(<a class="new" title="Michael Lewis" >Michael Lewis</a>)</td> <td>W.WåQŽè¯º™å¿å‡ºç‰ˆç¤¾(W.W. Norton)</td> <td>1989</td> <td>ž®è¯´(Narrative) </td></tr> <tr> <td>12</td> <td><a title="《创新者的½H˜å¢ƒã€? >《创新者的½H˜å¢ƒã€?/a>(<a title="The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail" >The Innovator's Dilemma: When New Technologies Cause Great Firms to Fail</a>)</td> <td><a title="克莱™å?#183;克里斯坦‹‚? >克莱™å?#183;克里斯坦‹‚?/a>(<a title="Clayton M. Christensen" >Clayton M. Christensen</a>)</td> <td>哈佛商学院出版社(Harvard Business School Press)</td> <td>1997</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>13</td> <td><a title="《日本公司ã€? >《日本公司ã€?/a>(<a title="Japan Inc." >Japan Inc.</a>)</td> <td><a class="new" title="çŸÏx£®ç« å¤ªéƒ? >çŸÏx£®ç« å¤ªéƒ?/a>(<a class="new" title="Shotaro Ishinomori" >Shotaro Ishinomori</a>)</td> <td>加利¼›å°¼äºšå¤§å­¦å‡ºç‰ˆç¤¾(University of California Press)</td> <td>1988</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>14</td> <td><a title="《贼巢ã€? >《贼巢ã€?/a>(<a title="Den of Thieves" >Den of Thieves</a>)</td> <td><a class="new" title="詹姆æ–?#183;B·æ–¯å›¾ž®”特" >詹姆æ–?#183;B·æ–¯å›¾ž®”特</a>(<a class="new" title="James B. Stewart" >James B. Stewart</a>)</td> <td>西蒙和舒斯特公司(Simon & Schuster)</td> <td>1991</td> <td>ž®è¯´(Narrative) </td></tr> <tr> <td>15</td> <td><a title="《å¯d鲁克¾_‘֍Žã€? >《å¯d鲁克¾_‘֍Žã€?/a><a title="The Essential Drucker" >The Essential Drucker</a></td> <td><a title="彼得·å¾·é²å…? >彼得·å¾·é²å…?/a>(<a title="Peter F. Drucker" >Peter F. Drucker</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集团商业分½C?HarperBusiness)</td> <td>2001</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>16</td> <td><a title="ã€ŠäØ“æœªæ¥ç«žäº‰ã€? >ã€ŠäØ“æœªæ¥ç«žäº‰ã€?/a>(<a title="Competing for the Future" >Competing for the Future</a>)</td> <td><a title="加里·å“ˆé»˜ž®? >加里·å“ˆé»˜ž®?/a>(<a title="Gary Hamel" >Gary Hamel</a>), <a title="普拉哈拉å¾? >普拉哈拉å¾?/a>(<a title="C. K. Prahalad" >C. K. Prahalad</a>)</td> <td>哈佛商学院出版社(Harvard Business School Press)</td> <td>1994</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>17</td> <td><a title="《巴菲特之道åQšä¸–界上最伟大的投资家的投资战略ã€? >《巴菲特之道åQšä¸–界上最伟大的投资家的投资战略ã€?/a>(<a title="The Buffett Way: Investment Strategies of the World's Greatest Investor" >The Buffett Way: Investment Strategies of the World's Greatest Investor</a>)</td> <td><a class="new" title="¾|—伯ç‰?#183;哈格斯特é¾? >¾|—伯ç‰?#183;哈格斯特é¾?/a>(<a class="new" title="Robert G. Hagstrom" >Robert G. Hagstrom</a>)</td> <td>¾U¦ç¿°·å¨åˆ©çˆ¶å­å…¬å¸(John Wiley & Sons)</td> <td>1991</td> <td>投资(Investing) </td></tr> <tr> <td>18</td> <td><a title="《杰å…?#183;韦尔奇自传ã€? >《杰å…?#183;韦尔奇自传ã€?/a>(<a title="Jack: Straight from the Gut" >Jack: Straight from the Gut</a>)</td> <td><a title="杰克·éŸ¦å°”å¥? >杰克·éŸ¦å°”å¥?/a>(<a title="Jack Welch" >Jack Welch</a>), <a class="new" title="¾U¦ç¿°·æ‹œæ©æ–? >¾U¦ç¿°·æ‹œæ©æ–?/a>(<a class="new" title="John A. Byrne" >John A. Byrne</a>)</td> <td>时代华纳贸易出版公司(Warner)</td> <td>2001</td> <td>ä¼ è®°(Biography) </td></tr> <tr> <td>19</td> <td><a title="《从优秀到卓­‘Šã€? >《从优秀到卓­‘Šã€?/a>(<a title="Good to Great: Why Some Companies Make the Leap... and Others Don't" >Good to Great: Why Some Companies Make the Leap... and Others Don't</a>)</td> <td><a title="吉姆·æŸ¯æž—æ–? >吉姆·æŸ¯æž—æ–?/a>(<a title="James Collins" >James Collins</a>)</td> <td>哈珀·æŸ¯æž—斯一般图书出版集å›?HarperCollins)</td> <td>2001</td> <td>½Ž¡ç†è‘—作(Management) </td></tr> <tr> <td>20</td> <td><a title="《新æ–îCº‹ç‰?-¼‹…谷文化ã€? >《新æ–îCº‹ç‰?-¼‹…谷文化ã€?/a>(<a title="The New New Thing: A Silicon Valley Story" >The New New Thing: A Silicon Valley Story</a>)</td> <td><a class="new" title="˜qˆå…‹ž®?#183;刘易æ–? >˜qˆå…‹ž®?#183;刘易æ–?/a>(<a class="new" title="Michael Lewis" >Michael Lewis</a>)</td> <td>W.WåQŽè¯º™å¿å‡ºç‰ˆç¤¾(W.W. Norton)</td> <td>2000</td> <td>ž®è¯´(Narrative) </td></tr></tbody></table> <img src ="http://www.aygfsteel.com/DLevin/aggbug/368317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-07-12 11:12 <a href="http://www.aygfsteel.com/DLevin/archive/2012/07/12/368317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【è{】Windows Shell扩展¾~–程å‚ȝ“œæ‰‹å†Œå¤§å…¨åQšä¸Šä¸‹æ–‡èœå•扩展http://www.aygfsteel.com/DLevin/archive/2012/07/12/373911.htmlDLevinDLevinThu, 12 Jul 2012 03:11:00 GMThttp://www.aygfsteel.com/DLevin/archive/2012/07/12/373911.htmlhttp://www.aygfsteel.com/DLevin/comments/373911.htmlhttp://www.aygfsteel.com/DLevin/archive/2012/07/12/373911.html#Feedback1http://www.aygfsteel.com/DLevin/comments/commentRss/373911.htmlhttp://www.aygfsteel.com/DLevin/services/trackbacks/373911.html阅读全文

DLevin 2012-07-12 11:11 发表评论
]]>
[转]关于面试、简历之¾cÈš„æŸäh聊天的观ç‚?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/07/02/381984.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Mon, 02 Jul 2012 05:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/07/02/381984.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/381984.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/07/02/381984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/381984.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/381984.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">在CSDN上看到的åQŒæ„Ÿè§‰è¯´çš„蛮好的åQŒè{˜q‡æ¥æ”¶è—ä¸€ä¸‹ï¼ŒåŽŸæ–‡åœ°å€åQ?a >http://topic.csdn.net/u/20120629/17/d130a88b-54fc-4402-8d12-b573872d96b3.html</a><br />2012/2/2 15:13:23  <br />有一个原åˆ?nbsp; <br />2012/2/2 15:13:29  <br />如果我投½Ž€åŽ†ç»™ä½?nbsp; <br />2012/2/2 15:13:36  <br />ž®×ƒ»£è¡¨æˆ‘接受挑é€?nbsp; <br />2012/2/2 15:13:44  <br />é‚£ä¹ˆä½ æ€Žä¹ˆæ øP¼Œæˆ‘都遵守  <br />2012/2/2 15:13:49  <br />如果是你打电话给æˆ?nbsp; <br />2012/2/2 15:13:57  <br />那是你邀è¯ähˆ‘  <br />2012/2/2 15:14:04  <br />那么你必™å»èƒö够尊重我  <br />2012/2/2 15:14:10  <br />不然不玩  <br />2012/2/2 15:14:22  <br />˜q™æ˜¯ä¸åŒçš„,我申è¯ïLš„åQŒæˆ‘ž®Šé‡ä½ ï¼Œ  <br />2012/2/2 15:14:29  <br />ä½ é‚€è¯ïLš„åQŒä½ ž®Šé‡æˆ?nbsp; <br />2012/2/2 15:14:44  <br />你尊重都做不刎ͼŒ˜q˜è¯´å•?nbsp; <br />2012/2/2 15:15:04  <br />你把人邀è¯äh¥äº†ï¼Œåˆè¦äººåš½W”试åQŒä½ ç–¯äº†å?nbsp; <br />2012/2/2 15:15:25  <br />我从来面试不带笔  <br />2012/2/2 15:15:33  <br />也不带别çš?nbsp; <br />2012/2/2 15:15:35  <br />别的  <br />2012/2/2 15:15:40  <br />没多ž®?nbsp; <br />2012/2/2 15:15:42  <br />不说äº?nbsp; <br />2012/2/2 15:16:34  <br />企业和面试者是òq³ç­‰å…³ç³»  <br />2012/2/2 15:16:49  <br />我每‹Æ¡æ‹›äººï¼Œæˆ‘都会问人家åQŒä½ æŽ¥å—½W”试ä¸?nbsp; <br />2012/2/2 15:16:57  <br />你不接受åQŒæˆ‘不勉å¼?nbsp; <br />2012/2/2 15:17:19  <br />但是你真的技术无法判断,又不愿意½W”试åQŒæˆ‘ž®±åªèƒ½è¯´ä¹°å–不成仁义åœ?nbsp; <br />2012/2/2 15:17:47  <br />æˆ‘ä¸è®¤äØ“æ‹’ç»½W”试是不ž®Šé‡æˆ‘,但有的时候需要笔试,我会先说明,你觉得不好,可以不白è·?nbsp; <br />2012/2/2 15:18:05  <br />但是你投了简历,那就不一样了  <br />2012/2/2 15:18:11  <br />你是接受选拔çš?nbsp; <br />2012/2/2 15:18:15  <br />不是我邀请面试的  <br />2012/2/2 15:18:46  <br />½Ž€åŽ†å†™å¾—å¥½çš„ï¼Œä¸€èˆ¬å¯ä»¥ä¸½W”试åQŒå› ä¸ºæœ‰ä¸œè¥¿é—?nbsp; <br />2012/2/2 15:19:07  <br />  15:18:46  <br />½Ž€åŽ†å†™å¾—å¥½çš„ï¼Œä¸€èˆ¬å¯ä»¥ä¸½W”试åQŒå› ä¸ºæœ‰ä¸œè¥¿é—?nbsp; <br /><br />å—?nbsp; <br />2012/2/2 15:19:06  <br />有的½Ž€åŽ†ä»€ä¹ˆéƒ½çœ‹ä¸å‡ºæ¥åQŒæˆ‘怎么面试你,只好½W”试先摸åº?nbsp; <br />2012/2/2 15:19:31  <br />æ‹›JAVAå’ŒANDROID  <br />2012/2/2 15:19:41  <br />目前˜q˜åœ¨æ‹?nbsp; <br />2012/2/2 15:20:21  <br />其实怎么选简åŽ?nbsp; <br />2012/2/2 15:20:30  <br />很简单,一åQŒæ­£å¥½ç¬¦åˆè¦æ±?nbsp; <br />2012/2/2 15:20:51  <br />2 ™å¹ç›®¾låŽ†æ¸…æ¥šåQŒä¸æ˜¯è¦ä½ ä»‹¾lé¡¹ç›®æƒ…况,而关键是你做了什ä¹?nbsp; <br />2012/2/2 15:21:00  <br />你把自己负责的说清楚  <br />2012/2/2 15:21:08  <br />而不是罗列各¿Uæ¡†æž¶å¿U?nbsp; <br />2012/2/2 15:21:13  <br />是äh都会SSH  <br />2012/2/2 15:21:17  <br />有必要写åQ?nbsp; <br />2012/2/2 15:21:23  <br />你怎么知道我用SSHå‘?nbsp; <br />2012/2/2 15:21:37  <br />嗯,你要è¯ß_¼Œæˆ‘做˜q‡ä»€ä¹?nbsp; <br />2012/2/2 15:21:50  <br />比如XXX™å¹ç›®åQŒæˆ‘è´Ÿè´£XXX模块åQŒé‡‡ç”¨XX  <br />2012/2/2 15:22:01  <br />一定是最好的模块åQŒå’Œæœ‰ç‰¹è‰²çš„æŠ€æœ?nbsp; <br />2012/2/2 15:22:10  <br />一般什么CRUDåQŒå†™äº†æœ‰å•¥ç”¨å‘?nbsp; <br />2012/2/2 15:22:24  <br />你做˜q‡ä¸€å¤§æŠŠç”œåˆ æ”ÒŽŸ¥æœ‰å•¥å¥½äº›çš?nbsp; <br />2012/2/2 15:22:33  <br />˜q™ä¹Ÿèƒ½è¯´æ˜Žä¸€ä¸ªäh抓重点的能力  <br />2012/2/2 15:22:41  <br />你有那么几个炚w—ªå…?nbsp; <br />2012/2/2 15:22:54  <br />我觉得,嗯,可以叫来详细问问  <br />2012/2/2 15:22:57  <br />面试æœÞZ¼šž®±æœ‰äº?nbsp; <br />2012/2/2 15:23:16  <br />那笔试有啥用呢,我已¾lå¯¹ä½ æœ‰å…´è¶£ç‚¹äº†  <br />2012/2/2 15:23:35  <br />只要你说的是真的åQŒä¸å‡ºå¤§é—®é¢˜åQŒè¿™äº‹å°±æˆäº†  <br />2012/2/2 15:24:23  <br />é’׃¹Ÿæ˜¯ä¸€æ ïLš„  <br />2012/2/2 15:24:28  <br />不是说CRUDž®×ƒ¸è¦?nbsp; <br />2012/2/2 15:24:41  <br />有时候也会招CRUDçš„ï¼Œå› äØ“™å¹ç›®¾l„要ž®å¼Ÿ  <br />2012/2/2 15:24:57  <br />但我叫你面试前,对你其实有了期望  <br />2012/2/2 15:25:12  <br />比如招你ž®±æ˜¯åšCRUD的,那你è¦?K我都觉得贵了  <br />2012/2/2 15:25:19  <br />招你ž®±æ˜¯å½“牛人的  <br />2012/2/2 15:25:27  <br />你要15KåQŒä¹Ÿæ˜¯å¯ä»¥å•†é‡çš„  <br />2012/2/2 15:25:39  <br />ä½ çš„½Ž€åŽ†å†³å®šäº†æˆ‘è§ä½ ä¹‹å‰å¯¹ä½ çš„å®šä½  <br />2012/2/2 15:25:51  <br />当然你吹牛皮åQŒæ¥äº†ä¸æ˜¯é‚£ä¹ˆä¸€å›žäº‹  <br />2012/2/2 15:26:01  <br />也会让我快速失åŽÕd¯¹ä½ çš„å…´è¶£  <br />2012/2/2 15:26:26  <br />其实不是吹牛  <br />2012/2/2 15:26:33  <br />是如何让别äh发生兴趣ç‚?nbsp; <br />2012/2/2 15:26:40  <br />一般有一个兴­‘£ç‚¹ž®±å¯ä»¥å…äº?nbsp; <br />2012/2/2 15:26:42  <br />面了  <br />2012/2/2 15:26:51  <br />2个兴­‘£ç‚¹åQŒæˆ‘ž®±å¯ä»¥ç»™çš„钱多点  <br />2012/2/2 15:26:54  <br />3个以ä¸?nbsp; <br />2012/2/2 15:26:57  <br />那是我争取你äº?nbsp; <br />2012/2/2 15:27:11  <br />一个äh解决团队的一个问题,ž®Þpƒö够了  <br />2012/2/2 15:28:12  <br />如果我主动对你介¾lçš„多,证明我想要你  <br />2012/2/2 15:28:31  <br />如果我要你说的多åQŒè¯æ˜Žæˆ‘˜q˜æ²¡çœ‹æ¸…楚你åQŒåˆä¸æƒ³æ”‘Ö¼ƒä½ ï¼Œæƒ³ç»™ä½ æœºä¼šå¤šè¯?nbsp; <br />2012/2/2 15:28:43  <br />如果我就机械的和你一问一½{?nbsp; <br />2012/2/2 15:28:49  <br />基本ž®±æ˜¯å‡ÞZºŽ½CÆD²Œäº?nbsp; <br />2012/2/2 15:29:21  <br />我是个部门经ç?nbsp; <br />2012/2/2 15:29:34  <br />我想说下åQŒé¢è¯•是怎么一回事  <br />2012/2/2 15:29:43  <br />反正˜q™äº›¾léªŒæ²¡ç”¨äº?nbsp; <br />2012/2/2 15:31:13  <br />很多人简历也写的不好åQŒè¯´ä¹Ÿä¸ä¸ÕdЍåQŒçœ‹ä¸æ¸…åQŒä¹Ÿè®æ€½ ¾léªŒå¾ˆèƒöåQŒä½†æˆ‘招你压力很大,你想你要1WåQŒä»€ä¹ˆéƒ½æ²¡è¡¨çŽŽÍ¼Œä½ è¯´å‡­å®žåŠ›è¯´è¯ï¼Œå¯ä»¥è¯•ç”¨åQŒä½†æˆ‘天天招人,不行ž®±å¼€æŽ?nbsp; <br />2012/2/2 15:31:21  <br />HR怎么看我åQŒä¸Š¾U§å¦‚何看æˆ?nbsp; <br />2012/2/2 15:31:50  <br />不能˜q™ä¹ˆòqÔŒ¼Œæ‰€ä»¥ç®€åŽ†å’Œé¢è¯•åQŒä½ å¿…须把闪光点æ€È»“出来  <br />2012/2/2 15:32:14  <br />一个项目做完,你就得想åQŒè¿™ä¸ªé¡¹ç›®é‡Œæˆ‘最得意的作品和收获是什ä¹?nbsp; <br />2012/2/2 15:32:20  <br />我怎么写入½Ž€åŽ†é‡Œé?nbsp; <br />2012/2/2 15:32:26  <br />比如某CMS™å¹ç›®  <br />2012/2/2 15:32:38  <br />你写我做了栏目管理,文章½Ž¡ç†åQ?nbsp; <br />2012/2/2 15:32:44  <br />有啥用,都是CRUD  <br />2012/2/2 15:33:03  <br />我写åQŒæˆ‘负责多线½E‹é™æ€åŒ–ä»ÕdŠ¡ç”Ÿæˆ  <br />2012/2/2 15:33:20  <br />臛_°‘展示äº?点,1 我知道静态化åQ? 我熟悉多¾U¿ç¨‹  <br />2012/2/2 15:33:36  <br />˜q™æ ·åQŒä½ åŽÀL‰¾CMS™å¹ç›®¾l„,ž®±æ¯”你开始写的好  <br />2012/2/2 15:35:40  <br />你要把技术和实际问题¾l“合  <br />2012/2/2 15:35:52  <br />˜q™æ ·é¢é¦†å¥½é—®åQŒå¯å‘他提问  <br />2012/2/2 15:36:01  <br />比如我说我会多线½E?nbsp; <br />2012/2/2 15:36:16  <br />面馆怎么问,问你如何防止死锁  <br />2012/2/2 15:36:19  <br />是可以怎么é—?nbsp; <br />2012/2/2 15:36:28  <br />但这东西对他对你都没ç”?nbsp; <br />2012/2/2 15:36:43  <br />你背一背,他也听不出错è¯?nbsp; <br />2012/2/2 15:36:48  <br />但是˜q˜æ˜¯ä¸çŸ¥é“你会不ä¼?nbsp; <br />2012/2/2 15:37:08  <br />你说我用多线½E‹åšäº†å•¥åQŒè¿™é‡Œé¢ä¸ºå•¥è¦å¤š¾U¿ç¨‹åQŒå¤š¾U¿ç¨‹è§£å†³äº†ä»€ä¹ˆå®žé™…é—®é¢?nbsp; <br />2012/2/2 15:37:16  <br />或许他还眼睛一äº?nbsp; <br />2012/2/2 15:37:29  <br />我的某项目可以让你做åQŒæ­£å¥½å•¥é—®é¢˜åQŒéœ€è¦è¿™æ ?nbsp; <br />2012/2/2 15:37:38  <br />你让他舒服,他就让你舒服  <br />2012/2/2 15:37:45  <br />你和他纯理论  <br />2012/2/2 15:37:55  <br />那他问死你很å®ÒŽ˜“  <br />2012/2/2 15:38:12  <br />å› äØ“ä»–ä¸èˆ’æœåQŒä»–得挖½Iºå¿ƒæ€è®¾è®¡é—®é¢˜å¥—è¯?nbsp; <br />2012/2/2 15:38:43  <br />交流åˆîCº†ä¸€ä¸ªäh必须惌™¯é¢˜é—®å¦å¤–一个äh的时候,那么被问的ähž®±æ‚²å‰§äº†  <br />2012/2/2 15:39:08  <br />你要提供的出来话题,让双方变成讨论,那签¾U¦å°±æ˜¯å°äº‹äº†  <br />2012/2/2 15:39:11  <br />很HAPPYäº?nbsp; <br />2012/2/2 15:41:03  <br />反正˜q™æ˜¯æˆ‘çš„¾léªŒåQŒæˆ‘面试是这么被面的åQŒæˆ‘当面试官后,也是˜q™æ ·é¢ähçš?nbsp; <br />2012/2/2 15:41:17  <br />有的人,面完他,你很高兴åQŒå¸Œæœ›ä»–早点上班  <br />2012/2/2 15:41:33  <br />有的人,只希望赶快礼貌而客气的拒绝ä»?nbsp; <br /></font></p><img src ="http://www.aygfsteel.com/DLevin/aggbug/381984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-07-02 13:51 <a href="http://www.aygfsteel.com/DLevin/archive/2012/07/02/381984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>22个免费的图表、流½E‹å›¾å·¥å…·ã€è{ã€?/title><link>http://www.aygfsteel.com/DLevin/archive/2012/05/22/378817.html</link><dc:creator>DLevin</dc:creator><author>DLevin</author><pubDate>Tue, 22 May 2012 04:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/DLevin/archive/2012/05/22/378817.html</guid><wfw:comment>http://www.aygfsteel.com/DLevin/comments/378817.html</wfw:comment><comments>http://www.aygfsteel.com/DLevin/archive/2012/05/22/378817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/DLevin/comments/commentRss/378817.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/DLevin/services/trackbacks/378817.html</trackback:ping><description><![CDATA[<a >http://sd.csdn.net/a/20120517/2805640.html</a><br />感觉˜q˜ä¸é”™ï¼Œä¿ç•™ï½žï½žï½?img src ="http://www.aygfsteel.com/DLevin/aggbug/378817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/DLevin/" target="_blank">DLevin</a> 2012-05-22 12:48 <a href="http://www.aygfsteel.com/DLevin/archive/2012/05/22/378817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手动制作pythonçš„exe可执行程åº?-- by Leo Jayhttp://www.aygfsteel.com/DLevin/archive/2011/12/20/366823.htmlDLevinDLevinTue, 20 Dec 2011 03:48:00 GMThttp://www.aygfsteel.com/DLevin/archive/2011/12/20/366823.htmlhttp://www.aygfsteel.com/DLevin/comments/366823.htmlhttp://www.aygfsteel.com/DLevin/archive/2011/12/20/366823.html#Feedback0http://www.aygfsteel.com/DLevin/comments/commentRss/366823.htmlhttp://www.aygfsteel.com/DLevin/services/trackbacks/366823.html原文来自åQ?a >http://wiki.woodpecker.org.cn/moin/LeoJay/PyPackage
记录下来以防以后找不åˆîCº†ã€?br />

Pythonæ²¡æœ‰å†…å¾ä¸€ä¸ªç¼–è¯‘äØ“exe的功能。给python½E‹åºçš„部¾|²å¸¦æ¥ä¸ž®‘çš„éºÈƒ¦ã€?

所以就会出çŽîC¸€äº›py2exeä¹‹ç±»çš„å¾ˆä¸é”™çš„å·¥å…øP¼Œç”¨äºŽè‡ªåЍæŠ?pyæ–‡äšg¾~–译ä¸?exeæ–‡äšgã€?

最˜q‘抽½Iºç ”½I¶äº†ä¸€ä¸‹æ‰‹åŠ¨å®žçŽ°ç±»ä¼¼py2exe的功能,希望加强对python的了解ã€?

¾l“æžœ˜q˜ç›¸å½“不错。把¾l“果记录下来åQŒä¸Žå¤§å®¶å…׃ínã€?

原理

 

文中所描述的方法,åŸÞZºŽpython的以下几个功èƒ?

1. python½E‹åº˜qè¡Œæ—Óž¼Œä¼šåœ¨sys.path指定的èµ\径中查找库文件ã€?

2. pythonä»?.3开始,支持从zipæ–‡äšg中importåº?支持.py,.pycå’?pyoåQŒä½†ä¸æ”¯æŒ?pyd)

3. python提供C APIåQŒè®©c语言的程序,可以很方便的调用python的程åº?

实际步骤

 

注:假设python安装在c:\python25目录中,最后的可执行文件放到d:\dist目录�/strong>

1. 先去c:\python25\Lib目录åQŒæŠŠæ‰€æœ‰æ–‡ä»‰™ƒ½å¤åˆ¶å‡ºæ¥åQŒæ¯”如复制到d:\pythonlib目录ä¸?

2. 开一个cmd½H—口åQŒè¿›å…¥d:\pythonlib目录中,˜qè¡Œ python -OO compileall.py -f . 把lib中的.pyæ–‡äšg都编译成.pyoæ–‡äšg

3. 删除d:\pythonlib目录中所有的.pyå’?pycæ–‡äšgåQŒå› ä¸ºæˆ‘们只要有.pyoæ–‡äšgž®±å¯ä»¥è®©˜q™äº›åº“运行了ã€?

4. 删除目录中所有用不着的文ä»Óž¼Œæ¯”如cursesåQŒteståQŒidlelibåQŒmsilib½{‰ï¼Œä»¥å‡ž®‘生成文件的体积ã€?

5. 把这些库打包成一个zipæ–‡äšgåQŒæ¯”如stdlib.zipåQŒæ”¾åˆ°d:\dist目录ä¸?

6. 把c:\python25\dlls目录中的.pydå’?dllæ–‡äšgåQŒå¤åˆ¶åˆ°d:\dist\dlls目录中,当然åQŒåˆ é™¤ä¸å¯èƒ½ç”¨åˆ°çš„一些文件_msi.pyd,_ssl.pyd½{‰ç­‰åQŒå¯ä»¥å‡ž®‘文件的体积

7. 把自己写的程序,也按步骤2è‡Ïx­¥éª?所说的æ–ÒŽ³•åQŒæ‰“成一个mysrc.zip包,攑ֈ°d:\dist目录中ã€?注意åQšè‡ªå·±å†™çš„程序的入口应该是main.pyoæ–‡äšg

8. 用以下C½E‹åº¾~–译å‡ÞZ¸€ä¸ªå¯æ‰§è¡Œæ–‡äšgåQŒæ¯”方说叫runpy.exeåQŒä¹Ÿæ”‘Öˆ°d:\dist中ã€?

 

 1#include <Python.h>
 2#include <Windows.h>
 3#include <stdlib.h>
 4#include <stdio.h>
 5
 6int main()
 7{
 8        // å¾—到当前可执行文件所在的目录
 9        char szPath[10240];
10        char szCmd[10240];
11        GetModuleFileName(NULL, szPath, sizeof(szPath));
12        char* p = strrchr(szPath, '\\');
13        if (p == NULL)
14        {
15                printf("Get module file name error!\n");
16                return -1;
17        }

18
19        *= 0;
20
21        // è®‘Ö®š˜qè¡Œæ—¶çš„PATH
22        sprintf(szCmd, "PATH=%s\\dlls;%%PATH%%", szPath);
23        _putenv(szCmd);
24
25        // æŠŠsys.path讑֮šä¸º['.', '自己的源代码zipæ–‡äšg', '标准库zipæ–‡äšg', 'dll目录']
26        // ç„¶åŽè°ƒç”¨main模块
27        sprintf(szCmd,
28                "import sys\n"
29                "sys.path=['.', r'%s\\mysrc.zip', r'%s\\stdlib.zip', r'%s\\dlls']\n"
30                "import main\n",
31                szPath, szPath, szPath);
32        
33        Py_OptimizeFlag = 2;
34        Py_NoSiteFlag = 1;
35        Py_Initialize();
36        PyRun_SimpleString(szCmd);
37        return 0;
38}

39

 

9. 把python25.dll攑ֈ°d:\dist目录中ã€?

¾l“束è¯?/h3>

˜q™æ ·æ¥ï¼Œd:\dist目录中,一共只æœ?个文件加一个目录:

  • dlls目录åQšç”¨äºŽå­˜æ”¾æ‰€æœ‰çš„dllæ–‡äšgå’Œpydæ–‡äšg

  • stdlib.zipæ–‡äšgåQšç”¨äºŽå­˜æ”¾æ‰€æœ‰çš„pythonçš?pyoæ–‡äšg格式的标准库

  • mysrc.zipæ–‡äšgåQšç”¨äºŽå­˜æ”¾è‡ªå·±å†™çš„程序。注意,自己写的½E‹åºçš„入口在main.pyo中ã€?

  • runpy.exeæ–‡äšgåQšç¨‹åºçš„启动文äšgåQŒå¯åŠ¨åŽä¼šè®¾å®špythonçš„sys.pathåQŒç„¶åŽè°ƒç”¨main模块

  • python25.dllæ–‡äšgåQšpython的核心dllåQŒrunpy.exe依赖于这个dll


 

  • 哈哈åQŒç›¸å½“çš„½Ž€‹zæ˜Žäº†å§ã€‚一共才4个文件一个目录,5MB都不到哦ã€?

注:当然åQŒè¿™¿Uæ‰“包方式第一‹Æ¡åšçš„æ—¶å€™æ¯”较麻烦,但之后就可以只要把自å·Þqš„½E‹åºæ‰“包ž®±å¥½äº†ï¼Œå…¶å®ƒçš„不用变ã€?

而且åQŒå¦‚果自å·Þqš„½E‹åº¾lå¸¸åšæ”¹åŠ¨çš„è¯ï¼Œè‡ªå·±çš„ç¨‹åºä¹Ÿå¯ä»¥ä¸æ‰“åŒ…ï¼Œç›´æŽ¥æ”‘Öˆ°d:\dist中,反正runpy.exe启动½E‹åºçš„æ—¶å€™ï¼Œåªè¦èƒ½æ­£å¸¸è¿è¡Œimport mainž®±å¯ä»¥äº†ã€?


 

有不ž®‘äh写email¾l™æˆ‘åQŒé—®æˆ‘要我做的包。大家可以在˜q™é‡Œä¸‹è²åŸÞZºŽ2.5.2版本的包åQ?python_dist.7z 以及åŸÞZºŽ3.1.2版本的包åQ?python31-dist.7z

注:3.1.2依赖äº?a class="http" >visual c++ 2008 redistributable package. 如果在目标机器上没有安装åQŒåˆ™½E‹åº˜qè¡Œä¸è“v来ã€?

解开包后åQŒåªè¦ç”¨è‡ªå·±çš„程序替换mysrc.zipž®±å¯ä»¥ä‹É用了ã€?

包里有runpy.exeå’Œrunpyw.exe两个文äšg。其中,runpy.exe是控制台½E‹åºåQŒrunpyw.exe是非控制台程序。这两个½E‹åºåˆ†åˆ«¾cÖM¼¼äºŽpython.exeå’Œpythonw.exe。想让程序运行时出现一个控制台åQŒå°±˜qè¡Œrunpy.exeåQŒå¦‚果不惛_‡ºçŽ°é»‘é»‘çš„æŽ§åˆ¶åŽÍ¼Œž®Þp¿è¡Œrunpyw.exeã€?

 



]]> Ö÷Õ¾Ö©Öë³ØÄ£°å£º Àû½òÏØ| ÔªÀÊÇø| °×ºÓÏØ| Áúº£ÊÐ| ºÓÎ÷Çø| ͬÈÊÏØ| ¿ª·âÊÐ| Âó¸ÇÌáÏØ| ²×ÖÝÊÐ| ¹àÑôÏØ| ÐðÓÀÏØ| Çí½áÏØ| ÐÂÀÖÊÐ| Äþ°²ÊÐ| ½ðÏªÏØ| å§ÑôÏØ| ËÞËÉÏØ| ÎÞÎýÊÐ| ¦·³ÏØ| Î×É½ÏØ| ¹È³ÇÏØ| ÓÜÊ÷ÊÐ| ÄÏÍ¶ÏØ| Ìï¶«ÏØ| °²Í¼ÏØ| Ä«ÍÑÏØ| ËìÆ½ÏØ| ɳÌïÇø| ÃñÈ¨ÏØ| Ïã¸Û| °×ÒøÊÐ| ÃñÇÚÏØ| ¶«ÖÁÏØ| ÂÞµéÏØ| Ë·ÖÝÊÐ| ÐÞË®ÏØ| ±±Á÷ÊÐ| °²¿µÊÐ| ÈÚË®| ÌØ¿ËË¹ÏØ| Áúº£ÊÐ|