学习Java多线程编程前必须要掌握的概念

Java是一种多线程编程语言,我们可以使用Java来开发多线程程序。 多线程程序包含两个或多个可同时运行的部分,每个部分可以同时处理不同的任务,从而能更好地利用可用资源,特别是当您的计算机有多个CPU时。多线程使您能够写入多个活动,可以在同一程序中同时进行操作处理。
但是初学者在学习java多线程的的时候,肯定会遇到肯多坑和坎,为了避免由于缺少这些基础知识给学习java多线程带来的学习障碍,甚至打击学习java的积极性,下面这些铺垫知识可以给学习java多线程带来更好的学习体验。

基础概念

  • 同步(Synchronous)和异步(Asynchronous)
    • 同步
      同步和异步通常用来形容方法调用,当调用者调用一次方法后,调用者必须等到调用方法返回,才能执行后续的行为
    • 异步
      调用者调用方法后,方法直接返回,调用者继续执行后续的行为,待异步调用完成时会通知调用者

为了更好的解释同步和异步,再用一个例子解释一下同步和异步,假设你正在烧一壶水,同步代表的含义就是:你在烧水的时候,你必须等待烧水的任务,完成之后再去做其他事情。而异步代表的含义是:你在烧水的时候,你完全可以去干自己的事情,比如看电视,洗衣服,打电话等,当水烧好的时候,水壶会通过鸣笛的方式主动告知你水已经烧好了。

  • 并发(Concurrency)和并行(Parallerism)

    • 并发
      并发和并行都代表两个或者多个任务同时执行,并发表示任务的交替执行
    • 并行
      表示真正意义上的“同时执行”,需要多核cpu的支持
  • 临界区
    临界区是一种公共资源/共享资源,可以被多个线程同时使用,但如果一个线程正在使用临界区资源,那么其他线程必须等待。

  • 阻塞(Blocking),非阻塞(Non-Blocking)

    • 阻塞
      用来形容多线程之间的相互影响,当一个线程正在使用临界区资源,那么其他线程必须等待,等待就会导致线程挂起,这种情况就是阻塞,如果占用资源的线程一致不释放资源,那么其他线程就会阻塞在临界区上不能工作
    • 非阻塞
      与阻塞相反,非阻塞代表,没有任何一个线程可以防癌其他线程的执行,所有线程都会尝试不断向前执行
  • 死锁(Deadlock),饥饿(Starvation),活锁(Livelock)
    这些都是多线程的活跃性问题,发生其中任意一种情况,相关线程可能就无法继续执行

    • 死锁
      在多线程任务中,每个线程都占用对方资源,导致任务无法继续执行的情况
    • 饥饿
      在一个或者多个线程中,由于各种原因导致无法获取所需资源,无法继续执行的情况,如优先级低,或者线程被阻塞了
    • 活锁
      以生活中的例子来比喻,比如你刚准备进入电梯,电梯里的某个人想要,出来不巧的是,你们刚好撞在一起,你向左避让对方,对方刚好向右避让,这种来回的避让导致你们两都没法进入或走出电梯,这就是活锁的场景

并发级别

由于临界区的存在,多线程的并发必须受到控制,根据并发的策略大致有一下几种

  • 阻塞(Blocking)
    一个线程是阻塞的那么,在其他线程没有释放资源前,当前线程无法继续执行,我们可以用synchronized关键字或者重入锁得到一个阻塞的线程
  • 无饥饿(Starvation-Free)
    如果存在优先级的多个线程,高优先级的线程会优先于低优先级的线程,这样就会导致低优先级的线程无法继续执行,进入饥饿状态,这样是不公平的,可以通过公平锁的方式来依照先来后到的原则让每个线程都能都执行
  • 无障碍(Obstruction-Free)
    无障碍是最弱的一种非阻塞调度,多线程任务中,多个线程同时无障碍的执行,他们不会因为临界区的问题导致,线程挂起的现象,但是如果多个线程同时操作临界区资源,那么就要对自己所做的修改进行回滚,确保数据安全,如果没有数据竞争发生,那么线程就会顺利完成工作走出临界区
  • 无锁(Lock-Free)
    无锁的并行都是无障碍的。在无锁中所有线程尝试对临界区进行访问,但不同的是无锁的并发保证,必然有一个线程在有限步骤内完成操作离开临界区,但是有可能会出现某些线程在争夺临界区资源时一直失败,出现饥饿现象
  • 无等待(Wait-Free)
    为了解决无锁中可能会有线程出现饥饿现象的问题,无等待要求所有线程必须在有限步骤之内完成
  • 无等待(Wait-Free)
    为了解决无锁中可能会有线程出现饥饿现象的问题,无等待要求所有线程必须在有限步骤之内完成

JMM

并行程序要比串行程序复杂,最重要的是保证数据的一致性和安全性

  • 原子性(Atomicity)
    原子性是指一个操作的不可中断,在多线程一起执行时,一个操作一旦开始,就不会受其他线程的干扰
  • 可见性(visibility)
    当一个线程修改了某一共享变量的值,其他变量能否立即获取这个修改,会导致可见性原因,如缓存优化,指令重排
  • 有序性(ordering)
    由于指令重排这种机制的存在,导致程序的顺序和真正的执行顺序可能不一致,在串行程序中有序性问题是不存在的,在并行程序中,指令重排后无法保证并行程序中的语义一致。这就是在多线程中有序性问题的根本所在

以上大概就是学习java多线程前,必须要了解的一些知识,这些内容有助于java多线程的学习,避免一开始由于缺少基础知识,带来学习上的障碍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容