Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
Java²¢·¢ÈÝÆ÷´óºÏ¼¯
 
À´Ô´£ºblog.csdn.net ·¢²¼ÓÚ 2017-2-14
  1892  次浏览      27
 

¸ÅÊö

java.util°üÖеĴ󲿷ÖÈÝÆ÷¶¼ÊÇ·ÇḬ̈߳²È«µÄ£¬ÈôÒªÔÚ¶àÏß³ÌÖÐʹÓÃÈÝÆ÷£¬Äã¿ÉÒÔʹÓÃCollectionsÌṩµÄ°ü×°º¯Êý£ºsynchronizedXXX£¬½«ÆÕͨÈÝÆ÷±ä³ÉḬ̈߳²È«µÄÈÝÆ÷¡£µ«¸Ã·½·¨½ö½öÊǼòµ¥µØ¸øÈÝÆ÷ʹÓÃͬ²½£¬Ð§Âʺܵ͡£Òò´Ë²¢·¢´óʦDoug LeaÌṩÁËjava.util.concurrent°ü£¬Ìṩ¸ßЧµÄ²¢·¢ÈÝÆ÷¡£²¢ÇÒΪÁ˱£³ÖÓëÆÕͨµÄÈÝÆ÷µÄ½Ó¿ÚÒ»ÖÂÐÔ£¬ÈÔȻʹÓÃutil°üµÄ½Ó¿Ú£¬´Ó¶øÒ×ÓÚʹÓá¢Ò×ÓÚÀí½â¡£

PS£ºÎÊÌ⣺synchronizedXXX¾¿¾¹¶ÔÈÝÆ÷×öÁËʲô´Ó¶øÄÜ´ïµ½Ḭ̈߳²È«µÄÄ¿µÄ£¿

Ààͼ

ListºÍSet

JUC°üÖÐList½Ó¿ÚµÄʵÏÖÀࣺCopyOnWriteArrayList

CopyOnWriteArrayListÊÇḬ̈߳²È«µÄArrayList

JUC°üÖÐSet½Ó¿ÚµÄʵÏÖÀࣺCopyOnWriteArraySet¡¢ConcurrentSkipListSet

CopyOnWriteArraySetÊÇḬ̈߳²È«µÄSet£¬ËüÄÚ²¿°üº¬ÁËÒ»¸öCopyOnWriteArrayList£¬Òò´Ë±¾ÖÊÉÏÊÇÓÉCopyOnWriteArrayListʵÏֵġ£

ConcurrentSkipListSetÏ൱ÓÚḬ̈߳²È«µÄTreeSet¡£ËüÊÇÓÐÐòµÄSet¡£ËüÓÉConcurrentSkipListMapʵÏÖ¡£

Map

ConcurrentHashMap£ºḬ̈߳²È«µÄHashMap¡£²ÉÓ÷ֶÎËøÊµÏÖ¸ßЧ²¢·¢¡£

ConcurrentSkipListMap£ºḬ̈߳²È«µÄÓÐÐòMap¡£Ê¹ÓÃÌø±íʵÏÖ¸ßЧ²¢·¢¡£

Queue

ConcurrentLinkedQueue£ºḬ̈߳²È«µÄÎÞ½ç¶ÓÁС£µ×²ã²ÉÓõ¥Á´±í¡£Ö§³ÖFIFO¡£

ConcurrentLinkedDeque£ºḬ̈߳²È«µÄÎÞ½çË«¶Ë¶ÓÁС£µ×²ã²ÉÓÃË«ÏòÁ´±í¡£Ö§³ÖFIFOºÍFILO¡£

ArrayBlockingQueue£ºÊý×éʵÏÖµÄ×èÈû¶ÓÁС£

LinkedBlockingQueue£ºÁ´±íʵÏÖµÄ×èÈû¶ÓÁС£

LinkedBlockingDeque£ºË«ÏòÁ´±íʵÏÖµÄË«¶Ë×èÈû¶ÓÁС£

