![]() |
1
4
最干净的方法是为客户提供除
让存档对象管理锁,并为客户机提供一个简单的API来获取数据 . 即使这意味着更改一些API。 不同线程锁定和释放同一对象的问题是一个明显的迹象,表明您在当前的设计中遇到了一些轻微的错误。在前面提到的重构中工作,它将为您做更多的工作。 |
![]() |
2
2
根据你对我问题的回答。您可以简单地推迟
例如:
然后在你的主要课程中开始一切:
然后在主线上…
这个内部类可以根据需要有额外的信息来为工作者创建正确的流。现在
编辑
:在重读您的问题时,我看到您可能不想更改已经接受
|
![]() |
3
1
我建议您使用惰性锁,即不要积极地获取构造函数中的锁。为了这个
例子:
使用这个锁,线程将首先调用上述八个方法中的任何一个,并负责关闭。 为了确保您不会在死锁的情况下结束,您需要注意的是确保客户端在结束时调用Close方法以释放锁。此外,在通过具有布尔指示器来知道流是否已关闭(过时)来调用Close方法之后,不应调用任何方法。 |
![]() |
4
0
解决方案2:
如果在线程结束前不需要一直保持锁定状态,则可以实现自定义
.
|
![]() |
5
0
另一个解决方案是,我在仔细考虑这个问题时偶然发现的:查看问题的一种方法是,它是由锁的重入引起的。
解决这个问题的一种方法是使用计数锁,但将所有锁都向外强制。首先,计数锁:状态是整数-1,0,1,…,其中-1表示写入,0表示未锁定,正n表示并发读取数。这样,写入仍然是独占的,但锁不是线程特定的。强制所有锁向外:我们有如下方法
这一切都很好,除了它最终变得极其复杂,以确保您不会在实现它时搞砸了调用一个公共锁方法(当您应该调用一个受保护的非锁方法时调用一个公共锁方法),从而导致死锁。其次,将所有锁都强制放在外面意味着您要保持锁的时间更长,因此这(可能)不利于并发性。 所以,这是我尝试过的,但决定不使用。 |
![]() |
John Smith · Java按值对映射进行分组,其中值为列表 2 年前 |
![]() |
r3k0j · 在c++中有没有办法将输入字符串转换为输入流? 3 年前 |
![]() |
Ankur · 猛击猫管据称行为不端 3 年前 |
![]() |
Ksenia Alexeeva · 什么是产量控制器。流动 3 年前 |
![]() |
tooFastForSatan · 组合两个流并调用方法 3 年前 |
![]() |
Logan Lee · 通过在jq中一对一比较两个流进行过滤 3 年前 |
![]() |
Lev · 使用jOO按属性总结BigDecimal分组 7 年前 |