±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚimportnew£¬½éÉÜÁËÏ̵߳Ä״̬£¬Ã¿¸ö¶ÔÏó¶¼Óеķ½·¨£¬»ù±¾Ïß³ÌÀ࣬¸ß¼¶¶àÏ߳̿ØÖÆÀàµÈ֪ʶ¡£ |
|
Òý
Èç¹û¶ÔʲôÊÇÏ̡߳¢Ê²Ã´Êǽø³ÌÈÔ´æÓÐÒÉ»ó£¬ÇëÏÈGoogleÖ®£¬ÒòΪÕâÁ½¸ö¸ÅÄî²»ÔÚ±¾Îĵķ¶Î§Ö®ÄÚ¡£
ÓöàÏß³ÌÖ»ÓÐÒ»¸öÄ¿µÄ£¬ÄǾÍÊǸüºÃµÄÀûÓÃcpuµÄ×ÊÔ´£¬ÒòΪËùÓеĶàÏ̴߳úÂë¶¼¿ÉÒÔÓõ¥Ïß³ÌÀ´ÊµÏÖ¡£ËµÕâ¸ö»°ÆäʵֻÓÐÒ»°ë¶Ô£¬ÒòΪ·´Ó¦¡°¶à½ÇÉ«¡±µÄ³ÌÐò´úÂ룬×îÆðÂëÿ¸ö½ÇɫҪ¸øËûÒ»¸öḬ̈߳ɣ¬·ñÔòÁ¬Êµ¼Ê³¡¾°¶¼ÎÞ·¨Ä£Ä⣬µ±È»Ò²Ã»·¨ËµÄÜÓõ¥Ïß³ÌÀ´ÊµÏÖ£º±ÈÈç×î³£¼ûµÄ¡°Éú²úÕߣ¬Ïû·ÑÕßÄ£ÐÍ¡±¡£
ºÜ¶àÈ˶¼¶ÔÆäÖеÄһЩ¸ÅÄî²»¹»Ã÷È·£¬Èçͬ²½¡¢²¢·¢µÈµÈ£¬ÈÃÎÒÃÇÏȽ¨Á¢Ò»¸öÊý¾Ý×ֵ䣬ÒÔÃâ²úÉúÎó»á¡£
¶àỊ̈߳ºÖ¸µÄÊÇÕâ¸ö³ÌÐò£¨Ò»¸ö½ø³Ì£©ÔËÐÐʱ²úÉúÁ˲»Ö¹Ò»¸öÏß³Ì
²¢ÐÐÓë²¢·¢£º
²¢ÐУº¶à¸öcpuʵÀý»òÕß¶ą̀»úÆ÷ͬʱִÐÐÒ»¶Î´¦ÀíÂß¼£¬ÊÇÕæÕýµÄͬʱ¡£
²¢·¢£ºÍ¨¹ýcpuµ÷¶ÈËã·¨£¬ÈÃÓû§¿´ÉÏȥͬʱִÐУ¬Êµ¼ÊÉÏ´Ócpu²Ù×÷²ãÃæ²»ÊÇÕæÕýµÄͬʱ¡£²¢·¢ÍùÍùÔÚ³¡¾°ÖÐÓй«ÓõÄ×ÊÔ´£¬ÄÇôÕë¶ÔÕâ¸ö¹«ÓõÄ×ÊÔ´ÍùÍù²úÉúÆ¿¾±£¬ÎÒÃÇ»áÓÃTPS»òÕßQPSÀ´·´Ó¦Õâ¸öϵͳµÄ´¦ÀíÄÜÁ¦¡£

