gpt4 book ai didi

java - interned 字符串上的嵌套同步块(synchronized block)

转载 作者:搜寻专家 更新时间:2023-11-01 01:07:17 27 4
gpt4 key购买 nike

标题听起来前面有很多问题。这是我的具体案例:

这是一个旅游门票销售系统。每条路线的车票数量有限,因此两个人不应购买给定路线的最后一张车票(标准场景)。但是,有“回程票”选项。因此,我使用唯一的路线 ID(数据库提供)执行以下操作:

synchronized(bothRoutesUniqueString.intern()) {
synchronized (routeId.intern()) {
if (returnRouteId != null) {
synchronized (returnRouteId.intern()) {
return doPurchase(selectedRoute, selectedReturnRoute);
}
}
return doPurchase(selectedRoute, selectedReturnRoute);
}
}

两个内部 synchronized block 是为了让线程仅在两个人同时购买这条特定路线的车票时才停在那里,如果两条不同路线的车票是同时购买。第二次同步当然是因为有人可能同时试图购买返回路由作为出站路由。

最外面的synchronized block 是为了说明当两个人购买相同组合的票时,相反的情况。例如,一个订购伦敦-曼彻斯特,另一个订购曼彻斯特-伦敦。如果没有外部同步块(synchronized block),这种情况可能会导致死锁。

(doPurchase() 方法要么返回一个 Ticket 对象,要么抛出异常,如果没有更多可用的票)

现在,我完全意识到这是一个非常尴尬的解决方案,但是,如果它按预期工作,它会给出:

  • 10 行来处理整个复杂的场景(加上适当的注释,理解起来并不难)
  • 没有不必要的锁定 - 所有东西只有在必须阻塞时才会阻塞。
  • 数据库不可知论

我也知道这种情况是由悲观或乐观数据库锁处理的,而且由于我使用的是 Hibernate,所以这些都不难实现。

我认为可以通过使用 VM 集群的上述代码实现水平扩展。根据Teracotta documentation ,它允许将单节点多线程应用程序转换为多节点,并且:

Terracotta tracks String.intern() calls and guarantees reference equality for these explicitly interned strings. Since all references to an interned String object point to the canonical value, reference equality checks will work as expected even for distributed applications.

那么,现在回到问题本身:

  • 您是否发现上述代码有任何缺点(除了笨拙之外)?
  • 是否有来自 java.util.concurrent API 的适用类来帮助解决这种情况?
  • 为什么数据库锁定比这更可取?

更新:由于大多数答案都与 OutOfMemoryError 有关,因此我为 intern() 创建了一个基准测试,并且内存没有被耗尽。也许正在清除字符串表,但这对我来说无关紧要,因为我需要对象在竞争条件下相等,并且不应在此时清除最新的字符串:

System.out.println(Runtime.getRuntime().freeMemory());
for (int i = 0; i < 10000000; i ++) {
String.valueOf(i).intern();
}
System.out.println(Runtime.getRuntime().freeMemory());

附言环境是JRE 1.6

最佳答案

why would a database locking be preferable to this?

只有当您只有一个数据库前端时,您的代码内解决方案才会起作用,这意味着您只能垂直扩展(在单个前端盒上具有更多处理能力)。一旦您开始进入网络农场或类似(水平扩展),您的解决方案就不再有效。

关于java - interned 字符串上的嵌套同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1852138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com