当前位置: 首页 > 知识库问答 >
问题:

高速线程同步

公羊灿
2023-03-14

我有一个线程问题,我认为我是一个中等的线程背景。

假设我有以下(过度简化的)设计和行为:

Object ObjectA-具有对ObjectB的引用和方法MethodA()。Object ObjectB-具有对ObjectA的引用、元素数组ArrayB和方法MethodB()。

ObjectA负责实例化ObjectB。ObjectA将指向ObjectB的实例化器。

现在,只要满足某些条件,就会在objectb.arrayb中添加一个新元素,并为该元素启动一个新线程,比如ThreadB_x,其中x从1变为objectb.arrayb.length。每个这样的线程调用objectb.methodB()来传入一些数据,后者又调用objectb.objecta.methodA()来进行数据处理。

因此,多个线程调用同一个方法objectB.methodB(),它们很可能同时这样做。MethodB中有很多代码创建和初始化新对象,所以我不认为那里有问题。但是这个方法调用objectb.objecta.methoda(),而我对里面发生的事情一无所知。根据我得到的结果,显然没有错,但我想确定这一点。

目前,我将对objectb.objecta.MethodA()的调用包含在objectb.methodB()内部的锁语句中,所以我认为这将确保MethodA()的调用不会发生冲突,尽管我不能百分之百确定这一点。但是,如果每个ThreadB_x调用objectB.methodB()的次数非常非常快,会发生什么呢?我是否会有一个等待ObjectB.ObjectA.MethodA()完成的调用队列?

多谢了。

共有1个答案

景阳曜
2023-03-14

由于缺乏资料,你的问题很难回答。它取决于在methoda中花费的平均时间、每个线程调用此方法的次数、为进程分配了多少内核、OS调度策略等等。

当线程数向无穷大增长时,您可以很容易地想象两个线程同时请求访问共享资源的概率将趋向于一个。这个概率会随着在共享资源上花费的时间的增加而增加得更快。这种直觉很可能是你提出问题的原因。

多线程的主要思想是将能够有效并发计算的代码并行化,尽可能避免争用。在您的设置中,如果methoda不是纯的,即。如果它可能改变进程的状态--或者用C++的说法,如果它不能使其成为const,那么它就是一个争论的来源(回想一下,函数只有在其主体中使用纯函数或常数时才是纯的)。

处理共享资源的一种方法是使用互斥体来保护它,正如您在代码中所做的那样。另一种方法是尝试将其使用转换为异步服务,由一个线程处理它,其他线程请求该线程进行计算。实际上,您最终将得到一个显式的请求队列,但执行这些请求的线程将同时自由地处理其他事情。目标始终是最大化计算时间,而不是线程管理时间,线程管理时间在每次重新调度线程时发生。

当然,这样做并不总是可能的。当methoda的结果属于强序计算链时。

 类似资料:
  • 下面的代码创建了一个新的custom um < code > Thread ,并等待线程结束,直到主线程再次激活。 > < li >我不太明白它是如何工作的。为什么< code > myth read . wait();立即接到电话? < li> 为什么不改用< code>Thread.join()? 公共静态void main(String[] args) {

  • 所以我有一个代码: 所以我将线程添加到我的线程列表中,然后启动这些线程。这是MyThread类: 我想做一个程序来创建线程,将它们添加到列表中,调用它们,但是每个线程都应该等到前一个线程结束它的任务。因此输出应该如下所示: 如何使用实现这一点?我尝试了使用的不同方法,但失败了。

  • 互斥锁 条件变量 POSIX信号量

  • 问题内容: 我正在使用Android App,无法将View与硬件同步。让我解释。 1)我从线程1的run方法中基于数组A中存储的随机值(即随机睡眠)对Android的麦克风进行静音和取消静音。 2)我画出反映麦克风静音的蓝色脉冲。这是通过独立的View类完成的。 3)通过从倒数计时器的onTick内调用,我在上面视图中绘制的图形上移动了一条红线。 我以这种方式一个接一个地启动两个线程: 线程1.

  • 主要内容:1 什么是Java 线程同步,2 为什么使用Java线程同步,3 Java同步类型,4 Java线程同步的类型,5 线程互斥,6 Java锁的概念,7 线程并发问题引发数据不一致,8 Java synchronized方法的例子1,9 Java synchronized方法的例子21 什么是Java 线程同步 Java中的同步是控制多个线程对任何共享资源的访问的能力。 Java同步是更好的选择,我们希望只允许一个线程访问共享资源。 2 为什么使用Java线程同步 Java线程同步主要用

  • 我有3节课是这样的: 来源Java语言 任务Java语言 主要的Java语言 当类源的x等于4时,只有一个任务继续递增x,直到x等于8,我们恢复正常。结果如下: 要获得此结果,我需要修复什么?