gpt4 book ai didi

Java 1.7 : synchronize(this) faster than synchronize void

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:20 36 4
gpt4 key购买 nike

我目前正在为 N 体问题实现多线程版本的 Barnes-Hut 算法。虽然该算法有效,但它不是很优化,我正在尝试减少我的程序的运行时间。

我已经确保有多个线程可以准确地找到我正在使用的空间的边界,并意识到我在其中设置边界的最高级别对象中的代码相当未优化。它看起来像这样:

public synchronized void setBorders(float maxX, float minX, float maxY, float minY, int thread){
if(maxX > this.maxX){
this.maxX = maxX;
}
if(maxY > this.maxY){
this.maxY = maxY;
}
if(this.minX > minX){
this.minX = minX;
}
if(this.minY > minY){
this.minY = minY;
}
}

我有几个线程在计算出各自的值后尝试访问此方法。由于同步对象在给定时间只能由单个线程访问,因此可以显着改善这一点。

我想到的可能解决方案是删除“public synchronized void”并将代码重写为:

public synchronized void setBorders(float maxX, float minX, float maxY, float minY, int thread){
Synchronize(this){
if(maxX > this.maxX){
this.maxX = maxX;
}
}

Synchronize(this){
if(maxY > this.maxY){
this.maxY = maxY;
}
}

Synchronize(this){
if(this.minX > minX){
this.minX = minX;
}
}

Synchronize(this){
if(this.minY > minY){
this.minY = minY;
}
}
}
}

如果我对 Synchronized block 的理解是正确的,即在任何给定时间只有一个线程可以访问 Synchronize(this) block 内的代码,这应该会加快我的代码速度。

这行得通吗,或者有什么理由我应该避免我错过的这种情况?

编辑:哇,我对你们提供帮助的速度和准确性感到惊讶。我真的很感谢这一切!

最佳答案

该代码应该极快地执行,因此我怀疑将其拆分为更多同步块(synchronized block)是否会减少争用。我会选择同步的单一功能级别。

但是,如果代码做的更多,例如

...
if(maxX > this.maxX){
this.maxX = maxX;
doSomeSlowerCalculation();
updateSomeComplexSharedDataStructure();
}
...

然后将其拆分为单独的同步块(synchronized block)可能会有所帮助

关于Java 1.7 : synchronize(this) faster than synchronize void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25728753/

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