²¢·¢Óë²¢ÐÐ
Ḭ̈߳²È«£º¾³£ÓÃÀ´Ãè»æÒ»¶Î´úÂë¡£Ö¸ÔÚ²¢·¢µÄÇé¿ö֮ϣ¬¸Ã´úÂë¾¹ý¶àÏß³ÌʹÓã¬Ï̵߳ĵ÷¶È˳Ðò²»Ó°ÏìÈκνá¹û¡£Õâ¸öʱºòʹÓöàỊ̈߳¬ÎÒÃÇÖ»ÐèÒª¹Ø×¢ÏµÍ³µÄÄڴ棬cpuÊDz»Êǹ»Óü´¿É¡£·´¹ýÀ´£¬Ï̲߳»°²È«¾ÍÒâζ×ÅÏ̵߳ĵ÷¶È˳Ðò»áÓ°Ïì×îÖÕ½á¹û£¬Èç²»¼ÓÊÂÎñµÄתÕË´úÂ룺
void transferMoney(User
from, User to, float amount ){
to.setMoney (to.getBalance() + amount);
from.setMoney (from.getBalance() - amount);
} |
ͬ²½£ºJavaÖеÄͬ²½Ö¸µÄÊÇͨ¹ýÈËΪµÄ¿ØÖƺ͵÷¶È£¬±£Ö¤¹²Ïí×ÊÔ´µÄ¶àÏ̷߳ÃÎʳÉΪḬ̈߳²È«£¬À´±£Ö¤½á¹ûµÄ׼ȷ¡£ÈçÉÏÃæµÄ´úÂë¼òµ¥¼ÓÈë@synchronized¹Ø¼ü×Ö¡£ÔÚ±£Ö¤½á¹û׼ȷµÄͬʱ£¬Ìá¸ßÐÔÄÜ£¬²ÅÊÇÓÅÐãµÄ³ÌÐò¡£Ḭ̈߳²È«µÄÓÅÏȼ¶¸ßÓÚÐÔÄÜ¡£
ºÃÁË£¬ÈÃÎÒÃÇ¿ªÊ¼°É¡£ÎÒ×¼±¸·Ö³É¼¸²¿·ÖÀ´×ܽáÉæ¼°µ½¶àÏ̵߳ÄÄÚÈÝ£º
1.ÔúºÃÂí²½£ºÏ̵߳Ä״̬
2.ÄÚ¹¦ÐÄ·¨£ºÃ¿¸ö¶ÔÏó¶¼Óеķ½·¨£¨»úÖÆ£©
3.Ì«×æ³¤È£º»ù±¾Ïß³ÌÀà
4.¾ÅÒõÕæ¾£º¸ß¼¶¶àÏ߳̿ØÖÆÀà
ÔúºÃÂí²½£ºÏ̵߳Ä״̬
ÏÈÀ´Á½ÕÅͼ£º

Ïß³Ì״̬

Ïß³Ì״̬ת»»
¸÷ÖÖ״̬һĿÁËÈ»£¬ÖµµÃÒ»ÌáµÄÊÇ¡±blocked¡±Õâ¸ö״̬£º
Ïß³ÌÔÚRunningµÄ¹ý³ÌÖпÉÄÜ»áÓöµ½×èÈû(Blocked)Çé¿ö
1.µ÷ÓÃjoin()ºÍsleep()·½·¨£¬sleep()ʱ¼ä½áÊø»ò±»´ò¶Ï£¬join()ÖжÏ,IOÍê³É¶¼»á»Øµ½Runnable״̬£¬µÈ´ýJVMµÄµ÷¶È¡£
2.µ÷ÓÃwait()£¬Ê¹¸ÃÏ̴߳¦Óڵȴý³Ø(wait blocked
pool),Ö±µ½notify()/notifyAll()£¬Ï̱߳»»½Ðѱ»·Åµ½Ëø¶¨³Ø(lock blocked
pool )£¬ÊÍ·Åͬ²½ËøÊ¹Ï̻߳ص½¿ÉÔËÐÐ״̬£¨Runnable£©
3.¶ÔRunning״̬µÄÏ̼߳Óͬ²½Ëø(Synchronized)ʹÆä½øÈë(lock
blocked pool ),ͬ²½Ëø±»ÊͷŽøÈë¿ÉÔËÐÐ״̬(Runnable)¡£
´ËÍ⣬ÔÚrunnable״̬µÄÏß³ÌÊÇ´¦ÓÚ±»µ÷¶ÈµÄỊ̈߳¬´ËʱµÄµ÷¶È˳ÐòÊDz»Ò»¶¨µÄ¡£ThreadÀàÖеÄyield·½·¨¿ÉÒÔÈÃÒ»¸örunning״̬µÄÏß³ÌתÈërunnable¡£
ÄÚ¹¦ÐÄ·¨£ºÃ¿¸ö¶ÔÏó¶¼Óеķ½·¨£¨»úÖÆ£©
synchronized, wait, notify ÊÇÈκζÔÏó¶¼¾ßÓеÄͬ²½¹¤¾ß¡£ÈÃÎÒÃÇÏÈÀ´Á˽âËûÃÇ

