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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
JavaÖеĶàÏß³ÌÄãÖ»Òª¿´Õâһƪ¾Í¹»ÁË
 
  2911  次浏览      29
 2018-5-17 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚ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.ÊÍ·ÅËø

r.unlock()

±ØÐë×ö£¡ºÎΪ±ØÐë×öÄØ£¬Òª·ÅÔÚ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½Ó¿Ú²¢×÷Ϊ²ÎÊý´«Èë¡£

   
2911 ´Îä¯ÀÀ       29
Ïà¹ØÎÄÕÂ

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

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

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö