旺财和小强的三生三世

旅游erp测评:蝶步erp vs小强erp 目前国内erp市场百花齐放,不论是国外品牌还是国产品牌都在各自的用户受众里做的风生水起。 但旅游行业因其特殊性,一直未能有“独角兽”企业出现,也导致旅游行业在挑选旅游erp的过程中,时常感觉无从下手。 今天小编将市面上人气最旺的两款旅游erp产品:蝶步erp(公测中)、小强erp进行对比测评。来为大家的erp挑选提供一些思路。 一、市场定位 就市场定位来讲,蝶步erp和小强erp是一致的,都是专注... 阅读详情

第一世

旺财和小强是线程池的两个线程, 他们经常做的工作就是对一个数加加减减,用人类的话来说就是存款,取款。

public class Account{
   private int balance;
   public synchronized void deposit(int amt){
       balance += amt;
   }

   public synchronized void withdraw(int amt){
       if(balance >= amt){
           balance -= amt;
       }
       throw new RuntimeException("insufficent blance");
   }
}

(友情提示,可左右滑动,下同)

每次进行存款,取款操作的时候,他们两个都需要获得一把锁,这样就能保证同一时刻只有一个人在修改,不会出乱子。

这一天,他们俩又遇到了一个叫做转账的操作:

public void transfer(Account from,Account to, int amt){
   synchronized(from){
       synchronized(to){
           from.withdraw(amt);
           to.deposit(amt);
       }
   }
}

旺财说:“这个程序员不错,考虑得挺周全。转账的时候把两个账户都锁住了,安全!”

小强说:“没错,执行吧。”

旺财这个线程从A向B转账 , 与此同时,小强从B向A转账

令旺财和小强没有想到的是,居然出现了死锁。

640?wx_fmt=png

类似的事件发生不少, 线程池的线程用光了,Tomcat被迫重启,这个世界毁灭了。

第二世

新生代的旺财和小强从线程池中出来, Tomcat老大给他们讲了上一代旺财和小强的故事, 对他们谆谆教导:“做转账操作的时候一定要小心,别死锁了!”

旺财和小强有点儿愤愤不平:“这我们俩也控制不了啊,这要看程序员写的代码,以及操作系统中的线程调度啊!”

不满归不满,他俩还是有点小期待,想看看可怕的转账代码到底怎么样。

没过多久, 他俩就如愿了:

public static final Object lock = new Object();
public void transfer(Account from,Account to, int amt){
   int fromHash = System.identityHashCode(from);
   int toHash = System.identityHashCode(to);
   if(fromHash > toHash){
       synchronized(from){
           synchronized(to){
               from.withdraw(amt);
               to.deposit(amt);
           }
       }
   }
   else if(toHash > fromHash){
       synchronized(to){
           synchronized(from){
               from.withdraw(amt);
               to.deposit(amt);
           }
       }
   }
   else {
       synchronized(lock){
           synchronized(from){
               synchronized(to){
                   from.withdraw(amt);
                   to.deposit(amt);
               }
           }
       }
   }
}

看到这样的代码, 旺财倒吸了一口气,挠着头说:“搞什么鬼,转个账都这么麻烦!”

小强说:“老大不是说了吗,上一代线程老是在转账这里出错,于是代码就重写了。你看,这一次写得就很严谨了,每一次都会去比较两个账户的大小(通过hash code),谁大就先获得谁的锁。 ”

旺财说:“奥,相当于把账户给排了序,假设账户A大于账户B , 那我们俩转账的时候,每次都先获得A的锁,这样就不会互相等待了。 ”

640?wx_fmt=png

“没错,还有一个特殊情况,如果这两个账户的hash code 相同,那就再去竞争另外一个特殊的锁,谁抢到谁就可以先执行。另一个就在那里等待。”

旺财和小强这次顺利地把转账给执行完了,回去给Tomcat汇报了一遍。

Tomcat老大感慨地说:“有这么复杂的代码,可见使用‘共享内存’的方式来并发编程很不容易啊!”