monitor
ËûÃÇÊÇÓ¦ÓÃÓÚͬ²½ÎÊÌâµÄÈ˹¤Ï̵߳÷¶È¹¤¾ß¡£½²Æä±¾ÖÊ£¬Ê×ÏȾÍÒªÃ÷È·monitorµÄ¸ÅÄJavaÖеÄÿ¸ö¶ÔÏó¶¼ÓÐÒ»¸ö¼àÊÓÆ÷£¬À´¼à²â²¢·¢´úÂëµÄÖØÈë¡£ÔڷǶàÏ̱߳àÂëʱ¸Ã¼àÊÓÆ÷²»·¢»Ó×÷Ó㬷´Ö®Èç¹ûÔÚsynchronized
·¶Î§ÄÚ£¬¼àÊÓÆ÷·¢»Ó×÷Óá£
wait/notify±ØÐë´æÔÚÓÚsynchronized¿éÖС£²¢ÇÒ£¬ÕâÈý¸ö¹Ø¼ü×ÖÕë¶ÔµÄÊÇͬһ¸ö¼àÊÓÆ÷£¨Ä³¶ÔÏóµÄ¼àÊÓÆ÷£©¡£ÕâÒâζ×ÅwaitÖ®ºó£¬ÆäËûÏ߳̿ÉÒÔ½øÈëͬ²½¿éÖ´ÐС£
µ±Ä³´úÂë²¢²»³ÖÓмàÊÓÆ÷µÄʹÓÃȨʱ£¨ÈçͼÖÐ5µÄ״̬£¬¼´ÍÑÀëͬ²½¿é£©È¥wait»ònotify£¬»áÅ׳öjava.lang.IllegalMonitorStateException¡£Ò²°üÀ¨ÔÚsynchronized¿éÖÐÈ¥µ÷ÓÃÁíÒ»¸ö¶ÔÏóµÄwait/notify£¬ÒòΪ²»Í¬¶ÔÏóµÄ¼àÊÓÆ÷²»Í¬£¬Í¬Ñù»áÅ׳ö´ËÒì³£¡£
ÔÙ½²Ó÷¨£º
synchronizedµ¥¶ÀʹÓãº
´úÂë¿é£ºÈçÏ£¬ÔÚ¶àÏ̻߳·¾³Ï£¬synchronized¿éÖеķ½·¨»ñÈ¡ÁËlockʵÀýµÄmonitor£¬Èç¹ûʵÀýÏàͬ£¬ÄÇôֻÓÐÒ»¸öÏß³ÌÄÜÖ´ÐиÿéÄÚÈÝ
public class
Thread1 implements Runnable {
Object lock;
public void run() {
synchronized(lock){
..do something
}
}
} |
Ö±½ÓÓÃÓÚ·½·¨£º Ï൱ÓÚÉÏÃæ´úÂëÖÐÓÃlockÀ´Ëø¶¨µÄЧ¹û£¬Êµ¼Ê»ñÈ¡µÄÊÇThread1ÀàµÄmonitor¡£¸ü½øÒ»²½£¬Èç¹ûÐÞÊεÄÊÇstatic·½·¨£¬ÔòËø¶¨¸ÃÀàËùÓÐʵÀý¡£
public class Thread1 implements Runnable
{
public synchronized void run () {
..do something
}
} |
synchronized, wait, notify½áºÏ:µäÐͳ¡¾°Éú²úÕßÏû·ÑÕßÎÊÌâ
/**
* Éú²úÕßÉú²ú³öÀ´µÄ²úÆ·½»¸øµêÔ±
*/
public synchronized void produce ()
{
if(this.product > = MAX_PRODUCT)
{
try
{
wait();
System.out.println ("²úÆ·ÒÑÂú,ÇëÉÔºòÔÙÉú²ú");
}
catch (InterruptedException e)
{
e.printStackTrace ();
}
return;
}
this.product++;
System.out.println ("Éú²úÕßÉú²úµÚ" + this.product
+ "¸ö²úÆ·.");
notifyAll(); //֪ͨµÈ´ýÇøµÄÏû·ÑÕß¿ÉÒÔÈ¡³ö²úÆ·ÁË
}
/**
* Ïû·ÑÕß´ÓµêԱȡ²úÆ·
*/
public synchronized void consume ()
{
if(this.product < = MIN_PRODUCT)
{
try
{
wait();
System.out.println ("ȱ»õ,ÉÔºòÔÙÈ¡");
}
catch (InterruptedException e)
{
e.printStackTrace ( );
}
return;
}
System.out.println ("Ïû·ÑÕßÈ¡×ßÁ˵Ú" + this.product
+ " ¸ö²úÆ·.");
this.product--;
notifyAll(); //֪ͨµÈ´ýÈ¥µÄÉú²úÕß¿ÉÒÔÉú²ú²úÆ·ÁË
} |
volatile
¶àÏ̵߳ÄÄÚ´æÄ£ÐÍ£ºmain memory£¨Ö÷´æ£©¡¢working memory£¨Ïß³ÌÕ»£©£¬ÔÚ´¦ÀíÊý¾Ýʱ£¬Ï̻߳á°ÑÖµ´ÓÖ÷´æloadµ½±¾µØÕ»£¬Íê³É²Ù×÷ºóÔÙsave»ØÈ¥(volatile¹Ø¼ü´ÊµÄ×÷ÓãºÃ¿´ÎÕë¶Ô¸Ã±äÁ¿µÄ²Ù×÷¶¼¼¤·¢Ò»´Îload
and save)¡£

