- 1、本文档共32页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java并发编程的常见陷阱
Java并发编程的常见陷阱boyan@(伯岩)
不要把并发当成万能锤子多线程 != 性能提升Amdahl定律。如果F是必须串行化执行的比重,那么Amdahl定律告诉我们,在一个N处理器的机器中,我们最多可以加速:正确使用读写锁读时不能写写时不能读可以并发读不能并发写读写比例高典型错误——LRUMap简单实现继承LinkedHashMap,enableLRU设置为true,覆写removeEldestEntry方法,使用读写锁同步读时不能写 √写时不能读 √可以并发读 Ⅹ不能并发写 √读写比例高 √在构造函数中启动线程继承带来的隐患问题假设A的构造函数中启动某个线程,该线程读取A中的实例变量iB继承A,并在构造函数中重新给i赋值问题: B的实例初始化,首先初始化父类A,启动线程,线程此时读取的i非B所期望。解决: 1、不允许继承——final 2、单独的start方法(推荐)正确使用wait/notify一个世界在等待 常见问题代码:问题: 未同步 If替代while——虚假唤醒 notify替代notifyAll——被遗忘的线程Atomic+Atomic!=AtomicMethodA is thread-safeMethodB is thread-safe组合起来还是线程安全的吗?public void methodC(){ MethodA(); MethodB();}我要同步容器是同步的,就没有问题了吗?同步的不是容器,而是寂寞正确处理中断 将中断进行到底Terrupt()干什么了?设置中断状态中断阻塞操作Howwait,sleep,join都是native mthod,直接抛出InterruptedExceptionInterruptibleChannel,关闭连接,抛出ClosedByInterruptException(AbstractInterruptibleChannel.java): 错误案例1取消任务,取消不了?错误案例2吞掉中断,上层代码怎么办?错误案例3包装成Runtime异常?取消任务的正确做法没有阻塞操作, volatile状态变量不响应中断的阻塞操作,如socket.read()之类,关闭socket。响应中断的阻塞操作(如sleep,wait,join等),推荐状态变量+捕捉中断异常处理InterruptedException除非你明确知道你在干什么,否则不要简单地catch并忽略声明Check异常,继续抛出,交给他人处理重设中断状态,让上层代码发现中断状态。嫁错郎,加错锁女怕嫁错郎Dont#1: Don’t synchronize on an object you’re changing#2: Don’t synchronize on a String literal#3: Don’t synchronize on auto-boxed values#4: Don’t synchronize on null#5: Don’t synchronize on a Lock object#6: Don’t synchronize on getClass()#7: Be careful locking on a thread-safe object with encapsulated locking 错误案例1只把杭州当汴州问题: foo是null? 改变了foo指向的对象,加锁形同虚设错误案例2躲猫猫问题: Bar跟Foo的test方法中的锁不一样。错误案例3对同步的容器加锁,使用的锁与容器内部使用的锁不一定是同一个。HashTable、Vector √ConcurrentHashMap X不一致的同步int的读写,问题不是太大邂逅Map忘记我的另一半,不可原谅阿甘,先别run美国犀利哥Start Vs. Run哥只是爱跑步问题:/bugdatabase/view_bug.do?bug_id=4533087在jdk1.4.2以前,每个thread初始化都会加入ThreadGroup,如果你只是调用run而不是start,那么此thread将无法被正常回收造成内存泄漏。在JDK5之后,将加入ThreadGroup这一步从构造函数转移到start方法,因此不会有问题。正确使用VolatileVolatile能做什么?状态标识,如取消任务线程安全发布,如修复DLC问题开销较低的读写锁正确使用Volatile Volatile不能做什么? 不能用于做计数器 与其他变量构成不变式 规避j.u.c的bugLinkedBlockingQueue.poll(time,timeUnit) 内存泄漏,其他queue也有类似问题/bugdatabase/view_bug.do?bug_id=6460501http:
您可能关注的文档
最近下载
- 海南省海口市(新版)2024小学语文人教版小升初真题(巩固卷)完整试卷(含答案).docx VIP
- 2025-2030中国医学影像设备行业深度调研及投资前景预测研究报告.docx
- 公安院校公安专业本专科招生政治考察表(2022年西藏报考公安院校公安专业招生).doc VIP
- 劳动争议管理制度.docx VIP
- 2024年秋季新北师大版七年级上册数学全册导学案.docx
- 2020-2021学年北京市朝阳区北京版四年级下册期末测试英语试卷.docx VIP
- 骨关节感染患者的护理(外科护理).pptx
- 波形护栏质量检验评定表、报告单.pdf VIP
- 大学《传感器原理及应用》习题解析及期末考试真题.docx VIP
- 基于PLC控制的泡沫切割机-毕业论文.doc VIP
文档评论(0)