“共享内存?”

“对啊,你看这些账户的数据,每个线程都可以访问,不就是共享内存吗, 为了能够安全访问,只有来‘加锁’了。 古人说,这个世界上有两种构建软件的方式,一种方法是使其足够简单以至于不存在明显的缺陷,另外一种是使其足够复杂以至于看不出有什么问题。 我很担心啊, 现在这个系统就属于第二种,不知道有多少坑在等着我们呢!”  

(码农翻身: 实际上这句话是托尼·霍尔说的)

老大不幸言中,终于有一天,这个复杂到看不出问题的系统崩溃了,这个世界又毁灭了。

第三世

第三代的旺财和小强从线程池出来。

出发前,Tomcat老大把前两代线程遇到的问题给他们说了一遍,威胁说:如果再出现死锁,小心你们两个的脑袋!

旺财和小强战战兢兢,如履薄冰地执行代码。

最终他们还是遇到了传说中的可怕的转账代码:

def transfer(from: Account, to: Account,amt:Int){
   atomic{
       from.withdraw(amt);
       to.deposit(amt);
   }
}

旺财非常吃惊:“这是什么代码?不是Java?”

小强说:“嗯,不是Java ,是Scala写的,这是运行在JVM上的一个语言。”

(码农翻身注:实际上JVM线程能看到的只是Java 字节码,根本看不到源码,也就不知道是Java写的代码,还是Scala写的代码, 这里只是为了展示方便。)

旺财说:“怎么这么简单,会不会出问题?那个atomic是怎么回事?表示原子执行?”

小强也有点懵,不敢贸然去执行:“咱们还是去问Tomcat老大吧。”

Tomcat看了一眼:“人类程序员又改代码了啊,开始使用Software Transaction Memory(STM)了。 去把STM老头儿叫来,让他给你俩解释。”

STM老头儿满脸沧桑:“放心执行吧,只要你把代码放到atomic中,我就能保证他们像事务一样,实现ACID,哦不,D(持久化)实现不了,这些数据都是在内存中的。”

“这有什么用? ”

“可以让你们俩安全地并发执行啊?”

旺财和小强面面相觑,这连锁都没有,还安全地并发?

“别看没有锁,” STM老头儿说,“在atomic代码开始执行的时候,我会记录下代码块涉及到的数据的值(复制了一份),然后才真正执行,执行完了要‘提交’, 这时候我会看看那些数据的值是否也被别的线程改动了,如果有改动,那本次改动就撤销,重新从代码开始处执行。 ”

老头儿画了一个图,展示旺财从账户A给账户B转20元, 与此同时小强从B向A转30元。

640?wx_fmt=png

还真是,没有加锁就安全地完成了两个并发操作。

当然,老头儿为了实现这个atomic操作,背后偷偷做了不少事情:复制数据,提交,重复执行。

旺财想起来自己曾经执行过一下Java 的Compare and swap的代码,说道:“你这不就是CAS嘛!”

老头儿说:“原理上类似,都是乐观锁,不过我这个方式和数据库的事务更加类似,所以叫做Software Transaction Memory。”

小强想了想,说道:“不对啊,atomic是个代码块,里边可能有很多代码,涉及到很多class, 你怎么知道哪些字段需要被STM管理起来啊!”

STM老头儿说:“这真是个好问题,实际上,需要程序员们来告诉我。比如使用这个方法”

class Account(val initialBalance : Int){
 val balance = Ref(initialBalance)
 ......
}

“看到那个Ref没有,这就是一种办法,通过它,我就知道这个balance的字段需要让我管理起来,在atomic代码块运行的时候,就需要复制它的值,比较它的值。”

“明白了,但是‘重复执行’有问题啊,假设程序员张大胖是这么写代码的:”

def transfer(from: Account, to: Account,amt:Int){
    atomic{
        from.withdraw(amt);
        ...在这里执行一些其他操作,例如打印日志,发送邮件.....
        to.deposit(amt);
    }
}

