Java并行-0.基本概念

1. 同步(Synchonous)和异步(Asynchronous)

同步和异步是用来形容一次方法调用的:

  • 同步方法开始后,调用者必须等到方法结束才能进行后续的行为;
  • 异步方法开始后,方法调用立即返回,调用者继续后续的行为,异步调用的方法完成后,再通知调用者。

2. 并发(Concurrency)和并行(Parallelism)

并发和并行指的是两个或者多个任务一起执行:

  • 并发指的是短时间内多个任务交替执行
  • 并行指的是多个任务同时执行

3.临界区

临界区表示被多个线程使用的公共资源,但是每一次只能有一个线程使用它。
比如打印机资源。

4.阻塞(Blocking)和非阻塞(Non-Blocking)

阻塞和非阻塞用来形容多线程之间的相互影响:

  • 如果一个线程占用了临界区资源,其他所有需要这个资源的线程就需要在这个临界区中等待,这就导致了这些线程的挂起,这种情况就是阻塞。
  • 如果没有一个线程能够妨碍其他线程的执行,这种情况就是非阻塞。

5.死锁(Deadlock),饥饿(Starvation)和活锁(Livelock)

死锁,饥饿,活锁,属于多线程情况下的线程活跃性问题:

  • 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
    此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

  • 饥饿指的是某一个或者多个线程无法获得说需要的资源,导致一直无法执行。
    可能的情况包括线程优先级过低,某线程长时间占用关键资源等。
    与死锁相比,饥饿是可能在未来一段时间内解决的。

  • 活锁指的是资源不断在两个或者多个线程中跳动,没有一个线程可以同时拿到所有的资源而正常执行。

6.并发级别

由于临界区(资源)的存在,多线程之间的并发是受到控制的,并发的级别被分为:阻塞,无饥饿,无障碍,无锁,无等待五种:

6.1 阻塞(Blocking)

一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行。
例如在使用了synchronized关键字,或者重入锁,得到的就是阻塞的线程。它们会在执行后续代码之前,得到临界区的锁,如果得不到,线程会挂起等待,直到占有了说需要的资源。
这是一种悲观的策略,认为两个线程之间很有可能发生冲突,以保护共享数据为第一优先级。

6.2 无饥饿(Starvation-Free)

线程之间如果有优先级,线程调度的时候就会优先满足高优先级的线程,即,对于同一个资源的分配,是不公平的。
对于非公平的锁来说,系统优先满足高优先级的线程,就可能会导致低优先级的线程产生饥饿
如果锁是公平的,满足先来后到,那么就没有饥饿产生,所有的线程都有机会执行。

6.3无障碍(Obstruction-Free)

两个线程如果是无障碍的执行,那么它们不会因为临界区(资源)的问题导致一方被挂起。
这是一种最弱的非阻塞调度。一旦发生数据竞争,需要进行数据回滚。
这是一种乐观的策略,认为系统之间发生冲突的可能性不大,以读取为第一优先级,产生冲突了再进行回滚。
无障碍可以以来一个“一致性标记”来实现:线程修改数据之前,对“一致性标记”进行修改,表明数据不再安全。其他线程读取后发现一致性标记不同,就知道资源的访问产生了冲突,需要进行回滚。

6.4 无锁(Lock-Free)

无锁的情况下,所有下次你很都能尝试对临界区进行访问,需要保证必然有一个线程能够在有限步内完成操作,离开临界区。其并行都是无障碍的。

6.5 无等待(Wait-Free)

无等待的情况下,所有的操作都必须在有限步内完成。
可以分为“有界无等待”和“线程无关的无等待”,区别在于循环次数的限制不同。

7 原子性(Atomicity),可见性(Visibillity),有序性(Ordering),Happen-Before原则

  • 原子性是指一个操作是不可中断的。
  • 可见性是指当一个线程修改了某一个共享变量的值,其他线程能否立即知道这个修改。
  • 有序性是指线程A的指令执行顺序在线程B看来是没有保证的。不过对于一个线程来说,它看到的指令执行顺序是一致的。
    有序性产生的原因是程序执行的时候,可能会进行指令重排。
  • Happen-Before原则是指令重排中不可违背的原则:
    • 程序顺序原则:一个线程内保证语义的串行性
    • volatile原则:volatile变量的写,先发生于读,这样保证了volatile变量的可见性
    • 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
    • 传递性:A先于B,B先于C,则A必然先于C
      *线程的start()方法优先于它的每一个动作
  • 线程的所有操作优先于线程的终结(Thread.join())
  • 线程的中断(interrupt())先于被中断线程的代码
  • 对象的构造函数执行,结束先于finalize()方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容