接前两篇文章:我是一个线程(上) (中) , 回复“我是一个线程”查看
其实这次遇险我应该能够预想到才对, 太大意了。
前几天我处理过一些从http 发来的存款和取款的包裹, 老线程0x6900 特意嘱咐我:
"处理这些包裹的时候要特别小心, 你得一定要先获得一把锁, 在对账户存款或者取款的时候一定要把账户给锁住, 要不然别的线程就会在你等待的时候趁虚而入,搞破坏, 我年轻那会儿很毛糙,就捅了篓子"
为了“恐吓”我, 好心的0x6900还给了我两个表格:
1. 没有加锁的情况
2. 加锁的情况
我看的胆颤心惊, 原来不加锁会带来这么严重的事故。
从此以后看到存款,取款的包裹就倍加小心, 还好,没有出过事故。
今天我收到的一个包裹是转账, 从某著名演员的账号给某著名导演赚钱, 具体是谁我就不透漏了, 数额可真是不小
我按照老线程的吩咐, 肯定要加锁啊, 先对著名演员账号加锁, 在对著名导演账号加锁。
可我万万没想到的是, 还有一个线程,对,就是0x7954, 竟然同时在从这个导演到往这个演员转账。
于是乎,就出现了这么个情况:
刚开始我还不知道什么情况, 一直坐在等待车间傻等, 可是等的时间太长了, 长达几十秒 ! 我可从来没有经历过这样的事件。
这时候我就看到了线程0x7954 , 他悠闲的坐在那里喝咖啡, 我和他聊了起来:
“哥们, 我看你已经喝了8杯咖啡了, 怎么还不去干活?”
“你不喝了9杯茶了吗?” 0x7954 回敬到。
“我在等一个锁, 不知道哪个孙子一直不释放”
“我也在等锁啊,我要是知道哪个孙子不释放锁我非揍死他不可 ” 0x7954 毫不示弱。
我偷偷的看了一眼, 这家伙怀里不就抱着我正在等的 某导演的锁嘛?
很明显, 0x7954 也发现了我正抱着他正在等待的锁。
很快我们两个就吵了起来, 互不相让:
"把你的锁先给我, 让我先做完"
"不行, 从来都是做完工作才释放锁, 现在绝对不能给你"
从争吵到打起来, 就那么几秒钟的事儿。
更重要的是, 我们俩不仅仅持有这个著名导演和演员的锁, 还有很多其他的锁, 导致等待的线程越来越多, 围观的人们把屋子都挤满了。
最后事情真的闹大了, 我从来没见过终极大boss "操作系统" 也来了。
大Boss毕竟是见多识广, 他看了一眼, 哼了一声 , 很不屑的说:
"又出现死锁了"
"你们俩要Kill掉一个, 来吧, 过来抽签 "
这一下子把我给吓尿了, 这么严重啊!
我战战兢兢的抽了签,打开一看, 是个"活"字。
唉,小命终于保住了。
可怜的0x7954 被迫交出了所有的资源以后, 很不幸的被kill掉, 消失了。
我拿到了导演的锁, 可以开始干活了。
大Boss操作系统如一阵风似的消失了, 身后只传来他的声音:
记住, 我们这里导演>演员, 无论认识情况都要先获得导演的锁
由于不仅仅是只有导演和演员, 还有很多其他人, Boss留下了一个表格, 里边是个算法, 用来计算资源的大小, 计算出来以后,永远按照从大到小的方式来获得锁:
我回到线程池, 大家都知道了我的历险, 围着我问个不停。
凶神恶煞的线程调度员把大Boss的算法贴到了墙上。
每天早上, 我们都得像无节操的房屋中介, 美容美发店的服务员一样, 站在门口,像被耍猴一样大声背诵:
"多个资源加锁要牢记, 一定要按Boss的算法比大小, 然后从最大的开始加锁"
--------------------------------------------------------
又过了很多天, 我和其他线程们发现了一个奇怪的事情:包裹的处理越来越简单
不管任何包裹,不管是登录, 浏览,存钱..... 处理的步骤都是一样的, 返回一个固定的html页面
有一次我偷偷的看了一眼, 上面写着:
"本系统将于今晚 00:00 至4:00 进行维护升级, 给你带来的不便我们深感抱歉"
我去告诉了老线程0x6904, 他叹了一口气说:
"唉, 我们的生命也到头了, 看来马上就要重启系统, 我们就要消失了, 再见吧兄弟。"
系统重启的那一刻终于到来了。
我看到屋子里的东西一个个的不见了, 等待车间,就绪车间,甚至CPU车间都慢慢的消失了。
我身边的线程兄弟也越来越少, 最后只剩我自己了。
我在空旷的原野上大喊: 还有人吗?
无人应答。
我们这一代线程池完成了使命。
下一代线程池将很快重生。
(完)
-----------------------------------------------------------------------------
“码农翻身” 公共号(coderising) : 由工作15年的前IBM架构师创建,分享编程和职场的经验教训。
回复下面的关键字,查看更多文章
牛人 键盘侠 留学 读书 调试 烂代码 小白 培训
数据结构 代码腐化 无聊 迷茫 刚工作 死锁 简历
HTTP Session XML AJAX TOMCAT 反射 JUnit
开源 职业发展 假如我是老师 学习Java 外包
自学 OO 我是一个线程
长按二维码, 关注"码农翻身"