Javaå¤çº¿ç¨:JUC并åå·¥å ·åç
ä¸.åè¨
è¶çæ空,赶紧æä¹åæ¬ çåºè¿ä¸.è¿æ¯å¤çº¿ç¨ä¸é¶æ®µè®¡åçæåä¸ç¯,åç»å¤çº¿ç¨ä¼è½¬å ¥ä¿®è®¢åæ·±å ¥é¶æ®µ.å½»åºåéå¤çº¿ç¨.
äº.å·¥å ·ä»ç»ä¹å说AQSçæ¶åæ¾ç»æå°è¿è¿å 个类,è¿å 个类æä¸äºåèªçç¹ç¹,å¾ç¬¦åç¹å®çåºæ¯,ä¹åå¨ç产ä¸ç¨çè¿æºèæ.
æ们ä¸è¬ä½¿ç¨ç并åå·¥å ·æåç§:
CyclicBarrier:æ¾å¦ä¸èµ·èµ°
å 许ä¸ç»çº¿ç¨äºç¸çå¾ ï¼ç´å°å°è¾¾æä¸ªå ¬å ±å±éç¹(commonbarrierpoint)
让ä¸ç»çº¿ç¨å°è¾¾ä¸ä¸ªå±éæ¶è¢«é»å¡ï¼ç´å°æåä¸ä¸ªçº¿ç¨å°è¾¾å±éæ¶ï¼å±éæä¼å¼é¨ï¼ææ被å±éæ¦æªç线ç¨æä¼ç»§ç»å¹²æ´»
CountDownLatch:ç人å°é½äºå°±è§¦å
å¨å®æä¸ç»æ£å¨å ¶ä»çº¿ç¨ä¸æ§è¡çæä½ä¹åï¼å®å 许ä¸ä¸ªæå¤ä¸ªçº¿ç¨ä¸ç´çå¾
ç¨ç»å®ç计æ°åå§åCountDownLatchã
ç±äºè°ç¨äºcountDown()æ¹æ³ï¼æ以å¨å½å计æ°å°è¾¾é¶ä¹åï¼awaitæ¹æ³ä¼ä¸ç´åé»å¡ã
ä¹åï¼ä¼éæ¾ææçå¾ ç线ç¨ï¼awaitçææåç»è°ç¨é½å°ç«å³è¿åãè¿ç§ç°è±¡åªåºç°ä¸æ¬¡ââ计æ°æ æ³è¢«éç½®ã
CountDownLatchæ¯éè¿ä¸ä¸ªè®¡æ°å¨æ¥å®ç°çï¼å½æ们å¨newä¸ä¸ªCountDownLatch对象çæ¶åéè¦å¸¦å ¥è¯¥è®¡æ°å¨å¼ï¼è¯¥å¼å°±è¡¨ç¤ºäºçº¿ç¨çæ°éã
æ¯å½ä¸ä¸ªçº¿ç¨å®æèªå·±çä»»å¡åï¼è®¡æ°å¨çå¼å°±ä¼å1ãå½è®¡æ°å¨çå¼å为0æ¶ï¼å°±è¡¨ç¤ºææç线ç¨åå·²ç»å®æäºä»»å¡
Semaphore
ä¿¡å·éSemaphoreæ¯ä¸ä¸ªæ§å¶è®¿é®å¤ä¸ªå ±äº«èµæºç计æ°å¨ï¼åCountDownLatchä¸æ ·ï¼å ¶æ¬è´¨ä¸æ¯ä¸ä¸ªâå ±äº«éâã
Exchanger
å¯ä»¥å¨å¯¹ä¸å¯¹å ç´ è¿è¡é 对å交æ¢ç线ç¨çåæ¥ç¹
æ¯ä¸ªçº¿ç¨å°æ¡ç®ä¸çæ个æ¹æ³åç°ç»exchangeæ¹æ³ï¼ä¸ä¼ä¼´çº¿ç¨è¿è¡å¹é ï¼å¹¶ä¸å¨è¿åæ¶æ¥æ¶å ¶ä¼ä¼´ç对象,Exchangerå¯è½è¢«è§ä¸ºSynchronousQueueçååå½¢å¼
ä¸.åç解æ3.1CyclicBarrierä½ç¨:
å®å 许ä¸ç»çº¿ç¨äºç¸çå¾ ï¼ç´å°å°è¾¾æä¸ªå ¬å ±å±éç¹(CommonBarrierPoint)ãå¨æ¶åä¸ç»åºå®å¤§å°ç线ç¨çç¨åºä¸ï¼è¿äºçº¿ç¨å¿ é¡»ä¸æ¶å°äºç¸çå¾ ï¼æ¤æ¶CyclicBarrierå¾æç¨ãå 为该Barrierå¨éæ¾çå¾ çº¿ç¨åå¯ä»¥éç¨ï¼æ以称å®ä¸ºå¾ªç¯(Cyclic)çå±é(Barrier)ã
å é¨åç:
å é¨ä½¿ç¨éå ¥éReentrantLockåCondition
æé å½æ°:
CyclicBarrier(intparties)ï¼
å建ä¸ä¸ªæ°çCyclicBarrierï¼å®å°å¨ç»å®æ°éçåä¸è ï¼çº¿ç¨ï¼å¤äºçå¾ ç¶ææ¶å¯å¨ï¼
ä½å®ä¸ä¼å¨å¯å¨barrieræ¶æ§è¡é¢å®ä¹çæä½ã
CyclicBarrier(intparties,RunnablebarrierAction)ï¼
å建ä¸ä¸ªæ°çCyclicBarrierï¼å®å°å¨ç»å®æ°éçåä¸è ï¼çº¿ç¨ï¼å¤äºçå¾ ç¶ææ¶å¯å¨ï¼
并å¨å¯å¨barrieræ¶æ§è¡ç»å®çå±éæä½ï¼è¯¥æä½ç±æåä¸ä¸ªè¿å ¥barrierç线ç¨æ§è¡ã
使ç¨åé:
partiesåé:表示æ¦æªçº¿ç¨çæ»æ°éã
countåé:表示æ¦æªçº¿ç¨çå©ä½éè¦æ°éã
barrierActionåé:为CyclicBarrieræ¥æ¶çRunnableå½ä»¤ï¼ç¨äºå¨çº¿ç¨å°è¾¾å±éæ¶ï¼ä¼å æ§è¡barrierActionï¼ç¨äºå¤çæ´å å¤æçä¸å¡åºæ¯ã
generationåé:表示CyclicBarrierçæ´æ°æ¢ä»£
//常ç¨æ¹æ³:M-await:çå¾ ç¶æM-await(longtimeout,TimeUnitunit):çå¾ è¶ æ¶M-dowait-该æ¹æ³ç¬¬ä¸æ¥ä¼è¯çè·åé-å¦æå代已ç»æåï¼æåºå¼å¸¸-å¦æ线ç¨ä¸æï¼ç»æ¢CyclicBarrier-è¿æ¥çº¿ç¨ï¼--count-count==0表示ææ线ç¨åå·²å°ä½ï¼è§¦åRunnableä»»å¡-å¤éææçå¾ çº¿ç¨ï¼å¹¶æ´æ°generation>è·³åºçå¾ ç¶æçæ¹æ³-æåä¸ä¸ªçº¿ç¨å°è¾¾ï¼å³index==0-è¶ åºäºæå®æ¶é´ï¼è¶ æ¶çå¾ ï¼-å ¶ä»çæ个线ç¨ä¸æå½å线ç¨-å ¶ä»çæ个线ç¨ä¸æå¦ä¸ä¸ªçå¾ ç线ç¨-å ¶ä»çæ个线ç¨å¨çå¾ barrierè¶ æ¶-å ¶ä»çæ个线ç¨å¨æ¤barrierè°ç¨reset()æ¹æ³ãreset()æ¹æ³ç¨äºå°å±éé置为åå§ç¶æãSC-Generation:æè¿°äºCyclicBarrierçæ´æ°æ¢ä»£ã-å¨CyclicBarrierä¸ï¼åä¸æ¹çº¿ç¨å±äºåä¸ä»£ã-å½æparties个线ç¨å ¨é¨å°è¾¾barrieræ¶ï¼generationå°±ä¼è¢«æ´æ°æ¢ä»£ã-å ¶ä¸brokenå±æ§ï¼æ è¯è¯¥å½åCyclicBarrieræ¯å¦å·²ç»å¤äºä¸æç¶æM-breakBarrier:ç»æ¢ææç线ç¨M-nextGeneration:æ´æ°æ¢ä»£æä½-1.å¤éææ线ç¨ã-2.éç½®countã-3.éç½®generationãM-reset:éç½®barrierå°åå§åç¶æM-getNumberWaiting:è·å¾çå¾ ç线ç¨æ°M-å¤æCyclicBarrieræ¯å¦å¤äºä¸æ使ç¨æ¡ä¾:
GiteeCyclicBarrier使ç¨
é®é¢è¡¥å :
//é®é¢ä¸:æ¦æªçæ ¸å¿1.ä¼ å ¥æ»å¾Countæ°2.æ¯æ¬¡è¿æ¥é½ä¼--count,åæ¶å¤æcount==.å¦æä¸ä¸º0,å½å线ç¨å°±ä¼é»å¡//é®é¢äº:æ¶åæºç privatefinalReentrantLocklock=newReentrantLock();privatefinalConditiontrip=lock.newCondition();3.2CountDownLatchå¨å®æä¸ç»æ£å¨å ¶ä»çº¿ç¨ä¸æ§è¡çæä½ä¹åï¼å®å 许ä¸ä¸ªæå¤ä¸ªçº¿ç¨ä¸ç´çå¾
ç¨ç»å®ç计æ°åå§åCountDownLatchãç±äºè°ç¨äºcountDown()æ¹æ³ï¼æ以å¨å½å计æ°å°è¾¾é¶ä¹åï¼awaitæ¹æ³ä¼ä¸ç´åé»å¡ãä¹åï¼ä¼éæ¾ææçå¾ ç线ç¨ï¼awaitçææåç»è°ç¨é½å°ç«å³è¿åãè¿ç§ç°è±¡åªåºç°ä¸æ¬¡,计æ°æ æ³è¢«éç½®ãå¦æéè¦é置计æ°ï¼è¯·èè使ç¨CyclicBarrierã
CountDownLatchæ¯éè¿ä¸ä¸ªè®¡æ°å¨æ¥å®ç°çï¼å½æ们å¨newä¸ä¸ªCountDownLatch对象çæ¶åéè¦å¸¦å ¥è¯¥è®¡æ°å¨å¼ï¼è¯¥å¼å°±è¡¨ç¤ºäºçº¿ç¨çæ°éãæ¯å½ä¸ä¸ªçº¿ç¨å®æèªå·±çä»»å¡åï¼è®¡æ°å¨çå¼å°±ä¼å1ãå½è®¡æ°å¨çå¼å为0æ¶ï¼å°±è¡¨ç¤ºææç线ç¨åå·²ç»å®æäºä»»å¡
//å é¨ä¸»è¦æ¹æ³>CountDownLatchå é¨ä¾èµSyncå®ç°ï¼èSync继æ¿AQS>sync::tryAcquireSharedè·ååæ¥ç¶æ:tryReleaseSharedéæ¾åæ¥ç¶æ>await():使å½å线ç¨å¨éåå¨å计æ°è³é¶ä¹åä¸ç´çå¾ ï¼é¤é线ç¨è¢«ä¸æ:sync.acquireSharedInterruptibly(1);:å é¨ä½¿ç¨AQSçacquireSharedInterruptibly(intarg)>getState():è·ååæ¥ç¶æï¼å ¶å¼çäºè®¡æ°å¨çå¼:ä»è¿éæ们å¯ä»¥çå°å¦æ计æ°å¨å¼ä¸çäº0ï¼åä¼è°ç¨doAcquireSharedInterruptibly(intarg)>doAcquireSharedInterruptibly:èªææ¹æ³ä¼å°è¯ä¸ç´å»è·ååæ¥ç¶æ>countDown:CountDownLatchæä¾countDown()æ¹æ³éåéåå¨ç计æ°ï¼å¦æ计æ°å°è¾¾é¶ï¼åéæ¾ææçå¾ ç线ç¨:å é¨è°ç¨AQSçreleaseShared(intarg)æ¹æ³æ¥éæ¾å ±äº«éåæ¥ç¶æ:tryReleaseShared(intarg)æ¹æ³è¢«CountDownLatchçå é¨ç±»Syncéååèæ¡ä¾
GiteeCountDownLatch使ç¨
æ»ç»
CountDownLatchå é¨éè¿å ±äº«éå®ç°ãå¨å建CountDownLatchå®ä¾æ¶ï¼éè¦ä¼ éä¸ä¸ªintåçåæ°ï¼countï¼è¯¥åæ°ä¸ºè®¡æ°å¨çåå§å¼ï¼ä¹å¯ä»¥çè§£ä¸ºè¯¥å ±äº«éå¯ä»¥è·åçæ»æ¬¡æ°ã
å½æ个线ç¨è°ç¨await()æ¹æ³ï¼ç¨åºé¦å å¤æcountçå¼æ¯å¦ä¸º0ï¼å¦æä¸ä¼0çè¯åä¼ä¸ç´çå¾ ç´å°ä¸º0为æ¢(PS:å¯ä»¥å¤ä¸ªçº¿ç¨é½è°ç¨await)
å½å ¶ä»çº¿ç¨è°ç¨countDown()æ¹æ³æ¶ï¼åæ§è¡éæ¾å ±äº«éç¶æï¼ä½¿countå¼â1(PS:countDown并ä¸ä¼é»å¡)
å½å¨å建CountDownLatchæ¶åå§åçcountåæ°ï¼å¿ é¡»è¦æcount线ç¨è°ç¨countDownæ¹æ³æä¼ä½¿è®¡æ°å¨countçäº0ï¼éæä¼éæ¾ï¼åé¢çå¾ ç线ç¨æä¼ç»§ç»è¿è¡ã注æCountDownLatchä¸è½åæ»éç½®
3.3Semaphoreåºç¡ç¹
ä¿¡å·éSemaphoreæ¯ä¸ä¸ªæ§å¶è®¿é®å¤ä¸ªå ±äº«èµæºç计æ°å¨ï¼åCountDownLatchä¸æ ·ï¼å ¶æ¬è´¨ä¸æ¯ä¸ä¸ªâå ±äº«éâã
ä»æ¦å¿µä¸è®²ï¼ä¿¡å·éç»´æ¤äºä¸ä¸ªè®¸å¯éãå¦æå¿ è¦ï¼å¨è®¸å¯å¯ç¨åä¼é»å¡æ¯ä¸ä¸ªacquire()ï¼ç¶ååè·å该许å¯ãæ¯ä¸ªrelease()æ·»å ä¸ä¸ªè®¸å¯ï¼ä»èå¯è½éæ¾ä¸ä¸ªæ£å¨é»å¡çè·åè ã
Semaphoreé常ç¨äºéå¶å¯ä»¥è®¿é®æäºèµæºï¼ç©çæé»è¾çï¼ç线ç¨æ°ç®
å½ä¸ä¸ªçº¿ç¨æ³è¦è®¿é®æä¸ªå ±äº«èµæºæ¶ï¼å®å¿ é¡»è¦å è·åSemaphoreï¼å½Semaphore>0æ¶ï¼è·å该èµæºå¹¶ä½¿Semaphoreâ1ãå¦æSemaphoreå¼=0ï¼åè¡¨ç¤ºå ¨é¨çå ±äº«èµæºå·²ç»è¢«å ¶ä»çº¿ç¨å ¨é¨å ç¨ï¼çº¿ç¨å¿ é¡»è¦çå¾ å ¶ä»çº¿ç¨éæ¾èµæºãå½çº¿ç¨éæ¾èµæºæ¶ï¼Semaphoreå+1
å®ç°ç»è
Semaphoreæä¾äºä¸¤ä¸ªæé å½æ°ï¼
Semaphore(intpermits)ï¼åå»ºå ·æç»å®ç许å¯æ°åéå ¬å¹³çå ¬å¹³è®¾ç½®çSemaphoreã
Semaphore(intpermits,booleanfair)ï¼åå»ºå ·æç»å®ç许å¯æ°åç»å®çå ¬å¹³è®¾ç½®çSemaphoreã
Semaphoreé»è®¤éæ©éå ¬å¹³éã
å½ä¿¡å·éSemaphore=1æ¶ï¼å®å¯ä»¥å½ä½äºæ¥é使ç¨ãå ¶ä¸0ã1å°±ç¸å½äºå®çç¶æï¼å½=1æ¶è¡¨ç¤ºå ¶ä»çº¿ç¨å¯ä»¥è·åï¼å½=0æ¶ï¼æä»ï¼å³å ¶ä»çº¿ç¨å¿ é¡»è¦çå¾ ã
//------ä¿¡å·éè·å>acquire()æ¹æ³æ¥è·åä¸ä¸ªè®¸å¯:å é¨è°ç¨AQSçacquireSharedInterruptibly(intarg)ï¼è¯¥æ¹æ³ä»¥å ±äº«æ¨¡å¼è·ååæ¥ç¶æ>å ¬å¹³:å¤æ该线ç¨æ¯å¦ä½äºCLHéåçå头:è·åå½åçä¿¡å·é许å¯:设置âè·å¾acquires个信å·é许å¯ä¹åï¼å©ä½çä¿¡å·é许å¯æ°â:CAS设置信å·é>éå ¬å¹³:ä¸éè¦å¤æå½å线ç¨æ¯å¦ä½äºCLHåæ¥éåå头3.4Exchangerå¯ä»¥å¨å¯¹ä¸å¯¹å ç´ è¿è¡é 对å交æ¢ç线ç¨çåæ¥ç¹
æ¯ä¸ªçº¿ç¨å°æ¡ç®ä¸çæ个æ¹æ³åç°ç»exchangeæ¹æ³ï¼ä¸ä¼ä¼´çº¿ç¨è¿è¡å¹é ï¼å¹¶ä¸å¨è¿åæ¶æ¥æ¶å ¶ä¼ä¼´ç对象,Exchangerå¯è½è¢«è§ä¸ºSynchronousQueueçååå½¢å¼
Exchangerï¼å®å 许å¨å¹¶åä»»å¡ä¹é´äº¤æ¢æ°æ®:å½ä¸¤ä¸ªçº¿ç¨é½å°è¾¾åæ¥ç¹æ¶ï¼ä»ä»¬äº¤æ¢æ°æ®ç»æï¼å æ¤ç¬¬ä¸ä¸ªçº¿ç¨çæ°æ®ç»æè¿å ¥å°ç¬¬äºä¸ªçº¿ç¨ä¸ï¼ç¬¬äºä¸ªçº¿ç¨çæ°æ®ç»æè¿å ¥å°ç¬¬ä¸ä¸ªçº¿ç¨ä¸
TODO:Exchangerçæºä»£ç æ¯è¾ç»,èä¸è¿ä¸ªç»ä»¶ä½¿ç¨åºæ¯å¹¶ä¸å¤,æ以å ç个å,以å项ç®ä¸ççæåºæ¯äºåå®é ä¸åæä¸ä¸
3.5并åå·¥å ·ä½¿ç¨@github.com/black-ant/case/tree/master/case%Module%Thread/case%thread_utils
è¡¥å :#CountDownLatchåCyclicBarrierå¦ä½ç解?CyclicBarrier:å°å¦çå»é游,èå¸ä¸è½¦æ¶ç»è®¡äººæ°,人æ°å°é½äºæè½ä¸èµ·åè§
CountDownLatch:å¹¼å¿åèå¸éå©å(ChildThread)æ¾å¦,èµ°ä¸ä¸ªè®°ä¸ä¸ªæ°,å½ææçå¦çæ¾å¦å,èå¸(BossThread)ä¸ç
//æ ¸å¿è§£é:CyclicBarrierå°±æ¯ä¸å µå¢,人æ°å°äºææ线ç¨æè½ä¸èµ·è¶è¿å¢CountDownLatchåªæ¯ä¸ä¸ªè®¡æ°å¨,æ°ç®å°äºä¸»çº¿ç¨æè½æ§è¡//å ¶ä»è¦ç¹:CyclicBarrierå¯ä»¥é置计æ°,CountDownLatchä¸å¯ä»¥æ»ç»ç»äºè¡¥ä¸äºæåä¸åæ¿,åé¢æ¥çæ£çæ·±å ¥å¤çº¿ç¨ççå§,äºåæ©æ¥æ为å¤çº¿ç¨å¤§å¸æ®µä½
æ´æ°è®°å½:ä¼åå¸å±
ä½è ï¼AntBlack
年互联网大厂 Java 工程师高级面试八股文汇总( 道题目附解析)
面对年的互联网大厂招聘面试,形势变得越来越严峻。腾讯、字节跳动等知名大厂的面试名额显著减少,而面试标准却在不断提高。dede公司源码因此,如果求职者在准备面试时不够用心,很可能就会在面试官面前哑口无言,甚至失去获得心仪offer的机会。 当前的就业环境充满着不确定性,对于希望在金九银十期间跳槽并获得加薪的求职者来说,在面试前做好充分准备显得尤为重要! 在大厂面试中,面试者往往会遇到一些看似困难、实际与自己准备的“题库”不符的问题。不知道如何入手,让面试过程变得棘手。 为了在面试中脱颖而出,求职者需要深入理解和掌握面试的必考点和常见套路。今天,我们为大家整理了针对Java工程师的高级面试题,包括但不限于Java基础、JVM、多线程、Mysql、Spring系列、Dubbo、Mybatis、Redis、网络知识、Linux、RabbitMQ、Zookeeper、Netty、大数据技术、算法与设计模式、实战项目等多方面内容。无论你是应届毕业生、实习生还是即将大涨选股公式源码有工作经验的求职者,都可以从中找到有价值的参考。 为了适应篇幅限制,我们以截图主要内容的形式提供这部分内容供参考,需要完整版本的求职者可以通过点击传送门获取。 为了帮助求职者更好地应对面试,以下是针对Java工程师高级面试的详细内容概览: Java基础(技术干货+面试题):涵盖基础语法、面向对象、类与接口、变量与方法、内部类、重写与重载、IO流、反射等。 JVM(底层原理+面试题):涉及JVM内存区域、JVM运行时内存、垃圾回收与算法、JAVA四种引用类型、GC垃圾收集器、JVM类加载机制、GC分代收集算法、分区收集算法等。 多线程(底层原理+面试题):包含多线程与高并发基础概念、JUC同步工具、同步容器、线程池、线程顺序执行控制、纤程、JMH、引用类型、Disruptor等。 Mysql(技术干货+面试题):覆盖数据类型、引擎、索引、事务、锁、视图、存储过程与函数、触发器、常用SQL语句、手机写源码用什么软件SQL优化、常见面试题等。 Spring系列(底层原理+面试题):包括Spring常用注解、IOC原理、APO原理、MVC原理、Spring Boot原理、CAP原理和BASE理论、面试题等。 Dubbo(底层原理+面试题):涉及SPI机制、自适应拓展原理、服务导出、服务引用、集群容错之Directory、集群容错之Router、集群容错之Cluster、集群容错之LoadBalance、服务调用过程等。 Mybatis(底层原理+面试题):包含实现原理、映射文件、动态SQL、缓存机制、配置文件加载源码、MAPPERPROXY创建源码、EXECUTOR源码等。 Redis(底层原理+面试题):涉及Redis数据类型、持久化、内存相关、分布式问题等。 网络知识(底层原理+面试题):涵盖计算机网络体系结构、网络协议、网络7层架构、TCP/IP原理、HTTP原理、CDN原理、RPC、负载均衡等。 Linux(底层原理+面试题):包括Linux概述、磁盘、大数据后台分析系统源码目录、文件、swap分区等。 RabbitMQ(底层原理+面试题):包括RabbitMQ基础概念、使用场景、工作模式、消息中间件、经典面试题等。 Zookeeper(底层原理+面试题):包含Zookeeper文件系统、Zookeeper概念、Chroot特性、会话管理、典型应用场景、ZAB协议、面试题等。 Netty(底层原理+面试题):涵盖Netty简介、Netty的特点、Netty高性能设计、Netty原理、Netty经典面试题等。 大数据技术(技术干货+面试题):包含Hadoop、Spark、Storm、YARN、数据复制、数据库并发策略、数据库锁、CLH队列等。 算法(技术干货+大厂面试题):涉及红黑树、贪心算法、动态规划、七大查找算法、一致性算法、Java算法、数据结构、加密算法、大厂面试题等。 设计模式(底层原理+技术干货):涵盖单例模式、工厂模式、短视频去水印源码java建造者模式、原型模式、适配器模式、装饰器模式、代理模式、中介者模式、命令模式等种设计模式。 实战项目(突击大厂必备):此项目是一款已上线的“网约车”应用,符合我国交通部对网约车监管的技术要求,通过了交通部的线上和线下能力认定。原型曾在杭州上线运行,核心功能包括账户系统、订单系统、支付系统、地图引擎、派单引擎、消息系统等。项目完全采用微服务架构设计,应用了成熟的接口安全方案,采用分布式锁保证数据同步,使用分布式事务解决数据一致性问题。前置技能包括Git、Maven、Spring Boot、Spring Cloud、Redis、Mysql、RabbitMQ、ActiveMQ等。后端面经-JavaAQS详解
AQS是什么?
AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock。简单来说,AQS定义了一套框架,来实现同步类。
AQS的核心思想是对于共享资源,维护一个双端队列来管理线程,队列中的线程依次获取资源,获取不到的线程进入队列等待,直到资源释放,队列中的线程依次获取资源。AQS的基本框架如图所示:
资源state变量表示共享资源,通常是int类型。CLH双向队列是一种基于逻辑队列非线程饥饿的自旋公平锁,具体介绍可参考此篇博客。CLH中每个节点都表示一个线程,处于头部的节点获取资源,而其他资源则等待。Node的方法和属性值如图所示:其中,
一般来说,一个同步器是资源独占模式或者资源共享模式的其中之一,因此tryAcquire(int)和tryAcquireShared(int)只需要实现一个即可,tryRelease(int)和tryReleaseShared(int)同理。但是同步器也可以实现两种模式的资源获取和释放,从而实现独占和共享两种模式。
acquire(int)是获取资源的顶层入口,tryAcquire(int)是获取资源的方法,需要自定义同步器实现。addWaiter(Node.EXCLUSIVE)是将线程加入等待队列的尾部,acquireQueued(Node node, int arg)将线程阻塞在等待队列中,直到获取到资源后才返回。
release(int)是释放资源的顶层入口方法,tryRelease(int)是释放资源的方法,需要自定义同步器自己实现。unparkSuccessor(h)是唤醒后继节点的方法。
acquireShared(int)和releaseShared(int)是使用共享模式获取共享资源的顶层入口方法,tryAcquireShared(arg)是获取共享资源的方法,doAcquireShared(arg)将线程阻塞在等待队列中,直到获取到资源后才返回。releaseShared(int)是释放共享资源的顶层入口方法,doReleaseShared()方法释放共享资源。
面试问题模拟:AQS是接口吗?有哪些没有实现的方法?看过相关源码吗?
A:AQS定义了一个实现同步类的框架,实现方法主要有tryAquire和tryRelease,表示独占模式的资源获取和释放,tryAquireShared和tryReleaseShared表示共享模式的资源获取和释放。源码分析如上文所述。
急,病毒有什么危害?详细
1.消耗资源
所有计算机病毒都是程序,是程序,则在运行的时候都要占用系统资源。很多病毒都是驻留内存的,也就是说,它们会长期占用系统资源。这必然会造成系统的缓慢。即使是无害的病毒,也会有这个问题——因为它也是程序。这种危害看起来似乎不会造成什么损失,其实不然。年莫里斯编的蠕虫病毒,实际上不具有什么实质性的破坏作用,但它耗费了大量的系统资源,从而使系统极度缓慢直至停止运行。这样的损失实际上是时间的损失。现在,也有像I LOVE YOU这样的病毒,采用耗费系统或网络资源的方式作为破坏的一种手段。
2.干扰输出
在屏幕上显示图形或符号,或播放莫名其妙的音乐或声音。一般的无害病毒都有这项“功能”,这可能也是无害病毒的主要“攻击”手段了。这样的攻击手段通常不会带来什么实质性的破坏,但却会干扰你的工作。比如一个叫做“零臭虫”(Zero Bug)的病毒,在它进入内存后,会在屏幕上显示一个“臭虫”。这个“臭虫”会“吃掉”屏幕上所有的“O”字符。这个病毒不会使文件数据丢失,不过看一个没有“O”的屏幕是有相当难度的。恶性病毒也有可能改变屏幕显示或播放声音,但通常此时只是灾难的开始——它也许正在格式化你的硬盘。
3.干扰输入
对你的键盘做手脚。无论是无害病毒还是恶性病毒都有可能具有这项“功能”。这种破坏方式会使你的键盘输入出现混乱。比如“排字工”病看(Type COM)就是一种可以干扰键盘输入的病毒。当你输入“A”的时候,却会在屏幕上显示“S”;当你在输入“L”的时候,却会显示“:”。总之,实际被计算机接收的字符是你所按键的右边那个键。又如“Hymn”病毒,在病毒进入内存之后,就监视键盘活动,在第次敲击键盘之后,再敲击的键依次被两个空格和五个乱码代替,这样就使键盘无法发挥作用。
4.破坏信息
这是恶性病毒的主要破坏手段之一。破坏文件的方式有多种。
在病毒感染文件时,可以说已经对文件产生了一些破坏。尤其是一些病毒,它们为了在感染文件后不增加文件长度,硬是用自己的代码将宿主程序的一部分代码覆盖。有时这样做就会对文件造成破坏。但这种破坏并不是病毒的目的,设计得好的病毒也会尽量避免这种破坏以隐蔽自己。
有些病毒会破坏磁盘的文件分配表(FAT)。文件分配表是磁盘文件信息储存的一个缩影,在其中记录着所有文件的位置和大小,是文件名与文件信息的纽带。如果FAT遭到破坏,使用DIR等命令仍可以见原有文件。但你会发现这些仍然“存在”的文件已经无法使用了。
有些病毒会修改一些储存数据的文件。这些文件的格式不变,也还能被读取,但内容却变了。比如一个WORD文档,里面储存着某人的成绩单。本来是分却被病毒改成了分。在调用这个文件时,WORD不会报告任何出错信息,但实际上里面的内容已经被破坏了——这样的改变更难以发现。上面的例子不会造成什么重大后果,但如果这个文件里储存的是重要的军事或金融数据,若被更改其后果不堪设想。
有些病毒会格式化磁盘。这是病毒破坏文件的极端手段,也是造成损失最大的一种。在磁盘被格式化以后,文件储存全部清除。很多恶性病毒的破坏方式都是格式化磁盘。但格式化磁盘需要时间——如果你在病毒发作时及时关机,可能还能保住部分文件。
5.泄露信息
最近流行的SirCam、求职信、红色代码、尼姆达等病毒均有泄露信息的特点。SirCam和求职信病毒泄露信息的方式是把被感染机器上的一些文件作为邮件附件连同病毒一起发往一些真实的电子邮件地址。红色代码和尼姆达病毒泄露信息的方式是把被感染机器的一些硬盘分区设成远程共享,等于是后门大开。在红色代码病毒流行期间,就出现了一些机器被红色代码病毒感染了以后,黑客借助被打开的后门又实施了篡改网页的二次破坏的情况。
6.破坏系统
这也是一种严重的破坏行为。病毒可以来用篡改系统设置或对系统进行加密的方法,使系统发生混乱。赫赫有名的ClH病毒甚至还能破坏硬件系统。它可以识别台湾地区及个另外国家生产的某些计算机主板上的BlOS(基本输入输出系统)的写入口,并随机修改几个字符,造成BlOS工作混乱。由于BIOS在计算机中的特殊地位,它必须靠专业厂商才能修复。这样,就造成了硬件的损坏。
有些计算机病毒还具有感知杀毒软件的能力,先下手干掉已经安装在宿主机器内的杀毒软件。比如最近流行的求职信病毒的新变种就有这样的特点。
7.阻塞网络
红色代码、尼姆达这类新的蠕虫类病毒,在确定下一个感染目标之前,要向网上的其他lP地址发出大量的试探性攻击包,对相应的主机进行漏洞探测。每一个因为有漏洞而新近被感染的主机也都会加入这个行列。在这种类型的漏洞普遍存在的情况下,会出现一种滚雪球一样的连锁效应,导致一些网络被这种试探性攻击包所拥塞,因而正常的网络通信受到阻碍,乃至瘫痪。
8.心理影响
计算机病毒不仅对计算机产生影响,而且对人也会产生一定影响。当然我们说过,计算机病毒是不会与人交叉感染的,那么它是怎样对人产生影响的呢?其实很简单,它是通过控制屏幕的输出来对人的心理进行影响的。有些按破坏能力分类归为“无害”的病毒,虽然不会损坏数据,但在发作时并不只是播放一段音乐这样简单。有些病毒会进行反动宣传,有些病毒会显示一些对人身心健康不利的文字或图像。在年年底,人们发现了一个通过电子邮件传播的病毒:“女鬼”病毒。当你打开感染了“女鬼”病毒的邮件的附件时,病毒发作,在屏幕上显示一个美食家杀害妻子的恐怖故事。之后,一切恢复正常。一般人会以为这个病毒的发作只是这样而已。但是,5分钟后,突然屏幕变黑,一个恐怖的女尸的图像就会显示出来,让没有丝毫心理准备的人吓一跳。据报道,一人因此突发心脏病身亡。所以,计算机病毒的这个危害也是不可小视的。
2024-12-23 23:59
2024-12-23 23:50
2024-12-23 23:47
2024-12-23 22:31
2024-12-23 21:50