CopyOnWriteÈÝÆ÷£¨Ð´Ê±¸´ÖÆÈÝÆ÷£©

CopyOnWriteÈÝÆ÷°üÀ¨£ºCopyOnWriteArrayListºÍCopyOnWriteArraySet¡£

PS£ºCopyOnWriteArraySetÓÐCopyOnWriteArrayListʵÏÖ¡£

ÌØÐÔ

ÊÊÓÃÓÚ¶Á²Ù×÷Ô¶Ô¶¶àÓÚд²Ù×÷£¬²¢ÇÒÊý¾ÝÁ¿½ÏСµÄÇé¿ö¡£

ÐÞ¸ÄÈÝÆ÷µÄ´ú¼ÛÊǰº¹óµÄ£¬Òò´Ë½¨ÒéÅúÁ¿Ôö¼ÓaddAll¡¢ÅúÁ¿É¾³ýremoveAll¡£

CopyOnWriteÈÝÆ÷ÊÇÈçºÎʵÏÖḬ̈߳²È«µÄ£¿

ʹÓÃvolatileÐÞÊÎÊý×éÒýÓãºÈ·±£Êý×éÒýÓõÄÄÚ´æ¿É¼ûÐÔ¡£

¶ÔÈÝÆ÷Ð޸IJÙ×÷½øÐÐͬ²½£º´Ó¶øÈ·±£Í¬Ò»Ê±¿ÌÖ»ÄÜÓÐÒ»ÌõÏß³ÌÐÞ¸ÄÈÝÆ÷£¨ÒòΪÐÞ¸ÄÈÝÆ÷¶¼»á²úÉúÒ»¸öеÄÈÝÆ÷£¬Ôö¼Óͬ²½¿É±ÜÃâͬһʱ¿Ì¸´ÖÆÉú³É¶à¸öÈÝÆ÷£¬´Ó¶øÎÞ·¨±£Ö¤Êý×éÊý¾ÝµÄÒ»ÖÂÐÔ£©

ÐÞ¸Äʱ¸´ÖÆÈÝÆ÷£ºÈ·±£ËùÓÐÐ޸IJÙ×÷¶¼×÷ÓÃÔÚÐÂÊý×éÉÏ£¬Ô­±¾µÄÊý×éÔÚ´´½¨¹ýºó¾ÍÓò»±ä»¯£¬´Ó¶øÆäËûÏ߳̿ÉÒÔ·ÅÐĵضÁ¡£

ÐÂÔö·½·¨

CopyOnWriteArrayList£º

// Ìí¼Ó¼¯ºÏÖв»´æÔÚµÄÔªËØ
int addAllAbsent(Collection<? extends E> c)
// ¸ÃÔªËØÈô²»´æÔÚÔòÌí¼Ó
boolean addIfAbsent(E e)

CopyOnWriteArraySet£ºÄ¾ÓÐÐÂÔö£¡

µü´ú

CopyOnWriteArrayListÓµÓÐÄÚ²¿ÀࣺCOWIterator£¬ËüÊÇListIteratorµÄ×ÓÀà¡£

µ±µ÷ÓÃiteratorº¯Êýʱ·µ»ØµÄÊÇCOWIterator¶ÔÏó¡£

COWIterator²»ÔÊÐíÐÞ¸ÄÈÝÆ÷£¬ÄãÈôµ÷ÓÃÔò»áÅ׳öUnsupportedOperationException¡£

Óŵã

¶Á²Ù×÷ÎÞÐè¼ÓËø£¬´Ó¶ø¸ßЧ¡£

ȱµã

Êý¾ÝÒ»ÖÂÐÔÎÊÌâ

