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

Java中的并发:同步的静态方法

帅博简
2023-03-14
问题内容

我想了解如何在Java中对静态方法进行锁定。

假设我有以下课程:

class Foo {
    private static int bar = 0;
    public static synchronized void inc() { bar++; }
    public synchronized int get() { return bar; }

据我了解,当我调用时f.get(),线程获得了对象上的锁,f而当我这样做时Foo.inc(),线程获得了类上的锁Foo

我的问题是,这两个呼叫如何彼此同步?调用静态方法是否还获得了所有实例的锁定,或者相反(似乎更合理)?

编辑:

我的问题不是确切如何static synchronized工作,而是静态和非静态方法如何彼此同步。即,我不希望两个线程同时调用f.get()Foo.inc(),但是这些方法获取不同的锁。我的问题是如何防止这种情况发生,以及在上面的代码中如何防止这种情况发生。


问题答案:

静态synchronized方法和实例方法彼此不相关,因此您需要在它们之间应用一些附加的同步,如下所示:

class Foo {
    private static int bar = 0;
    public static synchronized void inc() { bar++; }
    public synchronized int get() { 
        synchronized (Foo.class) { // Synchronizes with static synchronized methods
            return bar; 
        }
    }
}

(尽管在这种情况下,synchronized继续get()操作没有任何意义,因为它不会执行任何需要在实例上进行同步的操作)。

当心死锁-由于此代码获取多个锁,因此应以一致的顺序执行死锁,即其他同步的静态方法不应尝试获取实例锁。

还请注意,可以使用原子字段完全不同步地解决此特定任务:

class Foo {
    private static AtomicInteger bar = new AtomicInteger(0);
    public static void inc() { bar.getAndIncrement(); }
    public int get() { return bar.get(); }
}


 类似资料:
  • 本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 主要内容:1 什么是Java静态同步方法,2 没有静态同步方法的问题,3 静态同步方法的例子1,4 静态同步方法的例子21 什么是Java静态同步方法 如果将任何静态方法设置为synchronized(同步),则锁定的是类而不是对象。 2 没有静态同步方法的问题 假设有两个共享类(例如:Table类)的对象,分别名为object1和object2。在使用同步方法和同步代码块的情况下,t1和t2或t3和t4之间不会存在干扰,因为t1和t2都引用了一个具有单个锁,但是t1和t3或t2和t4之间可能存

  • 问题内容: 这是我在此链接上找到的一段文字。 “避免锁定静态方法 最糟糕的解决方案是将“ synchronized”关键字放在静态方法上,这意味着它将锁定此类的所有实例。” 为什么同步静态方法会锁定该类的所有实例?它不应该锁定课程吗? 问题答案: 这是我的测试代码,表明您是正确的,并且本文有点过分谨慎: 印刷品: 因此与实例的方法无关… 当然,如果整个系统都使用这些方法,那么您可以期望它们对多线程

  • 当两个线程同时使用不同的实例调用静态同步方法时会发生什么?可能吗?对象锁用于非静态同步方法,但静态同步方法使用什么类型的锁?

  • 我正在编写的代码需要在几个静态方法之间进行一些同步。我的目标是阻止执行这些方法中的任何一个,如果其中一个执行。例如: 现在让我们假设下面的代码是从代码中的某个地方执行的: 我的问题是: > 它实际上是同步的吗?methodA和methodB不会同时运行吗? 如果是,methodA调用methodB会不会造成死锁?