“这其中有一些打印日志,发送邮件的操作,那你重复执行,岂不会执行很多次,就完全乱套了。”

STM老头儿说:“不错,想得挺深,你说的这些操作,我把他们叫做副作用,不能重复执行,不能放到atomic代码块中让STM管理。换句话说atomic中的代码应该是幂等的。如果违背了这一点,后果自负!”

小强心中一凛:“这是程序员要操心的事情了,不管我俩的事情, 不过即使如此,他们的代码也极度地简化了,只需要用个atomic,就能实现安全地并发,实在是太爽了。”

旺财说道:“你说得天花乱坠,这STM有什么缺点?”

老头儿说:“天下没有免费的午餐,很容易想到STM的局限性, 如果对于同一个数据,并发写入很多的时候,冲突就大大增加了,不断地重复执行,效率很低。所以更适合写入少,读取多的场景。”

“好吧,我们这就执行这个转账操作,有问题就找你!”

后记: 本文的例子来源于两本书:《Java 并发编程实践》和《Java虚拟机并发编程》, 感兴趣的同学可以看一看。

往期精彩回顾

关于老刘和码农翻身

我是一个线程

我是一个Java Class

面向对象圣经

TCP/IP之大明邮差

CPU阿甘

我是一个网卡

我是一个路由器

一个故事讲完HTTPs

编程语言的巅峰

Java:一个帝国的诞生

JavaScript:一个屌丝的逆袭

数字设计实验:RISC-V指令单周期CPU 本文旨在介绍RISC-V指令单周期CPU的设计思路和仿真实现(含代码) 阅读详情

相关推荐

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 485

数据库村的旺财和小强

丢失的数据旺财是数据库村的一个程序, 小强也是。数据库村有个特点, 很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据, 争夺的不可开交。这一天,...

码农翻身 382

深度强化学习系列(13): 策略梯度(Policy Gradient)

对于DQN来说使用一个网络直接逼近了值函数,最后取得了非常不错的效果, 但是对于一些连续性控制或者动作空间特别大的环境来说,很难全部计算所有的值函数来得到最好的策略,那么直接计算策略的方法就别提出来了。 回顾一下前面几篇,所谓的策略,其实就是状态到动作的映射数学表达为 π:s→aπ:s→a\pi : s \to a, 我们用ττ\tau 表示状态s到最后一个状态的一个序列,表示为: τ:st...

深度强化学习(DeepRL)探索博客 4642

唐伯虎点秋香剧本精选------小强和旺财的诞生!

(华府西门前,唐伯虎和船夫推着木车)唐伯虎:哎~~~戏要上演了,等一下打死你都不能动哦。船夫:你说卖的所有钱都给我,不许赖皮哦。唐伯虎:以你的智慧,唬得了你吗?船夫:那倒也是。(船夫躺在车上装死)唐伯虎:街坊邻居们,快来啊,刚出炉的孝子大怕卖,不卖也来看一看啊!(秋香和华府婢女石榴姐出门)石榴姐:这位小哥,一大清早就来这里卖身葬父,太不吉利了吧?唐伯虎:我也不想

土哥的BLOG 5511

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280

数据库村的旺财和小强 MVCC

这是一篇超级干的干货,尤其是MVCC部分,很烧脑,挑战一下吧。1丢失的数据旺财是数据库村的一个程序, 小强也是。数据库村有个特点, 很多数据支持共享操作,多个程序可以同时读写,他们俩经常会为了读写同一个数据, 争夺的不可开交。这一天,当旺财和小强对同一个银行账户A进行写操作时候, 出现了这么一个错误:看看, 本来旺财要加上的20元就丢掉了。  同样的事情发生的多了, 他俩给这种情况起了一个名字,叫...

卖克的专栏 2691

ARFoundation系列讲解-教程目录