ÓÉÓÚµü´úµÄÊÇÈÝÆ÷µ±Ç°µÄ¿ìÕÕ£¬Òò´ËÔÚµü´ú¹ý³ÌÖÐÈÝÆ÷·¢ÉúµÄÐ޸IJ¢²»ÄÜʵʱ±»µ±Ç°ÕýÔÚµü´úµÄÏ̸߳ÐÖª¡£

ÄÚ´æÕ¼ÓÃÎÊÌâ

ÓÉÓÚÐÞ¸ÄÈÝÆ÷¶¼»á¸´ÖÆÊý×飬´Ó¶øµ±Êý×鳬´óʱÐÞ¸ÄÈÝÆ÷ЧÂʺܵ͡£

PS£ºÒò´Ëдʱ¸´ÖÆÈÝÆ÷Êʺϴ洢СÈÝÁ¿Êý¾Ý¡£

ConcurrentHashMap

java.util°üÖÐÌṩÁËḬ̈߳²È«µÄHashTable£¬µ«Õâ¼Ò»ïÖ»ÊÇͨ¹ý¼òµ¥µÄͬ²½À´ÊµÏÖḬ̈߳²È«£¬Òò´ËЧÂʵ͡£Ö»ÒªÓÐÒ»ÌõÏ̻߳ñÈ¡ÁËÈÝÆ÷µÄËøÖ®ºó£¬ÆäËûËùÓеÄÏ̷߳ÃÎÊͬ²½º¯Êý¶¼»á±»×èÈû¡£Òò´Ëͬһʱ¿ÌÖ»ÄÜÓÐÒ»ÌõÏ̷߳ÃÎÊͬ²½º¯Êý¡£¶øConcurrentHashMap²ÉÓÃÁË·Ö¶ÎËø»úÖÆÊµÏÖ¸ßЧµÄ²¢·¢·ÃÎÊ¡£

·Ö¶ÎËøÔ­Àí

ConcurrentHashMapÓɶà¸öSegment¹¹³É£¬Ã¿¸öSegment¶¼°üº¬Ò»ÕŹþÏ£±í¡£Ã¿´Î²Ù×÷Ö»½«²Ù×÷Êý¾ÝËùÊôµÄSegmentËøÆðÀ´£¬´Ó¶ø±ÜÃ⽫Õû¸öËø×¡¡£

Êý¾Ý½á¹¹

ConcurrentHashMapÄÚ²¿°üº¬ÁËSegmentÊý×飬¶øÃ¿¸öSegmentÓּ̳Ð×ÔReentrantLock£¬Òò´ËËüÊÇÒ»°Ñ¿ÉÖØÈëµÄËø¡£

SegmentÄÚ²¿ÓµÓÐÒ»¸öHashEntryÊý×飬Ëü¾ÍÊÇÒ»ÕŹþÏ£±í¡£HashEntryÊǵ¥Á´±íµÄÒ»¸ö½Úµã£¬HashEntryÊý×é´æ´¢µ¥Á´±íµÄ±íÍ·½Úµã¡£

ÐÂÔöAPI

V putIfAbsent(K key, V value)

ConcurrentSkipListMap

ËüÊÇÒ»¸öÓÐÐòµÄMap£¬Ï൱ÓÚTreeMap¡£

TreeMap²ÉÓúìºÚÊ÷ʵÏÖÅÅÐò£¬¶øConcurrentHashMap²ÉÓÃÌø±íʵÏÖÓÐÐò¡£

Ìø±íµÄÓÉÀ´

×÷Ó㺴洢ÓÐÐòÐòÁУ¬²¢ÇÒʵÏÖ¸ßЧµÄ²éÕÒÓë²åÈëɾ³ý¡£

´æ´¢ÓÐÐòÐòÁÐ×î¼òµ¥µÄ°ì·¨¾ÍÊÇʹÓÃÊý×飬´Ó¶ø²éÕÒ¿ÉÒÔ²ÉÓöþ·ÖËÑË÷£¬µ«²åÈëɾ³ýÐèÒªÒÆ¶¯ÔªËؽÏΪµÍЧ¡£

