线程与锁 - 第一天总结

学到了什么?

线程与锁模型的三个主要危害:

  • 竞态条件:即代码行为取决于个操作的时序;
  • 死锁:当需要持有多把锁时,如果获取锁的顺序不一样,则有可能死锁;
  • 内存可见性:编译器、JVM以及硬件都有可能进行重排序,导致线程看到错误的值。同时,缓存的存在可能导致线程看不到另一个线程的修改。

避免危害的准则:

  • 对共享变量的所有访问都进行同步;
  • 读线程和写线程都进行同步;
  • 按照约定的全局顺序来获取多把锁;
  • 当持有锁时避免调用外星方法(就是自己无法控制的方法);
  • 持有锁的时间应该尽可能的短。

自习

  • 阅读William Pugh的网站:Java内存模型
    这个网站像是一个目录,列举了各种与Java内存模型有关的资料地址。
  • 自学JSR 133(Java内存模型)的FAQ;
    学习成果:https://www.jianshu.com/p/145e8b98c509
  • Java内存模型是如何保证对象初始化是线程安全的?是否必须通过枷锁才能在线程之间安全的公开对象?
    对象初始化的线程安全问题其实就是由于对象还未初始化完就赋值给某个全局引用,然后被其他线程操作。但只要属性都是final的,JMM就保证在将对象赋值给某个引用前,final属性一定会被初始化。但如果不全是final属性,那就需要通过volatile来解决了,但加了volatile后,变量的读取性能会下降。
    是否一定需要加锁才能在线程之间安全的公开对象,按我的理解,如果对象是真正的不可变的,那就不需要。
  • 了解反模式“双重检查锁模式”(double-checked locking)以及为什么称其为反模式。
    双重检查锁模式,顾名思义,就是进行了两次检查,并加锁,而且是加在第二次检查的时候(这个顾名思义不出来)。它是来实现一个能延迟初始化的线程安全的单例模式。双重检查就是进行了两次非空检查,锁就是在第二次检查的时候枷锁。
    之所以被称为反模式就是因为上面讨论的,对象的初始化不一定是线程安全的。在单例对象还未初始化完成的时候,就被赋值给了全局的单例引用,另一个线程获取单例的时候,由于第一次检查没有加锁,所以就可以得到这个还未完全初始化的对象。

实践

  • 对于哲学家进餐问题,用最开始有死锁隐患的代码做一些实验。尝试修改哲学家思考状态的时长、进餐状态的时长以及进餐的人数。这些变量对于出现死锁的时机有什么影响?设想我们正在进行调试,那应该如何增大出现死锁的几率?
    运行了三次才出现死锁(半小时、一小时、五小时)。将人数调整为三人后,运行了两次出现死锁(一小时、两个半小时),调整为一人运行了一个小时即出现了死锁。将时间调成50毫秒,很快就出现了死锁。由此可见,人数越少,时间越短越容易死锁。其实想想也是,死锁本质可以看成一个概率问题,人数越少意味着死锁的环越小,也就是死锁的概率大,时间越短则意味着频率增大,这样概率大,频率大,复现的时间当然短。所以,当我们在调试时,也可以从增加缩小死锁的环,以及增加运行频率这两方面入手。
  • (困难)编写一段程序,在不使用同步的前提下,模拟内存写操作的乱序执行。这个任务之所以有难度,是因为Java内存模型可能不会优化过于简单的例子,故找到这个优化场景比较困难。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容