java多线程(壹)——线程与锁

线程与线程安全问题

所有的线程安全问题都可以概况为三个点:原子性,可见性、有序性——————by Java多线程编程实战指南


原子性

原子性就是不可分割,指该操作要么已经发生,要么就没有发生,不会存在中间状态。
这里的观察者是其他的线程,即其他线程不会看到这个线程执行到一半的结果

可见性

可见性的意思是:一个线程对某个共享变量更新后,其他线程访问该变量时可以读取到更新的结果

对于线程安全性问题来说,只保证原子性是完全不够的,只有同时保证原子性和可见性,才能保证一个线程能够正确的看到其他线程对共享变量的更改

ps:父线程在启动子线程之前对共享变量的更新对子线程来说是可见的

有序性

有序性即为保证感知顺序(给定处理器所感知到的内存访问操作发生的顺序)与源代码顺序一致

由于重排序的作用,一个线程对共享变量的更新,可能会对于另一个线程而言变得不可见(例如父线程对共享变量的操作,如果重排序到子线程启动以后,则共享变量对子线程的可见性就不可保证了)。因此有序性可以影响可见性。


线程的活性故障

1.死锁: 鹬蚌相争,谁都不松口
2.锁死: 请求一个不存在的锁 gg
3.活锁: 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
4.饥饿:非公平锁下,有线程一直获取不到锁,导致饥饿


锁的作用

锁的作用,就是为了避免线程安全问题,即保障原子性、可见性和有序性

原子性

锁通过互斥保障原子性,即一个锁只能一个线程持有。这就保障了临界区的代码一次只能被一个线程执行,没有其他线程可以访问,这使得临界区代码所执行的操作具有了不可分割的特性,即保证了原子性。

可见性

在java平台中,锁的获得隐含着刷新处理器缓存这个动作,因此在锁的获得和释放时,线程对共享变量的更新能过被推送到高速缓存中,从而保障了可见性

有序性

由于所对可见性和原子性的保障,在其他线程来看,当前线程对临界区的操作像是在同一时间被更新的,因此其他线程不必知道当前以什么顺序更新变量,即对其他线程来说,当前线程可以认为是按照源代码顺序更新共享变量。


volatile

volatile可以说是一个轻量级的锁,它提供了一个功能,那就是被其修饰的变量在被修改后可以立即同步到主内存,被其修饰的变量在每次是用之前都从主内存刷新。因此,可以使用volatile来保证多线程操作时变量的可见性。

volatile变量修饰的共享变量,在进行写操作的时候会多出一个lock前缀的汇编指令,这个指令会触发总线锁或者缓存锁,通过缓存一致性协议来解决可见性问题

对于声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,把这个变量所在的缓存行的数据写回到系统内存,再根据MESI的缓存一致性协议,来保证多CPU下的各个高速缓存中的数据的一致性。

volatile为什么不能保证原子性

对一个原子递增的操作,volatile修饰的变量会分为三个步骤:1.读取volatile变量的值到local;2.增加变量的值;3.把local的值写回让
其他线程可见
(未完待续)

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

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 11,268评论 4 56
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,707评论 0 11
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 728评论 0 0
  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,653评论 2 17
  • 汶川十年,对于看新闻的来说是个新闻,那些瞬间只是故事,那些感情也只是表达,可是,没有经历过,就无法知道,这...
    行云流水畅遨游阅读 174评论 0 0