Òò´Ë³öÏÖÁ˶þ²æËÑË÷Ê÷£¬ÓÃÀ´½â¾ö²åÈëɾ³ýÒÆ¶¯ÔªËصÄÎÊÌâ¡£µ«¶þ²æËÑË÷Ê÷ÔÚ×Çé¿öÏ»áÍË»¯³ÉÒ»Ìõµ¥Á´±í£¬ËÑË÷µÄЧÂʽµÎªO(n)¡£

ΪÁ˱ÜÃâ¶þ²æËÑË÷Ê÷µÄÍË»¯£¬³öÏÖÁ˶þ²æÆ½ºâÊ÷£¬ËüÔÚÿ´Î²åÈëɾ³ý½Úµãºó¶¼»áÖØÐµ÷ÕûÊ÷ÐΣ¬Ê¹µÃËüÈÔÈ»±£³Öƽºâ£¬´Ó¶ø±£Ö¤ÁËËÑË÷ЧÂÊ£¬Ò²±£Ö¤Á˲åÈëɾ³ýµÄЧÂÊ¡£

´ËÍ⣬¸ù¾ÝƽºâËã·¨µÄ²»Í¬£¬¶þ²æÆ½ºâÊ÷ÓÖ·ÖΪ£ºB+Ê÷¡¢B-Ê÷¡¢ºìºÚÊ÷¡£

µ«Æ½ºâËã·¨¹ýÓÚ¸´ÔÓ£¬Òò´Ë³öÏÖÌø±í¡£

Ìø±í½éÉÜ

Ìø±íÊÇÌõÓÐÐòµÄµ¥Á´±í£¬ËüµÄÿ¸ö½Úµã¶¼Óжà¸öÖ¸Ïòºó¼Ì½ÚµãµÄÒýÓá£

ËüÓжà¸ö²ã´Î£¬Éϲ㶼ÊÇϲãµÄ×Ó¼¯£¬´Ó¶øÄÜÌø¹ý²»±ØÒªµÄ½Úµã£¬ÌáÉýËÑË÷ËÙ¶È¡£

Ëüͨ¹ý¿Õ¼äÀ´»»È¡Ê±¼ä¡£

Èç²éÕÒ19µÄ¹ý³Ì£º

ConcurrentSkipListSet

ËüÊÇÒ»¸öÓÐÐòµÄ¡¢Ḭ̈߳²È«µÄSet£¬Ï൱ÓÚḬ̈߳²È«µÄTreeSet¡£

ËüÄÚ²¿ÓµÓÐConcurrentSkipListMapʵÀý£¬±¾ÖÊÉϾÍÊÇÒ»¸öConcurrentSkipListMap£¬Ö»²»¹ý½öʹÓÃÁËMapÖеÄkey¡£

ArrayBlockingQueue

¸ÅÒª

ArrayBlockingQueueÊÇÒ»¸ö Êý×éʵÏÖµÄ Ḭ̈߳²È«µÄ ÓÐÏÞ ×èÈû¶ÓÁС£

Êý¾Ý½á¹¹

ArrayBlockingQueue¼Ì³Ð×ÔAbstractQueue£¬²¢ÊµÏÖÁËBlockingQueue½Ó¿Ú¡£

ArrayBlockingQueueÄÚ²¿ÓÉObjectÊý×é´æ´¢ÔªËØ£¬¹¹Ôìʱ±ØÐëÒªÖ¸¶¨¶ÓÁÐÈÝÁ¿¡£

ArrayBlockingQueueÓÉReentrantLockʵÏÖ¶ÓÁеĻ¥³â·ÃÎÊ£¬²¢ÓÉnotEmpty¡¢notFullÕâÁ½¸öCondition·Ö±ðʵÏÖ¶Ó¿Õ¡¢¶ÓÂúµÄ×èÈû¡£

