- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
标题听起来前面有很多问题。这是我的具体案例:
这是一个旅游门票销售系统。每条路线的车票数量有限,因此两个人不应购买给定路线的最后一张车票(标准场景)。但是,有“回程票”选项。因此,我使用唯一的路线 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
对象,要么抛出异常,如果没有更多可用的票)
现在,我完全意识到这是一个非常尴尬的解决方案,但是,如果它按预期工作,它会给出:
我也知道这种情况是由悲观或乐观数据库锁处理的,而且由于我使用的是 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/
所以我试图设置“内容”类的高度,但它似乎不起作用。我对嵌套 DIV 非常陌生,我已经尝试了我在谷歌搜索中发现的修复程序,但似乎没有任何效果。帮助?
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
好的,所以我一直在四处寻找,但找不到这个问题的答案。但是,我需要将一个 View 嵌套在另一个 View 中。 我有一个 $layout 正在使用我拥有的 default.layout Blade 文
基本上,我的问题很简单,但它需要知道 Struts 1.1 并且还活着的人。 我尝试构建的伪代码看起来像这样: IF element.method1 = true THEN IF element
我正在尝试将 Excel 嵌套 IF 语句转换为代码语言,但我不确定我是否正确执行此操作,希望能得到一些帮助 这是Excel语句: =IF(D3="Feather",IF(OR(I3>1000,R3=
如果我们创建两个或三个评论并对其进行多次回复,则“有用”链接在单击时会导致问题,它会对具有相同编号的索引执行 ng-click 操作,从而显示具有相同索引的所有文本。如何解决此嵌套问题,以便在单击链接
我在项目中使用Scala,想与Stripe集成,但它只提供Java API。例如,要创建 session ,我使用: val params = new util.HashMap[String, Any
以下代码有一个 Div,其中连续包含四个较小的 Div。四个 Div 中的每一个还包含一个较小的 Div,但此 Div 未显示。我尝试了各种显示和位置组合,看看 div 是否会出现。 classGoa
我在这里有一个问题,循环是: for (i=0; i < n; ++i) for (j = 3; j < n; ++j) { ...
我正在尝试编写代码来显示具有奇数宽度的形状。形状完成后,将其放置在外部形状内。用户将能够输入用于形状的字符和行数。我希望生成一个形状,并通过 for 循环生成一个外部形状。 ***** .
$(".globalTabs").each(function(){ var $globalTabs = $(this); var parent = $globalTabs.parent
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
所以我在这个问题上遇到了一些麻烦,因为变量 i。我只是不确定在第二个 while 循环中如何处理它。对于我的外循环,我知道它将运行 log_4(n^2) 次迭代。对于内部 while 循环,我计算的迭
我似乎找不到在枚举上应用多个 if/then 逻辑的工作方式。 anyOf 不应用条件逻辑,而是表示如果其中任何一个匹配则很好。 allOf 再次不应用条件逻辑,而是测试属性/必填字段的超集。 这是一
如何访问 ReaderT 的内部 monad。 在我的例子中,我有类型: newtype VCSSetupAction a = VCSSetupAction (ReaderT (Maybe VCSCo
这个问题在这里已经有了答案: Add leading zeroes/0's to existing Excel values to certain length (7 个回答) 7年前关闭。 我正在寻
我已经绑定(bind)了很多 AND/OR 函数的组合并且没有运气。 这是我需要创建的: 在 B 列中,我有公司 ID,范围从两个数字字符到六个数字字符。 我需要在 B 列中的每个公司 ID 之前的每
我是 VBA 新手,在尝试编写的宏中使用 If 语句时遇到了一些困难。每个月我都会收到一份 Excel 报告,其中列出了我们公司的哪些员工执行了某些任务。我正在编写的宏旨在将每个员工的数据复制并粘贴到
如果在 B 列中找到单元格 A1 中的值,则使用文本 321 填充除非在 C 列中找到单元格 A1 中的值,在这种情况下填充文本 121反而。如果单元格 A1 的内容不在 B 列或 C 列中,则使用
我有几十万个地址。其中一些在整数之后有粒子。如 4356 A Horse Avenue , 其他格式正常4358 Horse Avenue .有些有“A”,有些有“B”。我正在尝试删除整数和粒子之间的
我是一名优秀的程序员,十分优秀!