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

如果在实例方法中放置静态锁,会发生什么?

朱华皓
2023-03-14

我是线程新手,目前正在学习线程同步章节。关于线程锁定中的一个场景,我有一个问题

以下是我所知道的:

1:当我在实例方法中放置实例锁时(即)

private Object lock1= new Object();
private Object lock2 = new Object();
void f1(){
    synchronized (lock1) {

    }
}
void f2(){
    synchronized (lock2 ) {

    }
}

void f4(){
    synchronized (lock2 ) {

    }
}
void f3(){
    synchronized (lock1) {

    }
}

这里将发生的情况是,如果有一个类X的对象A被多个线程共享,并且一些线程t1正在执行f1的块,那么直到t1退出f1块,所有试图进入函数f3的其他线程,f1都将被阻止。f2和f4的情况也是如此。

现在,在静态锁的情况下,如果一个类有多个静态方法,并且我们希望这些方法单独锁定,而不是类锁定,那么我们将有多个静态锁。这些锁将决定哪些方法将被阻止。

到目前为止,一切都很好。现在,如果把这个静态锁放在一个实例方法中,当同一个html" target="_blank">对象上的两个线程尝试访问该方法时,会发生什么?

共有2个答案

薛修能
2023-03-14

并发情况下,始终使任何字段(lock1,lock2)不稳定或最终。而且,如果同步锁上的代码块,无论静态上下文与否,一次只能通过一个线程。所以这两个线程中的一个将被阻塞,直到另一个完成。

朱风史
2023-03-14

当您在实例方法中的静态锁上同步时,只有一个线程能够进入由该锁控制的关键部分,而不管对象的哪个实例正在使用。

如果将lock1设置为静态,则系统范围内只有一个线程能够运行f1f3,即使创建了数百个类X实例,因为所有静态成员(包括锁定的对象)都在类的所有实例之间共享。

 类似资料:
  • 通过下面的代码,我有A类的两个实例-a1和A2。并分别对这两个实例调用方法foo()。 在foo()方法中有一个synchronized块,它被锁定在调用对象上。由于这是一个实例级的锁定,这两个方法应该同时开始执行,因为它们是从两个独立的实例调用的。但是,他们被顺序执行。 这是因为,两个实例都是从同一个线程主调用的吗? 预期输出(应并行执行) 实际输出(按顺序执行)

  • 假设我们有一个类,其中有一个实例方法和静态方法。我们用类级锁同步了静态方法中的块

  • 我有以下代码: 到目前为止,代码还可以,但我无法在主方法中实例化'in',比如,因为它显示

  • Test类是超级类,Fest是它的子类,因为我们知道静态方法不能被重写,即使我遇到了“静态方法不能在java中隐藏实例方法”这样的错误,有人能解释一下吗,提前谢谢。

  • 问题内容: 我有以下代码: 到目前为止,代码还不错,但是我无法像显示的那样在main方法中实例化 我该怎么做?我不想使我的课堂静止。 问题答案: 你还必须参考其他外部类。 如果内在是静态的,那将是

  • 问题内容: 如果我用Java创建类的实例,为什么最好静态地调用同一类的静态方法,而不是使用this.method()? 当我尝试通过this.staticMethod()从自定义类的构造函数中调用静态方法staticMethod()时,我收到Eclipse的警告。 与 谁能解释为什么这是一件坏事?在我看来,编译器应该已经分配了对象的实例,因此静态分配内存将是不必要的开销。 编辑: 我听到的要点是,