ReentrantLock·ÖΪ¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£¬¿ÉÒÔÔÚ¹¹ÔìArrayBlockingQueueʱָ¶¨¡£Ä¬ÈÏΪ·Ç¹«Æ½Ëø¡£

ÐÂÔöAPI

// ÔÚ¶ÓβÌí¼ÓÖ¸¶¨ÔªËØ£¬Èô¶ÓÒÑÂúÔòµÈ´ýÖ¸¶¨Ê±¼ä
boolean offer(E e, long timeout, TimeUnit unit)
// »ñÈ¡²¢É¾³ý¶ÓÊ×ÔªËØ£¬Èô¶ÓΪ¿ÕÔò×èÈûµÈ´ý
E take()
// Ìí¼ÓÖ¸¶¨ÔªËØ£¬Èô¶ÓÒÑÂúÔòÒ»Ö±µÈ´ý
void put(E e)
// »ñÈ¡¶ÓÊ×ÔªËØ£¬Èô¶ÓΪ¿Õ£¬ÔòµÈ´ýÖ¸¶¨Ê±¼ä
E poll(long timeout, TimeUnit unit)

¶ÓÂú¡¢¶Ó¿Õ×èÈû»½ÐѵÄÔ­Àí

¶ÓÂú×èÈû£ºµ±Ìí¼ÓÔªËØÊ±£¬Èô¶ÓÂú£¬Ôòµ÷ÓÃnotFull.await()×èÈûµ±Ç°Ị̈߳»µ±ÒƳýÒ»¸öÔªËØÊ±µ÷ÓÃnotFull.signal()»½ÐÑÔÚnotFullÉϵȴýµÄÏ̡߳£

¶Ó¿Õ×èÈû£ºµ±É¾³ýÔªËØÊ±£¬Èô¶ÓΪ¿Õ£¬Ôòµ÷ÓÃnotEmpty.await()×èÈûµ±Ç°Ị̈߳»µ±¶ÓÊ×Ìí¼ÓÔªËØÊ±£¬µ÷ÓÃnotEmpty.signal()»½ÐÑÔÚnotEmptyÉϵȴýµÄÏ̡߳£

LinkedBlockingQueue

¸ÅÒª

LinkedBlockingQueueÊÇÒ»¸ö µ¥Á´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ÎÞÏÞ ×èÈû¶ÓÁС£

Êý¾Ý½á¹¹

LinkedBlockingQueue¼Ì³Ð×ÔAbstractQueue£¬ÊµÏÖÁËBlockingQueue½Ó¿Ú¡£

LinkedBlockingQueueÓɵ¥Á´±íʵÏÖ£¬Òò´ËÊǸöÎÞÏÞ¶ÓÁС£µ«ÎªÁË·½Ê½ÎÞÏÞÅòÕÍ£¬¹¹Ôìʱ¿ÉÒÔ¼ÓÉÏÈÝÁ¿¼ÓÒÔÏÞÖÆ¡£

LinkedBlockingQueue·Ö±ð²ÉÓöÁÈ¡ËøºÍ²åÈëËø¿ØÖƶÁÈ¡/ɾ³ý ºÍ ²åÈë¹ý³ÌµÄ²¢·¢·ÃÎÊ£¬²¢²ÉÓÃnotEmptyºÍnotFullÁ½¸öConditionʵÏÖ¶ÓÂú¶Ó¿ÕµÄ×èÈûÓ뻽ÐÑ¡£

¶ÓÂú¶Ó¿Õ×èÈû»½ÐѵÄÔ­Àí

¶ÓÂú×èÈû£ºÈôÒª²åÈëÔªËØ£¬Ê×ÏÈÐèÒª»ñÈ¡putLock£»ÔÚ´Ë»ù´¡ÉÏ£¬Èô´Ëʱ¶ÓÂú£¬Ôòµ÷ÓÃnotFull.await()£¬×èÈûµ±Ç°Ị̈߳»µ±ÒƳýÒ»¸öÔªËØºóµ÷ÓÃnotFull.signal()»½ÐÑÔÚnotFullÉϵȴýµÄỊ̈߳»×îºó£¬µ±²åÈë²Ù×÷Íê³ÉºóÊÍ·ÅputLock¡£

