Java 多线程总结

Java线程同步机制

火车售票的线程安全问题

解决方法:线程同步机制:


线程同步机制实现的两种方法

应用线程同步机制,解决懒汉式单例模式的线程安全问题:


具体代码实现

线程死锁问题:


死锁代码运行造成的结果:程序运行以后停止不下来

死锁的问题:处理线程同步时容易出现。

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁

写代码时,要避免死锁!

什么时候会用多锁什么时候会用单锁

单锁是在操作一个共享数据时用到,如果多个线程操作一个共享数据,那么就是用单锁

多锁是在操作多个共享数据时用到,如果多个线程操作多个共享数据,那么就可以用多锁,因为单锁只能锁住一个共享数据,锁不住多个。前提是这多个共享数据之间没有在同一类中或包含关系。

Java线程通信:

线程通信。如下的三个关键字使用的话,都得在同步代码块或同步方法中。

wait(): 一旦一个线程执行到wait()就释放当前的锁。

notify()/notifyAll(): 唤醒wait的一个或所有锁。

经典例题:


生产者/消费者问题

生产者将产品交给店员,而消费者从店员处取走产品,店员一次只能持有固定数量的产品,如果生产者试图产生更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

具体代码实现:


仓库类


生产者类


消费者类


主方法

挖坑种树问题:

问题描述:有三人在田间种树,一人负责挖坑,一人负责种树,一人负责填坑,三人的顺序不可颠倒,种树者必须等待挖坑人挖好一个坑在种树,填坑者要等待种树者将树种好之后在进行填坑,限种树数量为20棵。

问题解决代码:


挖坑者类


种树者类


填坑者类


树类


主方法

编写代码中遇到的问题:

在编写好此代码后,运行时,发现在多次运行下,有时种树数量到达不到20棵,但是种树的线程就已经结束,导致填坑线程一致无法启动,经过调试,发现代码中少加一个判断条件;比如第一次,挖坑者挖好一个坑,这是种树者开始种树,当种树者完成后,填坑者抢到cpu开始填坑,这是种树者里面的判断条件是,判断还有没有种树的坑,但此时挖坑者只挖了一个坑,当然没有,未种树的坑,此时的种树者线程结束,因此当挖坑者再次抢到cpu挖坑时,种树者的线程早已结束,因此造成了此种现象。

解决方法:

由于有种20棵树的指标,因此当种树者在满足没有空余的坑要种树,结束线程之前,加上一个判断条件,看是否种了20棵树了,如果没有达到,就wait()一下等待挖坑线程将坑挖好之后在继续种树直到,达到指标在退出线程。

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

推荐阅读更多精彩内容

  • 一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6....
    GT921阅读 1,011评论 0 3
  • 在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制。Java提供了多种多线程锁机制的实现方...
    千淘萬漉阅读 6,880评论 1 33
  • 此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一、线程调度的...
    千淘萬漉阅读 2,554评论 0 2
  • 1、什么是线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1-...
    千淘萬漉阅读 2,539评论 0 7
  • 在Java中引入多线程的目的显而易见,当程序中有多部分代码需要同时执行,这时便需要引入多线程,将需要同时执行的代码...
    刘启敏阅读 340评论 1 1