博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程之高并发的一些概念
阅读量:4163 次
发布时间:2019-05-26

本文共 758 字,大约阅读时间需要 2 分钟。

前言

Java多线程系列相关的代码示例已经上传到github:

同步和异步

在这里插入图片描述
同步:A调用B,B处理完毕后响应给A
异步:A调用B,B先返回给A,然后在后台启动一个新的线程进行处理

并行和并发

在这里插入图片描述
并行:两个线程同时跑,适合多核CPU,是真正意义上的同时
并发:一个线程分批次跑,适合单核CPU

临界区

临界区用来表示一种公共资源或者说共享数据,可以被多个线程使用。但是每一次,同时只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,必须等待

阻塞和非阻塞

两个都是并发级别的

阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界资源,那么其他所有需要这个资源的线程就必须在这个临界区中等待,等待会导致线程挂起,这种情况就是阻塞。此时,如果占用的资源的线程一直不愿意释放资源,那么其他所有阻塞在这个临界区上的线程都不能工作

非阻塞允许多个线程同时进入临界区,分为如下几种:

  • 无障碍
    • 一种最弱的非阻塞调度
    • 自由出入临界区
    • 无竞争时,有限步内完成操作
    • 有竞争时,回滚数据
  • 无锁
    • 是无障碍的
    • 保证有一个线程可以胜出
  • 无等待
    • 无锁的
    • 要求所有线程必须在有限步内完成
    • 无饥饿的

死锁、饥饿、活锁

  • 死锁:多个线程占用不同资源一直不释放就会导致死锁,阻塞也会导致死锁,死锁是静态的,线程会停止不动,容易排查
  • 饥饿:指某一个或多个线程因为某种原因无法获得所得需要的资源,导致一直无法执行
  • 活锁:A线程占用A1资源,B线程占用B1资源,但是两个线程同时需要A1和B1资源,因此互相谦让,A线程释放掉A1资源,B线程释放掉B1资源。接着,A发现A1和B1同时有了,又开始抢占资源,抢到B1资源,同理B线程抢占到A1资源,结果资源又不全,索性再次全部释放掉,如此反复。。。活锁比死锁更难以调查,因为线程一直在变动

转载地址:http://qwpxi.baihongyu.com/

你可能感兴趣的文章
ubuntu unzip解压时提示错误 解决方法
查看>>
sprintf函数的说明
查看>>
BOOST_TYPEOF和BOOST_AUTO 作用
查看>>
随机森林概述
查看>>
2011十大战略技术
查看>>
大学应该学的软件知识
查看>>
腾讯与360战争背后的云计算阴影
查看>>
腾讯看了会沉默,360看了会流泪
查看>>
李开复:移动互联网机会最大 微博会现最大赢家
查看>>
2006年的IT十大战略技术
查看>>
操作系统介绍
查看>>
Desktop Linux: The Dream Is Dead
查看>>
我的9年IT路
查看>>
任正非:让用户像用电一样享受云计算
查看>>
学习技术的几个境界
查看>>
计算机世界:免费的代价
查看>>
方兴东:中国网站十年
查看>>
2010年微软和谷歌十大战场:从桌面到浏览器
查看>>
服务器虚拟化的未来之路
查看>>
写给我们这些浮躁的系统工程师
查看>>