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

同步静态方法和非静态方法之间的区别

卢阳成
2023-03-14
问题内容

在Java中同步静态方法和非静态方法有什么区别?有人可以举例说明吗?在同步方法和同步代码块方面也有什么区别吗?


问题答案:

我将尝试添加示例以使这一点更加清楚。

如前所述,Java中的同步是Monitor概念的实现。当您将代码块标记为同步时,可以使用一个对象作为参数。当执行线程进入这样的代码块时,它必须首先等待,直到同一对象上的同步块中没有其他执行线程。

Object a = new Object();
Object b = new Object();
...
synchronized(a){
    doStuff();
}
...
synchronized(b){
    doSomeStuff();
}
...
synchronized(a){
    doOtherStuff();
}

在上面的示例中,一个正在运行的线程doOtherStuff()将阻止另一个线程进入代码保护模块doStuff()。但是,线程可以进入该块doSomeStuff()
而不会出现问题,因为同步于Object b,而不是Object a

在实例方法(非静态方法)上使用synced修饰符时,它与使用“
this”作为参数的同步块非常相似。因此,在以下示例中,methodA()methodB()将以相同的方式起作用:

public synchronized void methodA() {
  doStuff();
}
...
public void methodB() {
    synchronized(this) {
        doStuff();
    }
}

请注意,如果methodC()该类中有一个不同步且没有同步块的类,则什么也不会阻止线程进入该方法,并且粗心的编程可能会使该线程访问对象中的非安全代码。

如果您有一个带有synced修饰符的静态方法,则实际上与使用synced块ClassName.class作为参数是一样的(如果您拥有该类的对象ClassName cn = new ClassName();,则可以使用来访问该对象Class c = cn.getClass();

class ClassName {
  public void static synchronized staticMethodA() {
    doStaticStuff();
  }
  public static void staticMethodB() {
    synchronized(ClassName.class) {
      doStaticStuff();
    }
  }
  public void nonStaticMethodC() {
    synchronized(this.getClass()) {
      doStuff();
    }
  }
  public static void unSafeStaticMethodD() {
   doStaticStuff();
  }
}

所以在上面的例子中,staticMethodA()staticMethodB()采取同样的方式。当执行线程nonStaticMethodC()正在同一对象上同步时,执行线程也将被阻止访问该代码块。

但是,重要的是要知道,没有什么会阻止正在执行的线程进行访问unSafeStaticMethodD()。即使我们说一个静态方法“在Class对象上同步”,也不意味着它同步了对该类中方法的所有访问。它只是意味着它使用Class对象进行同步。仍然可以进行非安全访问。



 类似资料:
  • 我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?

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

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

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

  • 问题内容: 请参见下面的代码段: 代码1 代码2 这些代码段之间有什么区别?两者都15作为答案输出。 问题答案: 静态方法属于类本身,而非静态(aka实例)方法属于从该类生成的每个对象。如果你的方法执行的操作不依赖于其类的单个特征,请将其设置为静态(这将使程序的占用空间减小)。否则,它应该是非静态的。 例: 你可以像这样调用静态方法:。如果你使用method2尝试该操作,它将失败。但这将起作用:;

  • 本文向大家介绍浅析C#中静态方法和非静态方法的区别,包括了浅析C#中静态方法和非静态方法的区别的使用技巧和注意事项,需要的朋友参考一下 静态方法和非静态方法的区别:   1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用;   2.静态方法只能访问静态成员和方法,非静态方法都可以访问;   3.静态方法不能标记为override,导致派生类不能重写,但是可以访问;   4.静