1.开篇

多线程的优势

  • 当拥有多核处理器时,每条线程只能占用一个cpu,多线程可以充分发挥多cpu的威力;
  • 即便是在单核处理器上,多线程处理io频繁的工作时(io进行中处理器会处于空闲状态),多条线程同时执行可以充分利用这个空闲时间片,提高系统吞吐率,像nodejs这样单线程基于事件队列异步处理的方式就是这个道理。
  • 不是很重要的:使更加简单,把不同的任务划分在不同的线程中执行(以人类思考问题的方式),把任务自身的执行,任务什么时候需要同步,什么节点需要汇总等分离开形成单独的问题。
  • 。。。。

带来的风险

竞态条件:当多个线程竞争访问同一个资源时,如果对访问顺序敏感,就称存在竞态条件。
最常见的静态条件:

  • 先检查后执行,如延迟初始化(如:单例)
    jvm虚拟机栈,每一个线程运行时都有一个线程栈,

线程先从主存拷贝数据到本地内存,读写都在本地内存中进行,在某个时刻(线程退出或者什么)将变化的值写回主存。

  • 安全性问题(永远不发生糟糕的事情):由于竞态条件导致对共享数据的操作完全无法预期
  • 活跃性问题(某件正确的事情最终会发生):当某个操作无法继续进行下去永久停留在那里了,就产生了活跃性问题。单线程中的死循环就是一种情况,多线程中有以下常见的几种情况:

1.死锁。多条线程相互等待对方释放锁,形成死锁。产生的四个必要条件:1)互斥,锁只能由一条线程持有,2)不可抢占,一条线程持有时,另外的线程不能强制剥夺 3)请求另外的锁时依然保持已经持有的锁(哲学家就餐问题,拿不到其他的锁,就一起释放现有的所有锁,就是避免产生这个条件的) 4)循环等待,形成环状等待锁的链路。(详细内容后续会有)
2.活锁,任务没有被阻塞,由于不满足某个条件一直重试,失败,重试,失败。(有可能自行解开的)
3.饥饿,由于线程优先级关系或者一些其他不公平的竞争条件,导致一些低优先级的线程永远也无法被执行。

  • 性能问题:
  1. 上下文切换代价大,cpu消耗在线程调度上(”保存线程A的执行现场“然后”载入线程B的执行现场”)
  2. 锁粒度太大导致并发性能降低无限接近于单线程。
  3. 会抑制一些编一起的优化操作,如指令重排序等,同步共享主存,所有读写都会作用在主存上,增加了共享内存主线上的流量。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,122评论 0 11
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 4,322评论 0 3
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 6,409评论 0 8
  • 一、多线程 说明下线程的状态 java中的线程一共有 5 种状态。 NEW:这种情况指的是,通过 New 关键字创...
    Java旅行者阅读 10,181评论 0 44
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,998评论 14 507