volatile
Õë¶Ô¶àÏß³ÌʹÓõıäÁ¿Èç¹û²»ÊÇvolatile»òÕßfinalÐÞÊεģ¬ºÜÓпÉÄܲúÉú²»¿ÉÔ¤ÖªµÄ½á¹û£¨ÁíÒ»¸öÏß³ÌÐÞ¸ÄÁËÕâ¸öÖµ£¬µ«ÊÇÖ®ºóÔÚijÏ߳̿´µ½µÄÊÇÐÞ¸Ä֮ǰµÄÖµ£©¡£ÆäʵµÀÀíÉϽ²Í¬Ò»ÊµÀýµÄͬһÊôÐÔ±¾ÉíÖ»ÓÐÒ»¸ö¸±±¾¡£µ«ÊǶàÏß³ÌÊǻỺ´æÖµµÄ£¬±¾ÖÊÉÏ£¬volatile¾ÍÊDz»È¥»º´æ£¬Ö±½Óȡֵ¡£ÔÚḬ̈߳²È«µÄÇé¿öϼÓvolatile»áÎþÉüÐÔÄÜ¡£
Ì«×æ³¤È£º»ù±¾Ïß³ÌÀà
»ù±¾Ïß³ÌÀàÖ¸µÄÊÇThreadÀ࣬Runnable½Ó¿Ú£¬Callable½Ó¿Ú
Thread ÀàʵÏÖÁËRunnable½Ó¿Ú£¬Æô¶¯Ò»¸öÏ̵߳ķ½·¨£º
MyThread my = new MyThread();
¡¡¡¡my.start(); |
ThreadÀàÏà¹Ø·½·¨£º
//µ±Ç°Ï߳̿ÉתÈÃcpu¿ØÖÆÈ¨
£¬ÈñðµÄ¾ÍÐ÷״̬Ïß³ÌÔËÐУ¨Çл» £©
public static Thread.yield ()
//ÔÝÍ£Ò»¶Îʱ¼ä
public static Thread.sleep ()
//ÔÚÒ»¸öÏß³ÌÖе÷ÓÃother.join (),½«µÈ´ýotherÖ´ÐÐÍêºó²Å¼ÌÐø±¾Ï̡߳£¡¡¡¡¡¡¡¡
public join ()
//ºóÁ½¸öº¯Êý½Ô¿ÉÒÔ±»´ò¶Ï
public interrupte () |
¹ØÓÚÖжϣºËü²¢²»Ïñstop·½·¨ÄÇÑù»áÖжÏÒ»¸öÕýÔÚÔËÐеÄÏ̡߳£Ï̻߳᲻ʱµØ¼ì²âÖжϱêʶ룬ÒÔÅжÏÏß³ÌÊÇ·ñÓ¦¸Ã±»Öжϣ¨ÖжϱêʶֵÊÇ·ñΪtrue£©¡£ÖÕ¶ËÖ»»áÓ°Ïìµ½wait״̬¡¢sleep״̬ºÍjoin״̬¡£±»´ò¶ÏµÄÏ̻߳áÅ׳öInterruptedException¡£
Thread.interrupted()¼ì²éµ±Ç°Ïß³ÌÊÇ·ñ·¢ÉúÖжϣ¬·µ»Øboolean
synchronizedÔÚ»ñËøµÄ¹ý³ÌÖÐÊDz»Äܱ»Öжϵġ£
ÖжÏÊÇÒ»¸ö״̬£¡interrupt()·½·¨Ö»Êǽ«Õâ¸ö״̬ÖÃΪtrue¶øÒÑ¡£ËùÒÔ˵Õý³£ÔËÐеijÌÐò²»È¥¼ì²â״̬£¬¾Í²»»áÖÕÖ¹£¬¶øwaitµÈ×èÈû·½·¨»áÈ¥¼ì²é²¢Å׳öÒì³£¡£Èç¹ûÔÚÕý³£ÔËÐеijÌÐòÖÐÌí¼Ówhile(!Thread.interrupted())
£¬ÔòͬÑù¿ÉÒÔÔÚÖжϺóÀ뿪´úÂëÌå
ThreadÀà×î¼Ñʵ¼ù£º
дµÄʱºò×îºÃÒªÉèÖÃÏß³ÌÃû³Æ Thread.name£¬²¢ÉèÖÃÏß³Ì×é ThreadGroup£¬Ä¿µÄÊÇ·½±ã¹ÜÀí¡£ÔÚ³öÏÖÎÊÌâµÄʱºò£¬´òÓ¡Ïß³ÌÕ»
(jstack -pid) Ò»Ñ۾ͿÉÒÔ¿´³öÊÇÄĸöÏ̳߳öµÄÎÊÌ⣬Õâ¸öÏß³ÌÊǸÉʲôµÄ¡£
ÈçºÎ»ñÈ¡Ïß³ÌÖеÄÒì³£

