gpt4 book ai didi

java - 避免 Java 代码中的同步块(synchronized block)

转载 作者:行者123 更新时间:2023-11-30 01:56:46 25 4
gpt4 key购买 nike

我正在开发一个简单的组件,其中我的类保存对支持添加操作和提交函数的对象的引用。
一旦调用了提交函数,引用的对象就需要用新的对象替换。我的 API 支持添加操作,一旦项目达到一定大小,就会提交该项目,但在某些情况下,我需要验证项目是否已提交,无论其大小在一段时间后如何。我能想到的唯一解决方案是同步整个类(class),这是我想避免的。有没有其他解决方案/可能的重构以避免同步所有内容的想法?

pulic class MyClass{
private MyObject ref;
private int maxObjectsToSubmit;

public MyClass(int maxItems){
this.maxObjectsToSubmit = maxItems;
}

public void add(Item obj){
ref.add(obj);
if(ref.size() == maxObjectsToSubmit){
submit();
}else if(obj.isVeryImportant()){
SomeAPI.runThreadInExactDelayToCreateRaceCondition(new Runnable{
public void run(){
//Submit only if o is still waiting to be submittet.
// if ref does not contains obj than it has already been submitted
if(ref.contains(obj)){
submit()
}
})
}
}

private void submit(){
SomeAPI.doSomething(ref);
this.ref = new MyObject();
}
}

竞争条件是:

  1. T1 添加一些项目,直到一个非常重要的项目到达,这会启动 T2
  2. T1 达到 maxObjectsToSubmit 且 ref.size() == maxObjectsToSubmit 返回 true
  3. T2 启动,ref.contains(obj) 返回 true

这可能会导致提交空对象/同一对象提交两次/等等”

最佳答案

我的建议是创建一个新的Myobject实例并在其中插入obj项,然后调用submit,因为它是高优先级的,它不应该等待Myobject达到最大限制。

public void add(Item obj) {
if (obj.isVeryImportant()) {
SomeAPI.runThreadInExactDelayToCreateRaceCondition(new Runnable {
public void run () {
//Submit only if o is still waiting to be submittet.
// if ref does not contains obj than it has already been submitted
MyObject local = new MyObject();
local.add(obj);
local.submit();
}
});
} else {
ref.add(obj);
if (ref.size() == maxObjectsToSubmit) {
submit();
} else if (obj.isVeryImportant()) {

}
}
}

关于java - 避免 Java 代码中的同步块(synchronized block),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54197133/

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