当前位置: 首页 > 面试题库 >

多线程-更快的方法?

解高昂
2023-03-14
问题内容

我在某个字段上有一个带有getter getInt()和setter 的类setInt(),例如field

Integer Int;

说一个类的对象SomeClass

setInt()这里synchronized– getInt()不是。

我正在Int从多个线程中更新值。每个线程都在获取值Int,并进行适当设置。线程不会以任何方式共享任何其他资源。

在每个线程中执行的代码如下。

public void update(SomeClass c) {

        while (<condition-1>) // the conditions here and the calculation of 
                                   // k below dont have anything to do 
                                   // with the members of c
            if (<condition-2>) {
                // calculate k here 
                synchronized (c) {                        
                        c.setInt(c.getInt()+k); 
                    //    System.out.println("in "+this.toString());
                }
            }  
}

run()方法只是对通过传递给它的参数从构造函数内部更新的成员调用上述方法:

public void run() { update(c); }

当我按较大的顺序运行此线程时,线程之间的交错并不多-我看到一个线程执行了很长时间,而其他线程之间没有运行。

必须有更好的方法来做到这一点。

我无法更改SomeClass或调用线程的类的内部。

如何更好地做到这一点?

TIA。

// ====================================

编辑:

我不是在操纵线程的执行顺序之后。它们都具有相同的优先级。我在结果中看到的只是暗示这些线程没有平均分配执行时间-
其中一个一旦接管就开始执行。但是,我看不到为什么这段代码应该这样做。


问题答案:

我在结果中看到的只是暗示线程没有平均共享执行时间

好吧,如果您追求效率,这就是您所不想要的。取消执行某个线程并调度另一个线程通常非常昂贵。因此,这样做实际上是有利的one of them, once takes over, executing on。当然,如果这样做过分,您会看到更高的吞吐量,但响应时间更长。理论上。实际上,JVM线程调度已针对几乎所有目的进行了很好的调整,并且您不想在几乎所有情况下都尝试对其进行更改。根据经验,如果您对以毫秒为单位的响应时间感兴趣,则可能要远离混乱。

tl; dr:这并不是效率低下,您可能希望保持原样。

编辑:
话虽如此,使用an
AtomicInteger可能对性能有所帮助,而且我认为比使用lock(synchronized关键字)容易出错。为了获得可衡量的收益,您需要非常努力地达到该变量。



 类似资料:
  • 本文向大家介绍Python实现快速多线程ping的方法,包括了Python实现快速多线程ping的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现快速多线程ping的方法。分享给大家供大家参考。具体如下: 执行结果: administrator@nagios:/win/pexpect$ ./ping.py [2011-04-25 21:30:22.126981] 192

  • 问题内容: 我想检查多线程是否比单线程快,然后在这里进行演示: 首先我用两个sum方法运行singleThreadStart,结果是 然后我运行secondThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行FiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间

  • 我想检查多线程是否比单线程快,然后我在这里做一个演示: 首先,我用二和方法运行singleThreadStart,结果是 然后我运行第二个ThreadStart,结果是 然后我用五和方法运行singleThreadStart,结果是 最后我运行fiveThreadStart,结果是 我的问题是: SecondThreadStart比singleThreadStart花费更多的时间,是因为创建线程的

  • 问题内容: 我有大量的多边形(〜100000),并尝试找到一种聪明的方法来计算与常规网格单元的相交面积。 当前,我正在使用形状(基于它们的角坐标)来创建多边形和网格单元。然后,使用简单的for循环,遍历每个多边形并将其与附近的网格单元进行比较。 只是一个小例子来说明多边形/网格单元。 (顺便说一句:网格单元的尺寸为0.25x0.25,多边形的最大值为1x1) 实际上,对于单个多边形/网格单元组合来

  • 我读过这个主题:C#线程安全快速(est)计数器,并在我的并行代码中实现了这个特性。据我所知,这一切都很好,但它大大增加了处理时间,大约10%。 这让我有点担心,我认为问题在于我做了大量相对便宜的产品( 现在,我看不到解决的办法,但也许我错过了一些明显的东西。我甚至在考虑使用n个计数器(对应于并行化程度),然后在特定的核上增加每个计数器,但这似乎不可行(检测我在哪个核上可能会更昂贵,更不用说复杂的

  • 本文向大家介绍Linux多线程编程快速入门,包括了Linux多线程编程快速入门的使用技巧和注意事项,需要的朋友参考一下 本文主要对Linux下的多线程进行一个入门的介绍,虽然是入门,但是十分详细,希望大家通过本文所述,对Linux多线程编程的概念有一定的了解。具体如下。 1 线程基本知识 进程是资源管理的基本单元,而线程是系统调度的基本单元,线程是操作系统能够进行调度运算的最小单位,它被包含在进程