²»ÄÜÓÃtry,catchÀ´»ñÈ¡Ïß³ÌÖеÄÒì³£
Runnable
ÓëThreadÀàËÆ
Callable
futureģʽ£º²¢·¢Ä£Ê½µÄÒ»ÖÖ£¬¿ÉÒÔÓÐÁ½ÖÖÐÎʽ£¬¼´ÎÞ×èÈûºÍ×èÈû£¬·Ö±ðÊÇisDoneºÍget¡£ÆäÖÐFuture¶ÔÏóÓÃÀ´´æ·Å¸ÃÏ̵߳ķµ»ØÖµÒÔ¼°×´Ì¬
ExecutorService
e = Executors .newFixedThreadPool (3);
// submit·½·¨ÓжàÖØ²ÎÊý°æ±¾£¬¼°Ö§³ÖcallableÒ²Äܹ»Ö§³Örunnable½Ó¿ÚÀàÐÍ.
Future future = e.submit (new myCallable());
future.isDone() // return true,false ÎÞ×èÈû
future.get() // return ·µ»ØÖµ£¬×èÈûÖ±µ½¸ÃÏß³ÌÔËÐнáÊø |
¾ÅÒõÕæ¾£º¸ß¼¶¶àÏ߳̿ØÖÆÀà
ÒÔÉ϶¼ÊôÓÚÄÚ¹¦ÐÄ·¨£¬½ÓÏÂÀ´ÊÇʵ¼ÊÏîÄ¿Öг£Óõ½µÄ¹¤¾ßÁË£¬Java1.5ÌṩÁËÒ»¸ö·Ç³£¸ßЧʵÓõĶàḬ̈߳ü:java.util.concurrent,
ÌṩÁË´óÁ¿¸ß¼¶¹¤¾ß,¿ÉÒÔ°ïÖú¿ª·¢Õß±àд¸ßЧ¡¢Ò×ά»¤¡¢½á¹¹ÇåÎúµÄJava¶àÏ̳߳ÌÐò¡£
1.ThreadLocalÀà
Óô¦£º±£´æÏ̵߳ĶÀÁ¢±äÁ¿¡£¶ÔÒ»¸öÏß³ÌÀࣨ¼Ì³Ð×ÔThread)
µ±Ê¹ÓÃThreadLocalά»¤±äÁ¿Ê±£¬ThreadLocalΪÿ¸öʹÓøñäÁ¿µÄÏß³ÌÌṩ¶ÀÁ¢µÄ±äÁ¿¸±±¾£¬ËùÒÔÿһ¸öÏ̶߳¼¿ÉÒÔ¶ÀÁ¢µØ¸Ä±ä×Ô¼ºµÄ¸±±¾£¬¶ø²»»áÓ°ÏìÆäËüÏß³ÌËù¶ÔÓ¦µÄ¸±±¾¡£³£ÓÃÓÚÓû§µÇ¼¿ØÖÆ£¬Èç¼Ç¼sessionÐÅÏ¢¡£
ʵÏÖ£ºÃ¿¸öThread¶¼³ÖÓÐÒ»¸öTreadLocalMapÀàÐ͵ıäÁ¿£¨¸ÃÀàÊÇÒ»¸öÇáÁ¿¼¶µÄMap£¬¹¦ÄÜÓëmapÒ»Ñù£¬Çø±ðÊÇͰÀï·ÅµÄÊÇentry¶ø²»ÊÇentryµÄÁ´±í¡£¹¦ÄÜ»¹ÊÇÒ»¸ömap¡££©ÒÔ±¾ÉíΪkey£¬ÒÔÄ¿±êΪvalue¡£
Ö÷Òª·½·¨ÊÇget()ºÍset(T a)£¬setÖ®ºóÔÚmapÀïά»¤Ò»¸öthreadLocal ->
a£¬getʱ½«a·µ»Ø¡£ThreadLocalÊÇÒ»¸öÌØÊâµÄÈÝÆ÷¡£
2.Ô×ÓÀࣨAtomicInteger¡¢AtomicBoolean¡¡£©
Èç¹ûʹÓÃatomic wrapper classÈçatomicInteger£¬»òÕßʹÓÃ×Ô¼º±£Ö¤Ô×ӵIJÙ×÷£¬ÔòµÈͬÓÚsynchronized
//·µ»ØÖµÎªboolean
AtomicInteger.compareAndSet (int expect,int update) |
¸Ã·½·¨¿ÉÓÃÓÚʵÏÖÀÖ¹ÛËø£¬¿¼ÂÇÎÄÖÐ×î³õÌáµ½µÄÈçϳ¡¾°£ºa¸øb¸¶¿î10Ôª£¬a¿ÛÁË10Ôª£¬bÒª¼Ó10Ôª¡£´Ëʱc¸øb2Ôª£¬µ«ÊÇbµÄ¼ÓʮԪ´úÂëԼΪ£º
if (b.value.compareAndSet(old,
value) ){
return ;
}else {
//try again
// if that fails, rollback and log
} |
AtomicReference
¶ÔÓÚAtomicReference À´½²£¬Ò²Ðí¶ÔÏó»á³öÏÖ£¬ÊôÐÔ¶ªÊ§µÄÇé¿ö£¬¼´oldObject ==
current£¬µ«ÊÇoldObject.getPropertyA != current.getPropertyA¡£
Õâʱºò£¬AtomicStampedReference¾ÍÅÉÉÏÓó¡ÁË¡£ÕâÒ²ÊÇÒ»¸öºÜ³£ÓõÄ˼·£¬¼´¼ÓÉϰ汾ºÅ
3.LockÀà
lock: ÔÚjava.util.concurrent°üÄÚ¡£¹²ÓÐÈý¸öʵÏÖ£º
ReentrantLock
ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock
Ö÷ҪĿµÄÊǺÍsynchronizedÒ»Ñù£¬ Á½Õß¶¼ÊÇΪÁ˽â¾öͬ²½ÎÊÌ⣬´¦Àí×ÊÔ´Õù¶Ë¶ø²úÉúµÄ¼¼Êõ¡£¹¦ÄÜÀàËÆµ«ÓÐÒ»Ð©Çø±ð¡£
Çø±ðÈçÏ£º
1.lock¸üÁé»î£¬¿ÉÒÔ×ÔÓɶ¨Òå¶à°ÑËøµÄ¼ÏËø½âËøË³Ðò£¨synchronizedÒª°´ÕÕÏȼӵĺó½â˳Ðò£©
2.Ìṩ¶àÖÖ¼ÓËø·½°¸£¬lock ×èÈûʽ, trylock ÎÞ×èÈûʽ,
lockInterruptily ¿É´ò¶Ïʽ£¬ »¹ÓÐtrylockµÄ´ø³¬Ê±Ê±¼ä°æ±¾¡£
3.±¾ÖÊÉϺͼàÊÓÆ÷Ëø£¨¼´synchronizedÊÇÒ»ÑùµÄ£©
4.ÄÜÁ¦Ô½´ó£¬ÔðÈÎÔ½´ó£¬±ØÐë¿ØÖÆºÃ¼ÓËøºÍ½âËø£¬·ñÔò»áµ¼ÖÂÔÖÄÑ¡£
5.ºÍConditionÀàµÄ½áºÏ¡£
6.ÐÔÄܸü¸ß£¬¶Ô±ÈÈçÏÂͼ£º

