1.多线程基本概念

基本知识

在多核的CPU中,一个CPU(核心),一个核心基本可以运行多个线程,每个执行一段时间切换到下一个线程,但是如果线程过多就会产生 切换上下文的时间消耗,所以线程不能过多。由于现在CPU执行速度过快,内存极大的拖慢了速度,所以在CPU中会有L1、L2、L3的缓存,速度极快,用于充当CPU和内存的桥梁提高速度

CPU多级缓存

由于每个CPU都有自己的缓存区,为了保证多个CPU缓存区域使用到共享数据如何保证数据的一致性,就出现了MESI的协议
M(修改):当前CPU缓存独占且已修改了共享数据,即与主存的数据不一致,需要被写回主内存,当写回主存以后变为E状态
E(独享):一个CPU缓存独占数据且和主存中的一致,当被读取时进入S状态,当被修改时进入M状态
S(共享): 该缓存与主存中的数据一致,可能被多个CPU缓存,当其中cpu对数据做出修改时,其他cpu缓存的该数据可以进入I(无效)状态
I(无效):缓存无效,其他cpu修改了共享数据
除了I状态,其他状态都可以被读取,写请求只能在M状态或者是E状态下可以被写入,如果处于S必须将其他cpu中的数据变为I状态才可写入

image.png

CPU优化

CPU可能会为了提高运算速度而调整代码原有顺序,但是会保证结果一致,但是多核环境下不一定,因为多核运行可能第一个依赖第二个核的线程的结果在做操作,但是结果CPU优化把第一个CPU的代码先运行就会造成某些意料之外的结果

使用多处理器

如果使用一个双处理器中运行一个单线程程序,等于放弃了其中一半的资源,其实单个处理器也能运行多线程程序,如果一个线程是单线程的,在这个处理器等待同步IO时,处理器依旧是空闲状态,如果使用程序多线程,当程序遇到阻塞时,另外一个线程也能执行

使用多线程的好处

多线程毋庸置疑的,在把多个任务分给多个线程,能提高其效率,但是如果创建过多的线程可能反而会降低效率, 因为过多的线程会引起上下文切换,因为处理器在执行的时候是分时执行,需要在不同的线程中来回切换,这就导致了大量时间消耗

线程安全举例

在我们常用的servlet中,在客户端发送请求过来时,都是多线程访问servlet,但是我们好像重来没有关注过它,那么它们是线程安全的吗,如下,她是线程安全的,因为它是一个无状态类,每一个线程进入以后,都会新建那些变量,对象之间没有共享状态,故而是安全的

image.png

下面这个servlet是线程不安全的,因为它们访问了类变量,类变量是对象之间共享的,也就是线程之间共享的,多个线程操作同一个共享变量就会造成线程安全问题,因为i++并不是一个原子性操作,它的操作可以被分解为三个步骤,取出i,i+1,赋值给i,多个线程运行时,可能阻塞在其中一步,就运行其他线程,导致的结果就是多个线程修改后的变量结果一致
image.png

竞争条件和数据竞争

竞争条件:指的是当一个线程在执行一个判断语句为真,然后阻塞去执行线程2,线程2把判断语句里的指值更新到了false,这是线程1就会出现预料之外的问题,例如懒汉式单例就存在竞争条件
数据竞争:上面那个线程非安全的举例就是数据竞争,由于没有对共享变量做同步处理,多个线程访问时,可能在去读到还未修改时,另外一个线程也在读取修改

原子性

有线程A和B,当线程B在执行多个操作时,必须保证这个B的操作要么同时操作,要么不操作

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

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,079评论 1 32
  • 1、什么是多线程 多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具...
    Laughingg阅读 659评论 0 4
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 708评论 0 0
  • 什么是多线程? 一个程序(一个进程)运行过程中产生了不止一个线程。 一个生产汽车的车间好比一个进程,这个车间里的每...
    powerjiajun阅读 259评论 0 0
  •   一个任务通常就是一个程序,每个运行中的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个顺...
    OmaiMoon阅读 1,661评论 0 12