SberTech♥开源,并发性和可靠的银行业务-分析Joker 2018问题的解决方案

这个周末是Joker 2018 ,这很有趣! 但是会议不仅有演讲。 所有赞助商公司都试图在“竞争对手”的背景下脱颖而出,我们也不例外。

Sberbank Technologies的展台上有很多有趣的事情,但是我想谈一谈我们的杰出表现。 我们 SberTech的Apache Ignite开发团队准备了任务,并吸引了敢于解决这些问题的人们。

在剪切下,您将在注释中找到任务,解决方案分析以及证明自己版本的解决方案的能力。



祸commit者


Petya和Kolya每天在Apache Ignite中提交一项功能。

Masha快速测试每个功能并回滚包含错误的提交。
Petit的第三个初始提交和Kolya的第三个提交都包含一个错误。
Petya花了额外的2天时间来修正错误,Kolya 3,然后他们再次这样做
提交。

如果Masha喜欢Petya,那么在86个工作日内将传达多少功能,
她只有在他被误认为的那一天才注意到他的错吗?

解决方案
从第13天开始,形成了一个循环,该循环使Petya仅能修复第二个错误。

答案
64 + 54 = 118;

维拉里博和维拉巴乔


在对一组帐户进行操作期间处理不可靠的银行会阻止密钥
在操作中按照其声明顺序进行结算,即 从左到右。
银行的专家会手动解决每个僵局,而僵局的处理时间会增加十倍。
时间比正常运转。
处理可靠的银行总是会阻止密钥升序,但要花费2
比不可靠银行的正常交易高出三倍。
两家银行都有10个帐户,帐户密钥是1到10之间的数字。
每个银行的处理需要12次操作。
并行执行操作,一次执行两次。 每次操作最多影响3
帐户:
-工序1(帐户:A,B,C),其中A = i,B = A + 1,C =(A + B)%10,
-工序2(帐户:D,E,F),其中D = 11-i,E = D-1,F =(D + E)%10,
我从1到6不等。
仅在完全完成后才开始执行下一对操作
前一个。
根据银行的政策,每个操作中的一个都会锁定密钥,从开始
从操作编号1。
如果该键已在其中一项操作中锁定,但需要执行另一项操作,
然后首先完成第一个操作,然后继续第二个操作。
预计在顺序模式下强制执行一对操作要比并行执行慢2倍。
哪个银行可以完成操作并快几倍?

提示
总计:
-6次迭代,
-12次操作
-在所有操作中,一个键除外,每个键3个。

解决方案
如果所有键都不相同,则可以并行执行。
如果不是,则为否,并且可能发生死锁。

计算方式
一家不可靠的银行在一笔交易上花了1笔“圆通”,在“困难”情况下花了2笔,在僵局的情况下则花了10笔。
一家可靠的银行在交易2“措施”和“困难”情况下花费4。 可靠的死锁不存在。

答案
同时完成。

公共存储库风险


Serezha是一位非常有经验的程序员,极度赌博并且极度贪婪。
一旦他在github上找到了自己喜欢的手提袋的源代码。
Seryozha可以赢得的最低下注是多少?

随附一个简化的手提袋清单:

class Bid { //  int amount; boolean checked; boolean restricted; Bid(int amount) {this.amount = amount;} } ~~~ AtomicReference<Bid> ref = new AtomicReference<>(); volatile boolean winner = false; ~~~ Thread validator = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if ((((bid.amount << 5) ^ 1_000_000) >>> 6) < (2 << 15)) bid.restricted = true; bid.checked = true; } }); Thread payer = new Thread(() -> { //  ! while (true) { Bid bid = ref.get(); if (bid == null) continue; if (bid.checked) { if (!bid.restricted) winner = true; // ! ref.set(null); } } }); ~~~ synchronized boolean makeMeRich(int amount){ //    ? if (winner) return false; //    -    ref.set(new Bid(amount)); while(ref.get() != null) sleep(1); return winner; //   "true" -     } 

提示1
-131072?
-不,摆脱陷阱:)
提示2
Seryozha可以赢得的最低下注是多少?
提示3
 th1{ bid.restricted = true; bid.checked = true; } ... th2{ while (!bid.checked) { sleep(1); } assert bid.restricted; // 99.999% } 

没有直观期望的可见性保证。

您可以如下添加它们:

 volatile boolean checked; 

提示4
Seryozha可以赢得的最低下注是多少?
解决方案

答案
 java.lang.Integer#MIN_VALUE 

但是,“ 0”甚至“ 1”被认为是正确的决定。

优胜者


最好的解决了这个问题
- 叶夫根尼·祖本科Evgeny Zubenko)
- 亚历山大·诺维科夫
- 安德烈·戈利科夫Andrey Golikov)

他们得到了品牌的背包,T恤,当然还有书籍。

Source: https://habr.com/ru/post/zh-CN426639/


All Articles