上下文切换

多线程并不一定是要在多核处理器才支持的,就算是单核也是可以支持多线程的。 CPU 通过给每个线程分配一定的时间片,由于时间非常短通常是几十毫秒,所以 CPU 可以不停的切换线程执行任务从而达到了多线程的效果。

但是由于在线程切换的时候需要保存本次执行的信息(详见),在该线程被 CPU 剥夺时间片后又再次运行恢复上次所保存的信息的过程就成为上下文切换。

上下文切换是非常耗效率的。

通常有以下解决方案:

  • 采用无锁编程,比如将数据按照 Hash(id) 进行取模分段,每个线程处理各自分段的数据,从而避免使用锁。
  • 采用 CAS(compare and swap) 算法,如 Atomic 包就是采用 CAS 算法(详见)。
  • 合理的创建线程,避免创建了一些线程但其中大部分都是出于 waiting 状态,因为每当从 waiting 状态切换到 running状态都是一次上下文切换。

死锁

死锁的场景一般是:线程 A 和线程 B 都在互相等待对方释放锁,或者是其中某个线程在释放锁的时候出现异常如死循环之类的。这时就会导致系统不可用。

常用的解决方案如下:

  • 尽量一个线程只获取一个锁。
  • 一个线程只占用一个资源。
  • 尝试使用定时锁,至少能保证锁最终会被释放。

资源限制

当在带宽有限的情况下一个线程下载某个资源需要 1M/S,当开 10 个线程时速度并不会乘 10 倍,反而还会增加时间,毕竟上下文切换比较耗时。

如果是受限于资源的话可以采用集群来处理任务,不同的机器来处理不同的数据,就类似于开始提到的无锁编程。

Java 多线程常见问题相关推荐

  1. Android Java 多线程常见问题

    1 sychronied 修饰普通方法和静态方法的区别?什么是可见性? 对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态 方法或者一个类的 class 对象上的.我们知道,类的对象实 ...

  2. java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?

    java中关于集合的内容也是十分丰富的,而且相关的知识点也是十分多的.多线程集合所涵盖的范围是十分广阔的.今天就来为大家介绍一下,java多线程同步集合是什么以及并发集合是什么?一起来看看吧. 首先我 ...

  3. JAVA多线程和并发基础面试题

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观 ...

  4. java 多线程 并发 面试题_最常见的15个Java多线程,并发面试问题

    假设你有三个线程T1,T2,T3.你如何能保证线程T2在线程T1后运行,T3在T2后运行 这个线程面试问题大多是在第一轮或电话筛选轮次中会被问到的,这个多线程问题的目的是检查候选人对"joi ...

  5. java多线程与并发_漫画 | Java多线程与并发(一)

    1.什么是线程? 2.线程和进程有什么区别? 3.如何在Java中实现线程? 4.Java关键字volatile与synchronized作用与区别? volatile修饰的变量不保留拷贝,直接访问主 ...

  6. IBM Java多线程 - 7.结束语和参考资料

    结束语和参考资料 1. 结束语 2. 参考资料 3. 反馈意见 结束语 第 1 页(共3 页) 每个 Java 程序都使用线程,不论您知道与否.如果您正在使用 Java UI 工具箱(AWT 或 Sw ...

  7. java 多线程 变慢_java多线程并发程序执行慢有什么原因?该怎么解决?

    我们在执行java多线程并发程序时有时候会碰到执行特别慢的场景,小伙伴们知道是什么原因导致的吗?它要怎么解决呢?下面小编就为你讲讲. 前提:在某地需要开发一个应用系统,此系统主要功能是能够让一些中小型 ...

  8. Java 多线程与并发编程专题

    Java 线程基础 Java 多线程开发 线程安全与同步 并发控制 非阻塞套接字(NIO) Java 5 中的并发 JDK 7 中的 Fork/Join 模式 相关书评 Java 平台提供了一套广泛而 ...

  9. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

最新文章

  1. c语言基础知识pdf下载,C语言主基础知识.pdf
  2. 关于SSH远程连接报错
  3. SQL函数大全——实例
  4. 两个不同网段的局域网如何互通_多台路由器,不同网段的设备之间如何互访?...
  5. dump java 内存_Java如何dump对象的内存
  6. 比较难发音的英语音标音符_音素_英语发音
  7. 机器人编程与python语言的区别_一分钟看懂“机器人编程”和“少儿编程”的区别!...
  8. SAP License:2021年度最新FICO面试题目
  9. 黑客游戏未发先被黑:游戏开发商Ubisoft 和 Crytek遭勒索攻击
  10. 正则表达式那些事儿(一)
  11. 几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm...
  12. 高聚合和低耦合的理解
  13. mysql fopen_fopen与读写的标识r,r+,rb+,rt+,w+.....
  14. Python chardet
  15. matlab中可调节负载,请教MOC3022控制可控硅的电路调节负载功率的问题
  16. 无法查看MSN聊天记录 总弹出下载.xml文件的对话框
  17. 笔记本开发android占用,安卓笔记本是什么样子的?Bliss OS进入开发阶段
  18. 推荐几本这个系列封面的编程书,涉及Python、计算机图形学、Linux
  19. 小程序点击删除后刷新当前页面
  20. 外贸人如何快速熟悉行业产品?

热门文章

  1. Linux操作系统上的mysql安装
  2. 数据库事务系列-事务模型基础
  3. 《Web前端工程师修炼之道(原书第4版)》——我该从哪里开始呢
  4. 《Cisco IOS XR技术精要》一4.4 理解二级提交模型
  5. STL算法algorithm,
  6. android app自动化测试之UIAutomator
  7. oracle 内存结构 share pool sql解析的过程
  8. Python初学者之ModuleNotFoundError:No module named 'cv2'简单解决办法
  9. 动手敲10行代码读懂Python
  10. 慢慢聊Linux AIO