多线程中两个必要的开销:线程的创建、上下文切换

创建线程:

创建线程使用是直接向系统申请资源的,对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被 清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。

关于资源:Java线程的线程栈所占用的内存是在Java堆外的,所以是不受java程序控制的,只受系统资源限制,默认一个线程的线程栈大小是1M(当然这个可以通过设置-Xss属性设置,但是要注意栈溢出问题),但是,如果每个用户请求都新建线程的话,1024个用户光线程就占用了1个G的内存,如果系统比较大的话,一下子系统资源就不够用了,最后程序就崩溃了。

同样的道理在java程序中也不要随意开启新的线程,特别是高频业务尽量使用线程池,不然很容易导致内存不足,程序崩溃的问题。

上下文切换:

概念:

当前任务执行一个时间片后会切换到下一个任务。在切换之前,上一个任务的状态会被保存下来,下次切换回这个任务时,可以再加载这个任务的状态,任务从保存到再加载的过程就是一次上下文切换。

说明:

1)时间片是CPU分配给各个线程的时间,时间片一般是几十毫秒。

2)CPU通过给每个线程分配CPU时间片,并且不停地切换线程来实现多线程。因为时间片非常短,所以感觉多个线程是在同时执行。

减少上下文切换的方法:

1)无锁并发编程:

多线程竞争锁时,会引起上下文切换,所以在使用多线程处理数据时,可以采用一些策略来避免使用锁。

常见的策略:将数据按照id的哈希值进行切分,不同的线程处理不同段的数据。

2)锁分离技术:

举例:ConcurrentHashMap

3)CAS算法

java的Atomic包使用CAS算法来更新数据,而不需要加锁。

4)使用最少的线程

避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

举例:

通过减少大量WAITING的线程,来减少上下文切换次数

# 转储堆栈信息

jstack PID > dumpfile

# 统计所有线程的状态

grep java.lang.Thread.State dumpfile | awk '{print $2" "$3" "$4" "$5}' | sort | uniq -c

如果存在大量waiting的线程,则查看dumpfile文件进行分析:

1)如果是服务器的工作线程大量等待,则修改服务器配置文件中线程池的配置信息,然后重启查看效果。

java 线程开销_多线程的线程开销相关推荐

  1. java timer 线程安全_多线程之 线程安全与控制

    线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...

  2. 第四章Java核心类库_多线程

    第四章第五节Java核心类库_多线程 多线程 一.线程与进程 1.线程与进程 2.线程调度 二.同步与异步&并发与并行 1. 同步与异步 2. 并发与并行 三.继承Thread 1.代码块 2 ...

  3. 线程销毁_多线程(2)-Java高级知识(9)

    前面有一篇文章写的是多线程的基本知识,以及线程实现的两种方式,一种是继承Thread类,另一种实现Runnable 接口,今天沿着前面的多线程,继续分享多线程的第三种创建方法,以及第三种创建方法的优势 ...

  4. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  5. java里新建线程设置线程名字_多线程开发不得不掌握,设置和获取线程名称及JVM如何运行的...

    原标题:多线程开发不得不掌握,设置和获取线程名称及JVM如何运行的 欲善编程,多看.多敲.多讨论:动眼.动手.动大脑. 1 如何设置和获取线程名称 多线程的运行状态是不确定的,在程序开发过程中,想要获 ...

  6. java 线程 并发_多线程高并发编程总结

    多线程 第一章 一.终止线程的三种方法: 1.使用退出标志,是县城正常退出,也就是当run方法完成后线程终止. 2.stop不推荐 3.使用interrupt(打了一个停止标记,并不是真的停止线程). ...

  7. 如何设计java线程安全类_如何设计线程安全的Java程序

    什么是线程安全的(thread-safe)? 在java中,线程安全的指的是代码可以在并发的或者多线程的环境下安全的使用或者共享,并且它们都将按照期望的方式运行.任何代码,类或者对象,如果它们在并发的 ...

  8. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  9. call线程起名字_多线程面试题总结

    1.什么是线程,什么是进程,它们有什么区别和联系,一个进程里面是否必须有个线程 进程本质是一个正在执行的程序,一个进程可以有多个线程.线程是进程的最小执行单位,一个进程至少有一个线程 区别:1:多进程 ...

最新文章

  1. mysql8.0.13可以用在生产环境_MySQL 8.0.13的使用心得
  2. Oracle资源管理器(二)-- 创建和使用数据库资源计划
  3. wpf 开源框架_.NET Core跨平台基础框架:10 篇热文汇总
  4. zip4j实现多线程压缩
  5. .Net Core3.0使用gRPC
  6. 漫画:如何做一款比吃鸡还厉害的游戏
  7. php-fpm的平滑启动
  8. SQL Server中的登录触发器概述
  9. python编程入门书籍-关于 Python 的经典入门书籍有哪些?
  10. application跟消息相关的东东
  11. 支付宝报错:missing-signature 未设置签名参数
  12. 个人对回调函数的理解(personal understanding of callback function)
  13. python语言程序设计实践教程上海交通大学出版社的答案_高等教育出版社出版社c语言程序设计实践教程习题参考答案...
  14. 机械视觉外观检测系统软件ALFA
  15. window7安装jdk报错this version of the jdk is already installed
  16. java excel 单元格 斜线_POI实现excel单元格画斜线
  17. Fiducial marker (Aruco)
  18. python 容联云测试短信接口
  19. Android仿微信图片编辑库,你想要的功能这里都有
  20. 鸿蒙升级包7g,首个华为鸿蒙2.0续航测试来了!实打实10%提升

热门文章

  1. OJ1007: 鸡兔同笼
  2. eclipse mysql jdbc驱动_java – 如何将JDBC mysql驱动程序添加到Eclipse项目?
  3. 信息学奥赛一本通 1152:最大数max(x,y,z)
  4. XOR and Favorite Number(CF-617E)
  5. 合影效果(信息学奥赛一本通-T1182)
  6. Hello,World!(信息学奥赛一本通-T1001)
  7. 7 QM配置-质量计划配置-定义检验方法的编号范围
  8. python读压缩文件内容_Python读写压缩文件的方法
  9. mysql二进制日志查看工具_Python 简易web日志查看工具可改装为命令行工具
  10. OpenGL:读取图片显示