一、教程目录 ARFoundation快速入门-01简介 ARFoundation快速入门-02环境搭建 ARFoundation快速入门-03环境配置之iOS ARFoundation快速入门-04环境配置之Android ARFoundation快速入门-05ARKit设备支持列表 ARFoundation快速入门-06ARCore设备支持列表 ARFoundation快速入门-07检查设备支持 ARFoundation快速入门-08平面检..........

a451319296的博客 3万+

输出小强还是旺财??

输出小强还是旺财?? public class Dog { private String name; public Dog() { } public Dog(String name) { this.name = name; } public String getName() { ret...

weixin_30483495的博客 140

《低功耗方法学》翻译——卷首语

低功耗设计方法学。

记录所学,分享知识,结识挚友 992

Android系统去掉长按webview界面弹框中的分享功能

Android 系统去解决长按显示内容,去掉分享功能,不论那个界面,是所有界面都需要满足。如果仅仅去掉系统自带的,那么系统来处理如果客户自定义,部分App自定义的菜单项,不是调用系统的,那么还是需要应用去解决的。之前做过Editext,其实还需要去TextView,最难点的就是WebView中的HTML了 去分享功能了。WebView中涉及到分享功能菜单的界面,/***//***//***//***//***//***//***//***//**

十年饮冰,难凉热血 1019

一个故事讲完进程、线程和协程

很久以前,有两个程序,暂且称他们旺财和小强吧。 旺财和小强这两个程序都很长,每个都有十几万行。 他们两个的人生价值就是到CPU上去运行,把运行结果告诉人类。 CPU是稀缺资源,只有一个,他们俩必须排着队,轮流使用。 旺财从头到尾执行完了,让出CPU, 让小强从头儿去执行。 人类把这种处理方式叫做批处理。 进程 长久以来,...

Pipcie的博客 308

Camera HAL 多线程管理详解

本文摘要:Camera HAL 采用双线程管理体系(CAMX与CHI-CDK)实现高效并发处理。CAMX ThreadManager负责HAL内部及框架交互,采用线程池+任务调度机制,将节点处理、回调等封装为Job异步执行;CHI ThreadManager专注于OEM定制逻辑,支持异步/同步两种作业模式。两套系统通过函数指针解耦但共享地址空间,共同实现硬件流水线的强实时性。文章详细解析了两者的类层次架构、核心数据结构及典型应用场景,并提供了问题排查的代码切入点,为Camera HAL开发与性能优化提供指导

DU_YULIN的博客 56

JAVA小强从小就喜欢生命科学,小强

小白科普:悲观锁和乐观锁2021-03-11 22:30:17旺财和小强生活在一个网上商城的系统中, 是一对儿线程好基友。星期一刚上班,旺财接到领导电话说,要把一个商品的库存减少20, 旺财不敢怠慢,赶快把库存取出来一看,哦,现在有1000个。与此同时,小强也接到电话说要把同一商品的库存减少30, 他一看,哦,现在有1000个。旺财计算出最新的库存读书笔记-小强升职记2021-02-18 22:3...

weixin_42638178的博客 573

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

小强和小明的故事-摘自豆瓣

1.小强每天在村里晃悠,爹妈看着发愁,心想这孩子将来怎么办呀;小明每日都苦读诗书,父母喜在心里,村里人都认定他必有出息。2.那年,小强和小明都是十九岁,小强跟着村里的外出打工,来到了高速公路的工地,保底工资三千块;小明考上了一所重点大学,读的是道路与桥梁专业,学费每年五千多。 3.那年,小强和小明都是二十三岁小强的爹妈给他说个巧媳妇,是邻村的,特别贤惠;小明在大学里谈了个女...

angtacha5412的博客 479

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

小白科普:悲观锁和乐观锁

小白科普:悲观锁和乐观锁1、无锁2、悲观锁3、乐观锁4、成功案例 转自:码农翻身(微信号:coderising) 1、无锁 旺财和小强生活在一个网上商城的系统中, 是一对儿线程好基友。 星期一刚上班,旺财接到领导电话说,要把一个商品的库存减少20, 旺财不敢怠慢,赶快把库存取出来一看,哦,现在有1000个。 与此同时,小强也接到电话说要把同一商品的库存减少30, 他一看,哦,现在有1000个。 旺...

书写人生 213

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

在小强中使用语音识别和语音合成

https://community.bwbot.org/topic/492 为小强添加语音识别和语音合成功能,安装之后小强就能说会道了。当然首先要给小强添加话筒和喇叭。 处理后端可以设置为科大迅飞语音或百度语音。也可以利用audio_capture实时的处理从话筒中收到的数据。 安装 cd [到你的工作空间的src文件夹中] git clone https://github.com/bl...

chengde6896383的专栏 811

如何恢复小强中被修改的软件包

原链接 https://community.bwbot.org/topic/686 开发测试平台:小强机器人 在使用小强的过程中可能会对小强中的相关软件进行修改。很容易出现修改后小强不能正常工作的情况。下面介绍如何恢复小强的相关软件。 小强的相关软件都是通过git进行代码管理的。任何对代码的更改都是有迹可循的,也是可以恢复的。下面以startup软件包为例进行说明。 假设我们修改了小强的start...

bluewhalerobot的博客 1476

小强就是小强,强^

张永乐(张永乐) 17:38:02明天我就不来了 我的部分应该有不少问题你就帮忙改吧 改不过来的 就用公司的电话给我打 说不明白我就自己过来刘朝春(刘朝春) 17:38:41明就不来啦?刘朝春(刘朝春) 17:38:46 刘朝春(刘朝春) 17:39:00知道了张永乐(张永乐) 17:39:10我把这的人都惹了还来做什么啊刘朝春(刘朝春) 17:39:33 没惹谁啊刘朝春(刘朝春) 17:40:

csdn猪 1129

《小明与小强》伟大而真实的中国人的故事

《小强与小明》 ——正在疯传的伟大的故事 1.小强与小明是同一个村子的,小强每天在村里晃悠,爹妈看着发愁,心想这孩子将来怎么办呀;小明每日都苦读诗书,父母喜在心里,村里人都认定他必有出息。 2.那年,小强和小明都是十九岁。小强跟着村里的外出打工,来到了高速公路的工地,保底工

ぁ風雲變色ぁ 1391

小强机器人用户手册和教程目录

原链接 小强pro淘宝购买链接 小强mini淘宝购买连接 小强ROS机器人用户手册(综合版).pdf 本手册包含了小强的安装及使用的必备信息,可以通过阅读本手册来学习小强的使用方法。...

bluewhalerobot的博客 3295

小强和小明

小强和小明  1.小强每天在村里晃悠,爹妈看着发愁,心想这孩子将来怎么办呀;小明每日都苦读诗书,父母喜在心里,村里人都认定他必有出息。   2.那年,小强和小明都是十九岁,小强跟着村里的外出打工,来到了高速公路的工地,保底工资三千块;小明考上了一所重点大学,读的是道路与桥梁专业,学费每年五千多。    3.那年,小强和小明都是二十三岁小强的爹妈给他说个巧媳妇,是邻村的,特别贤惠;小明在大学里...

风中找感觉 681

一道有趣的智力题 -- 小强试毒实验

Last Modified : 2007-07-24-14:00同学在 BBS 看到的题,挺有趣的,还好我没花多少时间就想出来了。有1000瓶水,其中有一瓶有剧毒(假设哪怕一个毒药分子在里面也能致命),现在给你10只小强在24小时内通过小强试药的方式鉴定出来哪瓶药有毒。情况1:假设小强服药后2小时内即可判断是否中毒,鉴别方案有哪些?情况2:假设小强服药之后最迟要20小时才能判断是否中毒,鉴别方案又

Rappy的专栏-火魂の闇狱 3026
上一篇: 没有文档,没有老员工讲解,悲催的新人如何快速熟悉一个新项目?
下一篇: 看看你处于哪一层?
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值