1.HashMapåHashtableçåºå«
2.Go语言基础:Test的源码基础知识
3.微信小程序官方组件展示之导航navigator源码
4.redis的哨兵模式第一次主从切换成功,再次进行主从切换就不
5.ä»TurboPascalå°Delphi
6.面试官问:HashMap中变量modCount真实作用是什么?
HashMapåHashtableçåºå«
HashMapåHashtableçæ¯è¾æ¯Javaé¢è¯ä¸ç常è§é®é¢ï¼ç¨æ¥èéªç¨åºåæ¯å¦è½å¤æ£ç¡®ä½¿ç¨éå类以åæ¯å¦å¯ä»¥éæºåºå使ç¨å¤ç§æ路解å³é®é¢ãHashMapçå·¥ä½åçãArrayListä¸Vectorçæ¯è¾ä»¥åè¿ä¸ªé®é¢æ¯æå ³Java éåæ¡æ¶çæç»å ¸çé®é¢ãHashtableæ¯ä¸ªè¿æ¶çéåç±»ï¼åå¨äºJava APIä¸å¾ä¹ äºãå¨Java 4ä¸è¢«éåäºï¼å®ç°äºMapæ¥å£ï¼æ以èªæ¤ä»¥åä¹æäºJavaéåæ¡æ¶ä¸çä¸é¨åãHashtableåHashMapå¨Javaé¢è¯ä¸ç¸å½å®¹æ被é®å°ï¼çè³æ为äºéåæ¡æ¶é¢è¯é¢ä¸æ常被èçé®é¢ï¼æ以å¨åå ä»»ä½Javaé¢è¯ä¹åï¼é½ä¸è¦å¿äºåå¤è¿ä¸é¢ã
è¿ç¯æç« ä¸ï¼æ们ä¸ä» å°ä¼çå°HashMapåHashtableçåºå«ï¼è¿å°çå°å®ä»¬ä¹é´çç¸ä¼¼ä¹å¤ã
HashMapåHashtableé½å®ç°äºMapæ¥å£ï¼ä½å³å®ç¨åªä¸ä¸ªä¹åå è¦å¼æ¸ æ¥å®ä»¬ä¹é´çåå«ã主è¦çåºå«æï¼çº¿ç¨å®å ¨æ§ï¼åæ¥(synchronization)ï¼ä»¥åé度ã
ç±äºHashtableæ¯çº¿ç¨å®å ¨çä¹æ¯synchronizedï¼æ以å¨å线ç¨ç¯å¢ä¸å®æ¯HashMapè¦æ ¢ãå¦æä½ ä¸éè¦åæ¥ï¼åªéè¦åä¸çº¿ç¨ï¼é£ä¹ä½¿ç¨HashMapæ§è½è¦å¥½è¿Hashtableã
HashMapä¸è½ä¿è¯éçæ¶é´çæ¨ç§»Mapä¸çå ç´ æ¬¡åºæ¯ä¸åçã
fail-fastæºå¶å¨éåä¸ä¸ªéåæ¶ï¼å½éåç»æ被修æ¹ï¼ä¼æåºConcurrent Modification Exceptionã
fail-fastä¼å¨ä»¥ä¸ä¸¤ç§æ åµä¸æåºConcurrentModificationException
éå被å建åï¼å¨éåå®çè¿ç¨ä¸ä¿®æ¹äºç»æã
注æ remove()æ¹æ³ä¼è®©expectModcountåmodcount ç¸çï¼æ以æ¯ä¸ä¼æåºè¿ä¸ªå¼å¸¸ã
å½ä¸ä¸ªçº¿ç¨å¨éåè¿ä¸ªéåï¼èå¦ä¸ä¸ªçº¿ç¨å¯¹è¿ä¸ªéåçç»æè¿è¡äºä¿®æ¹ã
è¿ä»£å¨å¨éåè¿ç¨ä¸æ¯ç´æ¥è®¿é®å é¨æ°æ®çï¼å æ¤å é¨çæ°æ®å¨éåçè¿ç¨ä¸æ æ³è¢«ä¿®æ¹ã为äºä¿è¯ä¸è¢«ä¿®æ¹ï¼è¿ä»£å¨å é¨ç»´æ¤äºä¸ä¸ªæ è®° âmodeâ ï¼å½éåç»ææ¹åï¼æ·»å å é¤æè ä¿®æ¹ï¼ï¼æ è®°"mode"ä¼è¢«ä¿®æ¹ï¼èè¿ä»£å¨æ¯æ¬¡çhasNext()ånext()æ¹æ³é½ä¼æ£æ¥è¯¥"mode"æ¯å¦è¢«æ¹åï¼å½æ£æµå°è¢«ä¿®æ¹æ¶ï¼æåºConcurrent Modification Exceptionã
ä¸é¢ççArrayListè¿ä»£å¨é¨åçæºç ã
å¯ä»¥çå°å®çæ è®°âmodeâ为 expectedModeCountã
fail-safeä»»ä½å¯¹éåç»æçä¿®æ¹é½ä¼å¨ä¸ä¸ªå¤å¶çéåä¸è¿è¡ä¿®æ¹ï¼å æ¤ä¸ä¼æåºConcurrentModificationExceptionã
fail-safeæºå¶æ两个é®é¢
HashMapå¯ä»¥éè¿ä¸é¢çè¯å¥è¿è¡åæ¥ï¼
Map m = Collections.synchronizeMap(hashMap);
HashtableåHashMapæå 个主è¦çä¸åï¼çº¿ç¨å®å ¨ä»¥åé度ãä» å¨ä½ éè¦å®å ¨ç线ç¨å®å ¨çæ¶å使ç¨Hashtableï¼èå¦æä½ ä½¿ç¨Java 5æ以ä¸çè¯ï¼è¯·ä½¿ç¨ConcurrentHashMapå§ã
Go语言基础:Test的基础知识
本文内容:
使用go test命令可执行所有形如func TestXxx(*testing.T)的测试函数。
测试失败时,解析可在测试函数内使用Error,源码Fail或相关方法表示。解析
测试文件与源代码文件共处一文件夹,源码且以_test.go结尾。解析网页取ip源码
测试文件仅在使用go test命令时进行编译。源码
测试用例命名方式为Test加上待测试的解析方法名。
功能测试:如TCP功能测试,源码创建真实网络连接进行验证。解析
HTTP测试:使用标准库net/)是源码联网的意思。删除当中的解析internet即可去除该联网权限。不过具体要真正修改安卓游戏的源码权限、还需要学习APK反编译。解析
移动游戏出现了第二种;onRasta什么的源码。是一个短句、当你搜“失败”的时候就可以找到它。打开就可以修改替换。
打开该破解成功的send.apk
然后进入付费界面选择返回即可。
你还可以反编译DEX文件。再用记事本打开修改SMS(号码)、开源统计源码或人物属性、或文件修改。反编译为记事本可识别的文件很麻烦
fail-fast å fail-safe
å½ä¸ä¸ªæå¤ä¸ªçº¿ç¨æ£å¨éåä¸ä¸ªéåï¼Collectionï¼ï¼æ¤æ¶å¦ä¸ä¸ªçº¿ç¨ä¿®æ¹äºè¿ä¸ªéåï¼æ·»å ï¼å é¤æä¿®æ¹ï¼å°±ç§°ä¸ºå¹¶åä¿®æ¹ã.
å®æ¹ææ¡£å¨HashMapéåä¸å¯¹fail-fastç解é
ææå°±æ¯ï¼è¿ä¸ªè¿ä»£å¨ï¼Iteratorï¼è¢«å建åï¼é¤äºè¿ä»£å¨èªèº«çæ¹æ³ï¼removeï¼å¯ä»¥æ¹åéåçç»æï¼å ¶ä»æ åµæ¹åäºéåçç»æï¼é½å°è·åºä¸ä¸ª ConcurrentModificationException å¼å¸¸ã
ä»ä¸é¢çæºç ï¼å¯ä»¥åç°è¿ä»£å¨å¨æ§è¡ next() çæ¹æ³çæ¶åï¼é½ä¼è°ç¨ä¸ä¸ªæ¹æ³ checkForComodification() ï¼èè¿ä¸ªæ¹æ³å°±æ¯æ£æ¥ modCount æ¯å¦çäº expectedModCount ï¼å¦æä¸çäºå°±æåº ConcurrentModificationException å¼å¸¸ã
expectedModCount è¿ä¸ªåéçå¼å¨å¯¹è±¡è¢«å建çæ¶åå°±èµäºäºä¸ä¸ªåºå®çå¼ modCount ï¼è¿ä¸ªå¼æ¯ä¸åçï¼å½è¿ä»£å¨éåå ç´ çæ¶åï¼å¦æ modCount åçäºæ¹åï¼é£å°±ä¼æåºå¼å¸¸ã
æ¥çæºç å¯ä»¥åç°ï¼å½å¯¹éåè¿è¡å¢å æä½é½ä¼ modCount++ ã
æ以å½æ们对éåçå ç´ ç个æ°ååºä¿®æ¹ï¼æ·»å ãå é¤ï¼çæ¶åï¼ modCount çå¼å°±ä¼åçæ¹åï¼ä½å¯¹å ç´ è¿è¡ä¿®æ¹åä¸ä¼æ¹å modCount çå¼ã
ä¿è¯å¨å¹¶åä¿®æ¹çæ¶åï¼å¯¹ææä¼å½±åå° modCount åçæ¹åçå°æ¹ï¼å ä¸åæ¥éï¼synchronizedï¼ï¼æè 使ç¨åæ¥ç±»å®¹å¨ Collections.synchronizedList ã
.
fail-safeï¼ä»»ä½å¯¹éåç»æçä¿®æ¹é½ä¼å¨ä¸ä¸ªå¤å¶çéåä¸è¿è¡ä¿®æ¹ï¼å æ¤ä¸ä¼æåº ConcurrentModificationException å¼å¸¸ã
两个é®é¢ï¼
ä»æºç å¯ä»¥çå°ï¼å¨å¯¹éåè¿è¡æ·»å åå é¤å ç´ çæ¶åé½è¿è¡å éï¼ç¶å让å½åä¸æ çå ç´ æ·»å æå é¤ï¼æåå°åæ°ç»çå°åæåæ°çæ°ç»ï¼å®æå¤å¶ãè¿éæ¶åå°CopyOnWriteæºå¶ã
è¿æ ·åä¸ä¼åºç° fail-fast ï¼ä½æ¯å¯¹éåè¿è¡å¢å æä½é½éè¦å éï¼å½±åæçãåæ¶å¢å 对象容éå¯è½ä¼å¯¼è´ OOM ã
å¨éåè¿ç¨ä¸ï¼éåçå ç´ å¹¶ä¸ä¸å®æ¯æç»çå ç´ éåï¼æ以åªè½ä¿è¯æç»ä¸è´æ§ã
我找到了Dubbo源码的BUG,同事纷纷说我有点东西
某天,运营反馈称,执行一次保存操作后,后台出现3条数据,我立刻怀疑可能存在代码问题。为了确保不会误判,我要求暂停操作,天下ssc源码保留现场,以便我进行排查。
查看新增代码,发现是同事三歪进行的改动,他将原有的dubbo XML配置方式改为了注解方式。我询问其改动详情,得知他是更改了模块的配置方式。于是,我决定深入研究,找出问题所在。dnf移动源码
dubbo配置方式多样,最常见的为XML配置与注解配置。我已初步推测原因,接下来将进行详细的调试过程。
我使用dubbo版本2.6.2进行调试。首先,针对采用@Reference注解条件下的重试次数配置,我发现调用接口时,会跳转到InvokerInvocationHandler的invoke方法。继续跟踪,delphi甘特图源码最终定位到FailoverClusterInvoker的doInvoke方法。在该方法中,我关注到获取配置的retries值,发现其默认值为null,导致最终计算出的重试次数为3。
采用dubbo:reference标签配置重试次数时,同样在获取属性值后,发现其默认值为0,与注解配置一致,最终计算出的重试次数为1。对比两种配置方式,我总结了以下原因:
在@Reference注解形式下,dubbo会在注入代理对象时,通过自定义驱动器ReferenceAnnotationBeanPostProcessor来注入属性。在标签形式下,虽然也使用了Autowired注解,但dubbo会使用自定义名称空间解析器DubboNamespaceHandler进行解析。
在注解形式下,当配置retries为0时,属性值在注入过程中并未被解析为null,但进入buildReferenceBean时,因nullSafeEquals方法的处理,导致默认值和实际值不一致,最终未保存到map中。而标签形式下,解析器能够正确解析出retries的值为0,避免了后续的问题。
总结发现,采用@Reference注解配置重试次数时,dubbo在注入属性过程中存在逻辑处理上的问题,导致默认值与实际值不一致。此为dubbo的一个逻辑bug。建议在不需要重试时,设置retries为-1,以确保接口的幂等性。需要重试时,设置为1或更大值。
问题解决后,我优化了文件操作,将其改为异步处理,从而缩短了主流程的时间。最终,数据出现3条的状况得以解决。
此问题已得到解决,并在后续dubbo版本2.7.3中修复,确保了在注解配置方式下,nullSafeEquals方法能够正确处理默认值与实际值一致的情况。