synchronizedºÍLockÐÔÄܶԱÈ
ReentrantLock
¿ÉÖØÈëµÄÒâÒåÔÚÓÚ³ÖÓÐËøµÄÏ߳̿ÉÒÔ¼ÌÐø³ÖÓУ¬²¢ÇÒÒªÊͷŶԵȵĴÎÊýºó²ÅÕæÕýÊͷŸÃËø¡£
ʹÓ÷½·¨ÊÇ£º
1.ÏÈnewÒ»¸öʵÀý
static ReentrantLock
r = new ReentrantLock(); |
2.¼ÓËø
r.lock ()»òr
.lockInterruptibly(); |
´Ë´¦Ò²ÊǸö²»Í¬£¬ºóÕ߿ɱ»´ò¶Ï¡£µ±aÏß³Ìlockºó£¬bÏß³Ì×èÈû£¬´ËʱÈç¹ûÊÇlockInterruptibly£¬ÄÇôÔÚµ÷ÓÃb.interrupt()Ö®ºó£¬bÏß³ÌÍ˳ö×èÈû£¬²¢·ÅÆú¶Ô×ÊÔ´µÄÕùÇÀ£¬½øÈëcatch¿é¡££¨Èç¹ûʹÓúóÕߣ¬±ØÐëthrow
interruptable exception »òcatch£©
3.ÊÍ·ÅËø
±ØÐë×ö£¡ºÎΪ±ØÐë×öÄØ£¬Òª·ÅÔÚfinallyÀïÃæ¡£ÒÔ·ÀÖ¹Òì³£Ìø³öÁËÕý³£Á÷³Ì£¬µ¼ÖÂÔÖÄÑ¡£ÕâÀï²¹³äÒ»¸öС֪ʶµã£¬finallyÊÇ¿ÉÒÔÐÅÈεģº¾¹ý²âÊÔ£¬ÄÄÅÂÊÇ·¢ÉúÁËOutofMemoryError£¬finally¿éÖеÄÓï¾äÖ´ÐÐÒ²Äܹ»µÃµ½±£Ö¤¡£
ReentrantReadWriteLock
¿ÉÖØÈë¶ÁÐ´Ëø£¨¶ÁÐ´ËøµÄÒ»¸öʵÏÖ£©
ReentrantReadWriteLock
lock = new ReentrantReadWriteLock()
¡¡¡¡ReadLock r = lock.readLock();
¡¡¡¡WriteLock w = lock.writeLock(); |
Á½Õß¶¼ÓÐlock,unlock·½·¨¡£Ð´Ð´£¬Ð´¶Á»¥³â£»¶Á¶Á²»»¥³â¡£¿ÉÒÔʵÏÖ²¢·¢¶ÁµÄ¸ßЧḬ̈߳²È«´úÂë
4.ÈÝÆ÷Àà
ÕâÀï¾ÍÌÖÂ۱Ƚϳ£ÓõÄÁ½¸ö£º
BlockingQueue
ConcurrentHashMap
BlockingQueue
×èÈû¶ÓÁС£¸ÃÀàÊÇjava.util.concurrent°üϵÄÖØÒªÀ࣬ͨ¹ý¶ÔQueueµÄѧϰ¿ÉÒÔµÃÖª£¬Õâ¸öqueueÊǵ¥Ïò¶ÓÁУ¬¿ÉÒÔÔÚ¶ÓÁÐÍ·Ìí¼ÓÔªËØºÍÔÚ¶Óβɾ³ý»òÈ¡³öÔªËØ¡£ÀàËÆÓÚÒ»¸ö¹Ü¡¡¡¡µÀ£¬ÌرðÊÊÓÃÓÚÏȽøÏȳö²ßÂÔµÄһЩӦÓó¡¾°¡£ÆÕͨµÄqueue½Ó¿ÚÖ÷ҪʵÏÖÓÐPriorityQueue£¨ÓÅÏȶÓÁУ©£¬ÓÐÐËȤ¿ÉÒÔÑо¿
BlockingQueueÔÚ¶ÓÁеĻù´¡ÉÏÌí¼ÓÁ˶àÏß³ÌÐ×÷µÄ¹¦ÄÜ£º