¶Ó¿Õ×èÈû£ºÈôҪɾ³ý/»ñÈ¡ÔªËØ£¬Ê×ÏÈÒª»ñÈ¡takeLock£»ÔÚ´Ë»ù´¡ÉÏ£¬Èô¶ÓΪ¿Õ£¬Ôòµ÷ÓÃnotEmpty.await()£¬×èÈûµ±Ç°Ị̈߳»µ±²åÈëÒ»¸öÔªËØºóµ÷ÓÃnotEmpty.signal()»½ÐÑÔÚnotEmptyÉϵȴýµÄỊ̈߳»×îºó£¬µ±É¾³ý²Ù×÷Íê³ÉºóÊÍ·ÅtakeLock¡£

PS£ºAPIºÍArrayBlockingQueueÒ»Ñù¡£

LinkedBlockingDeque

¸ÅÒª

ËüÊÇÒ»¸ö ÓÉË«ÏòÁ´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ Ë«¶Ë ÎÞÏÞ ×èÈû¶ÓÁС£

Êý¾Ý½á¹¹

ConcurrentLinkedQueue

¸ÅÊö

ËüÊÇÒ»¸öÓɵ¥Á´±íʵÏֵġ¢Ḭ̈߳²È«µÄ¡¢ÎÞÏÞ ¶ÓÁС£

Êý¾Ý½á¹¹

Ëü½ö½ö¼Ì³ÐÁËAbstractQueue£¬²¢Î´ÊµÏÖBlockingQueue½Ó¿Ú£¬Òò´ËËü²»ÊÇ×èÈû¶ÓÁУ¬½ö½öÊǸöḬ̈߳²È«µÄÆÕͨ¶ÓÁС£

ÌØÐÔ

head¡¢tail¡¢next¡¢item¾ùʹÓÃvolatileÐÞÊΣ¬±£Ö¤ÆäÄÚ´æ¿É¼ûÐÔ£¬²¢Î´Ê¹ÓÃËø£¬´Ó¶øÌá¸ß²¢·¢Ð§ÂÊ¡£

PS£ºËü¾¿¾¹ÊÇÔõÑùÔÚ²»Ê¹ÓÃËøµÄÇé¿öÏÂʵÏÖḬ̈߳²È«µÄ£¿

   
1892 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

Java ÖеÄÖÐÎıàÂëÎÊÌâ
Java»ù´¡ÖªÊ¶µÄÈýÊ®¸ö¾­µäÎÊ´ð
Íæ×ª Java Web Ó¦Óÿª·¢
ʹÓÃSpring¸üºÃµØ´¦ÀíStruts
ÓÃEclipse¿ª·¢iPhone WebÓ¦ÓÃ
²å¼þϵͳ¿ò¼Ü·ÖÎö

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

Struts+Spring+Hibernate/EJB+ÐÔÄÜÓÅ»¯
»ªÏÄ»ù½ð ActiveMQ Ô­ÀíÓë¹ÜÀí
ijÃñº½¹«Ë¾ Java»ù´¡±à³Ìµ½Ó¦Óÿª·¢
ij·çµç¹«Ë¾ Java Ó¦Óÿª·¢Æ½Ì¨ÓëÇ¨ÒÆ
ÈÕÕÕ¸Û J2EEÓ¦Óÿª·¢¼¼Êõ¿ò¼ÜÓëʵ¼ù
ij¿ç¹ú¹«Ë¾ ¹¤×÷Á÷¹ÜÀíJBPM
¶«·½º½¿Õ¹«Ë¾ ¸ß¼¶J2EE¼°ÆäÇ°ÑØ¼¼Êõ