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

同步,何时使用或不使用?

秋阳荣
2023-03-14
问题内容

我已经开始学习Java的并发和线程。我知道同步的基础知识(即它的作用)。从概念上讲,我知道它提供了对Java中具有多个线程的共享资源的互斥访问。但是,当面对下面的示例时,让我感到困惑的是同步它是否是一个好主意。我知道代码的关键部分应该同步,并且不应过度使用此关键字,否则会影响性能。

public static synchronized List<AClass> sortA(AClass[] aArray) 
{
    List<AClass> aObj = getList(aArray);

    Collections.sort(aObj, new AComparator());

    return aObj;
}

public static synchronized List<AClass> getList(AClass[] anArray) 
{
    //It converts an array to a list and returns
}

问题答案:

假设每个线程通过 不同的数组, 则不需要同步,因为其余变量是局部的。

相反,如果您触发所有调用sortA并传递对同一数组的引用的几个线程, 那么 如果没有synchronized您将遇到麻烦
,因为它们会互相干扰。

注意,从示例中可以看出,该getList方法List从数组中返回一个新值,这样即使线程传递相同的数组,您也会获得不同的List对象。这是误导。例如,using
Arrays.asList创建了一个List由给定数组支持的数组,但是javadoc明确声明了这一点,Changes to the returned list "write through" to the array.因此请注意这一点。



 类似资料:
  • 问题内容: 我希望这将是足够的信息,所以就在这里。如果您需要更多信息,请在评论中了解。 我有一班有两个内部班。内部类每个都有两个方法来调用外部类中的方法。因此,它看起来像这样: 重要的是要注意: 这是针对Android应用的。的实例,并传递给作为网页视图一个JavaScript接口,所以并可以随时调用,没有特定的顺序。 目前,我在使用现有代码(不使用synced关键字)时遇到了一个问题,该问题在同

  • 问题内容: 我有一个ConcurrentHashMap,在其中执行以下操作: 我的问题是-是否有必要做多余的事情 检查同步块内部,以便其他线程不会初始化相同的哈希图值? 也许检查是必要的,但我做错了吗?我在做什么似乎有点可笑,但我认为这是必要的。 问题答案: *ConcurrentHashMap上的 *所有 操作都是线程安全的,但是线程安全的操作是不可组合的。您试图使原子操作成为一对操作:检查地图

  • 问题内容: 知道 对于声明为volatile的所有变量,读写是原子的 问题1: 这是否可以理解为 操作是原子的吗? 然后 将变量标记为volatile并不能消除所有同步原子操作的需要,因为仍然可能发生内存一致性错误。 问题2: 我想知道在什么情况下(如果有的话)有可能看到一个已标记的变量,而看不到任何标记为已同步的块的方法(试图访问/修改该变量)? 换句话说,是否需要标记所有需要防止并发修改的变量

  • 根据某些参数,我希望在运行时决定GET请求应该同步还是异步处理。在这两种情况下,资源endpoint的URL()必须相同。这可能吗? 当然,正如您在上面的示例中所看到的,可以通过调用以异步方式伪造同步版本。但是,我会避免创建异步响应的开销。

  • 问题内容: 假设我要实现一个非常简单的类,并且要注意并发和多线程问题, 即使是以下方法,还是要这样做吗? 另一方面,如果我们将所有方法都同步了,就不会再使用了,对吗? 问题答案: 将您的金额声明为不会阻止线程在方法执行过程中被抢占(如果未同步)。因此,举例来说,如果您的方法没有以任何方式同步,即使您的方法数量达到 这些问题称为比赛条件。一个可能的示例是,当两个线程尝试从同一帐户转移资金时。当一个线

  • 问题内容: 今天,由于扩展程序出现问题,我不得不重新启动浏览器。重新启动时发现,我的浏览器(Chromium)自动更新为不再允许同步AJAX请求的新版本。引用: 不赞成在主线程上使用同步XMLHttpRequest,因为它会对最终用户的体验产生不利影响。如需更多帮助,请访问http://xhr.spec.whatwg.org/。 我需要node.js应用程序的同步AJAX请求才能工作,因为它们通过