`
dingchd
  • 浏览: 15687 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java多线程点滴记录2

    博客分类:
  • java
 
阅读更多

经过某项目A的代码监察,发现很多多线程开发中易忽视的问题,以记录之。

 

1.  可能存在并发访问的对象没有同步控制

此为最典型的缺乏同步控制,对某些框架中的类不熟悉其使用

比如Servlet类本身是非线程安全的

比如并发使用同一RandomFileAccess对象进行读写,尽管对不同的文件部分进行读写,但由于其内部实现使用JNI,因此仍然会出现意向不到的问题

 

2.  深拷贝不完全导致对某个对象的并发读写

存在多线程对Map进行操作,然而不仅仅对Map本身操作,还对其value操作。如果直接对Map本身进行Clone,则无法对value和key进行clone。进而在同步块外对key/value进行并发读写:

 

		Map<String, Integer> map2 = null;
		synchronized (map) {
			map2 = (Map<String, Integer>) map.clone();
		}

		// do something to Integer 

3.  wait/notify造成的时序问题

如果期望wait被notify唤醒,那么务必保证调用wait的线程迟于调用notify的线程,否则wait会无人唤醒

 

4.  死锁

警惕环的出现,比如A、B同时调用方法t,t中存在一个同步块,A等待C线程某个信号出现,而C等待B线程退出,此时三者出现环

 

5.  CAS-ABA

有时候过于依赖CAS方法,比如多个线程只期望其中一个执行方法A,待A成功返回后其他等待的线程继续工作:

if (wait.compareAndSet(false, true)) {
			// 做实质操作
		} else {
			// 只有一个线程会激发,竞争失败的则等待,
			synchronized (object) {
				try {
					object.wait();
				} catch (InterruptedException e) {

				}
			}
		}

 如果wait变量置为true后,该时序操作上下文中不存在将其重置false,则尚可,若存在其他线程将其重置为false,时,那么使用CAS做并发控制则会出现ABA问题,使得某个期望只执行一次的操作会被执行多次。

 

6.  轮训等待中CPU利用率过高

一个线程的run方法持续观察某个变量,之后会激发某个操作,在不使用信号量等并发包时,通常有以下两种写法

boolean exist = false;
		// 第一种
		while (!exist) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
			}
		}

		// 第二种
		while (!exist) {
			synchronized (object) {
				try {
					object.wait(500);
				} catch (InterruptedException e) {
				}
			}
		}

 

分享到:
评论

相关推荐

    基于java的个人日记本系统设计与实现(源代码+数据库+辅导视频).zip

    这些功能的实现涉及到了Java的类、对象、接口、异常处理、多线程以及网络编程等基础知识。例如,可能会使用到Servlet和JSP进行服务器端交互,使用JavaMail API实现邮件提醒功能,或者利用JSON进行数据交换。 数据库...

    java编写的记事本

    是一款使用Java编程语言开发的应用程序,它不仅提供了基础的文本编辑功能,如新建、打开、保存、复制、粘贴、查找、替换等,还引入了一个创新特性——集成音乐播放功能,使用户在记录生活、工作点滴的同时可以享受...

    Java-learning-experience.zip_experience

    文档中可能包含了在多线程环境下遇到的挑战和解决策略。 最后,Java的输入输出(I/O)系统、网络编程、反射、注解以及最近的Java新特性(如Lambda表达式、Stream API等)也是学习的重点。这些内容可能在文档中有所...

    Java程序员上班那点事儿

    Java是一种多线程、面向对象的编程语言,具有平台独立性,因此,理解JVM(Java虚拟机)的工作原理,以及如何优化代码运行效率,是每个Java程序员必备的知识。书中的章节可能包括类与对象、封装、继承、多态等OOP概念...

    JavaSpringBoot个人日记本系统

    1. **Java基础**:Java是系统的编程语言基础,包括面向对象编程、异常处理、集合框架(如List、Set、Map)、多线程、IO流等。理解并熟练运用这些基础知识是开发的前提。 2. **SpringBoot框架**:SpringBoot简化了...

    JavaJNI资料全整理含自己的常见问题总结.pdf

    2. **高级主题**:涵盖更深入的主题,如性能优化、多线程支持等。 3. **示例代码**:提供丰富的示例代码帮助理解如何在实际项目中应用JNI技术。 #### JNI使用技巧点滴(二) 1. **最佳实践**:分享使用JNI时的一些...

    简易记事本

    【简易记事本】是一款基于Java编程语言开发的小程序,主要功能是提供一个简单、便捷的文本编辑环境,用户可以在此记录文字信息,保存和管理日常的点滴。这款记事本程序虽然简单,但涵盖了Java编程中的核心概念和技术...

    安卓java读取网页源码-init-Public-Project:init-公共项目

    安卓java读取网页源码 :fuel_pump:说明 好记性不如烂笔头,变秃才能变强。 该仓库作为我的收集导航页面,文章来源于自己博客或者互联网,记录了我在开发过程的点滴,希望这些...​Java多线程 ​JVM/NIO/...等等 设计模

    CalendarPad(日历日记本)

    CalendarPad的开发基于Java,这意味着它利用了Java的类库、异常处理、多线程以及丰富的API等功能,确保了程序的稳定性和兼容性。 2. **Swing或JavaFX GUI框架** 为了构建用户界面,开发者可能使用了Java的Swing或...

    免费的cs freecs

    同时,为了优化游戏体验,可能还运用了多线程技术,以并发处理多个玩家的请求。 在图形渲染方面,虽然Java本身并不擅长3D图形处理,但可以通过Java 3D库或者第三方库如LWJGL(Lightweight Java Game Library)来...

    plog-android:个人记录器 Android 应用程序

    作为一款Android应用,它充分利用了Android系统的特性,如通知栏提醒、多线程处理、SQLite数据库存储等,来实现用户友好且高效的数据管理。通过集成Plog API,用户可以轻松地上传、查看和管理他们的记录,无论是文字...

    journalApp:一个日记应用程序,用户可以在其中记录自己的想法和感受

    1. **Java编程基础**:包括类、对象、接口、异常处理、IO流、多线程等,这些都是构建应用程序的基础。 2. **Android开发**:如果journalApp是Android应用,那么会涉及到Android SDK,Activity管理,Intent通信,布局...

    note

    6. **多线程**:线程的创建和管理,同步机制(如synchronized关键字,Lock接口),线程池的使用。 7. **反射机制**:如何在运行时动态地获取类的信息并调用方法。 8. **泛型**:提高代码的类型安全性和重用性。 9...

    DailyMomentApp

    【描述】:“DailyMomentApp”是一个用Java语言编写的日常记录应用,旨在帮助用户捕捉生活中的点滴时刻,记录日常感想,提供便利的日程管理和提醒功能。这个应用程序可能包含了前端用户界面、后端服务器逻辑以及...

    手机QQ空间说说.zip

    【手机QQ空间说说】是腾讯公司为QQ用户推出的一款社交功能,允许用户在移动设备上分享生活点滴、心情感悟,与其他用户互动。这个压缩包文件"手机QQ空间说说.zip"显然包含了与实现这一功能相关的代码资源。下面将详细...

    Diary1:SE课作业

    2. **Java基础**:Java是一种广泛使用的面向对象编程语言,它的语法结构清晰,支持多线程,并且具有“一次编写,到处运行”的特性。对于Android开发,理解类、对象、包、接口、异常处理以及面向对象设计原则是至关...

    LumpNotes-Android:适用于Android的Notes应用程序

    LumpNotes-Android是一款专为Android用户设计的笔记应用程序,它旨在提供一个高效、便捷的平台,让用户能够随时随地记录生活中的点滴、工作中的想法或是学习中的笔记。在这个项目中,开发者运用了Java编程语言,展现...

    notes:注意Android应用程式

    在Android应用开发中,"笔记"是一个常见的应用场景,通常用于帮助用户记录日常生活、工作或学习中的点滴信息。这里提到的项目可能是一个简单的Android笔记应用程序,使用了Java编程语言进行开发。Java是Android平台...

    Android备忘录记事本Shuffle源代码

    【Android备忘录记事本Shuffle源代码】是一款针对Android平台设计的记事本应用的源码,它提供了一种高效、便捷的方式来记录和管理日常生活中的点滴事务。这款源码由国外开发者编写,以其良好的代码规范和较高的参考...

Global site tag (gtag.js) - Google Analytics