BlockingQueue
³ýÁË´«Í³µÄqueue¹¦ÄÜ£¨±í¸ñ×ó±ßµÄÁ½ÁУ©Ö®Í⣬»¹ÌṩÁË×èÈû½Ó¿ÚputºÍtake£¬´ø³¬Ê±¹¦ÄܵÄ×èÈû½Ó¿ÚofferºÍpoll¡£put»áÔÚ¶ÓÁÐÂúµÄʱºò×èÈû£¬Ö±µ½Óпռäʱ±»»½ÐÑ£»takeÔÚ¶Ó¡¡ÁпյÄʱºò×èÈû£¬Ö±µ½Óж«Î÷ÄõÄʱºò²Å±»»½ÐÑ¡£ÓÃÓÚÉú²úÕß-Ïû·ÑÕßÄ£ÐÍÓÈÆäºÃÓ㬿°³ÆÉñÆ÷¡£
³£¼ûµÄ×èÈû¶ÓÁÐÓУº
ArrayListBlockingQueue
LinkedListBlockingQueue
DelayQueue
SynchronousQueue
ConcurrentHashMap
¸ßЧµÄḬ̈߳²È«¹þÏ£map¡£Çë¶Ô±ÈhashTable , concurrentHashMap, HashMap
5.¹ÜÀíÀà
¹ÜÀíÀàµÄ¸ÅÄî±È½Ï·º£¬ÓÃÓÚ¹ÜÀíỊ̈߳¬±¾Éí²»ÊǶàÏ̵߳쬵«ÌṩÁËһЩ»úÖÆÀ´ÀûÓÃÉÏÊöµÄ¹¤¾ß×öһЩ·â×°¡£
Á˽⵽µÄÖµµÃÒ»ÌáµÄ¹ÜÀíÀࣺThreadPoolExecutorºÍ JMX¿ò¼ÜϵÄϵͳ¼¶¹ÜÀíÀà ThreadMXBean
ThreadPoolExecutor
Èç¹û²»Á˽âÕâ¸öÀ࣬Ӧ¸ÃÁ˽âÇ°ÃæÌáµ½µÄExecutorService£¬¿ªÒ»¸ö×Ô¼ºµÄÏ̳߳طdz£·½±ã£º
ExecutorService
e = Executors. newCachedThreadPool();
ExecutorService e = Executors. newSingleThreadExecutor();
ExecutorService e = Executors. newFixedThreadPool(3);
// µÚÒ»ÖÖÊǿɱä´óСÏ̳߳أ¬°´ÕÕÈÎÎñÊýÀ´·ÖÅäỊ̈߳¬
// µÚ¶þÖÖÊǵ¥Ï̳߳أ¬Ï൱ÓÚFixedThreadPool(1)
// µÚÈýÖÖÊǹ̶¨´óСÏ̳߳ء£
// È»ºóÔËÐÐ
e.execute(new MyRunnableImpl()); |
¸ÃÀàÄÚ²¿ÊÇͨ¹ýThreadPoolExecutorʵÏֵģ¬ÕÆÎÕ¸ÃÀàÓÐÖúÓÚÀí½âÏ̳߳صĹÜÀí£¬±¾ÖÊÉÏ£¬ËûÃǶ¼ÊÇThreadPoolExecutorÀàµÄ¸÷ÖÖʵÏÖ°æ±¾¡£Çë²Î¼ûjavadoc£º

ThreadPoolExecutor²ÎÊý½âÊÍ
·Òëһϣº
corePoolSize:³ØÄÚÏ̳߳õʼֵÓë×îСֵ£¬¾ÍËãÊÇ¿ÕÏÐ״̬£¬Ò²»á±£³Ö¸ÃÊýÁ¿Ï̡߳£
maximumPoolSize:Ïß³Ì×î´óÖµ£¬Ï̵߳ÄÔö³¤Ê¼ÖÕ²»»á³¬¹ý¸ÃÖµ¡£
keepAliveTime£ºµ±³ØÄÚÏß³ÌÊý¸ßÓÚcorePoolSizeʱ£¬¾¹ý¶àÉÙʱ¼ä¶àÓàµÄ¿ÕÏÐÏ̲߳Żᱻ»ØÊÕ¡£»ØÊÕǰ´¦ÓÚwait״̬
unit£º
ʱ¼äµ¥Î»£¬¿ÉÒÔʹÓÃTimeUnitµÄʵÀý£¬ÈçTimeUnit.MILLISECONDS
workQueue:´ýÈëÈÎÎñ£¨Runnable£©µÄµÈ´ý³¡Ëù£¬¸Ã²ÎÊýÖ÷ÒªÓ°Ïìµ÷¶È²ßÂÔ£¬È繫ƽÓë·ñ£¬ÊÇ·ñ²úÉú¶öËÀ(starving)
threadFactory:Ï̹߳¤³§À࣬ÓÐĬÈÏʵÏÖ£¬Èç¹ûÓÐ×Ô¶¨ÒåµÄÐèÒªÔòÐèÒª×Ô¼ºÊµÏÖThreadFactory½Ó¿Ú²¢×÷Ϊ²ÎÊý´«Èë¡£ |