gpt4 book ai didi

Java线程方法与 block 同步

转载 作者:行者123 更新时间:2023-12-01 12:46:25 27 4
gpt4 key购买 nike

1) 如果一个类(例如 TestClass)有两个方法(method1method2)。两个线程(t1t2)并行运行,其中 t1 正在调用对象 object1 的 method1 (属于 TestClass 类型),并且 t2 正在调用同一对象 (object1) 的 method2 .

  1. 如果只有 method1 同步,而 method2 未同步,会发生什么情况?
  2. 如果两个方法都是同步的,那么两个方法会并行运行吗? (它没有运行,但为什么?我们可以通过两个虚拟对象和 block 级同步来实现这一点)
  3. 下面同一个对象的method1method2可以用两个线程并行执行吗?

    void method1() {
    synchronized(object1) {
    ....
    }
    }

    void method2() {
    synchronized(object1) {
    ....
    }
    }
  4. synchronized block 与 .class 的用法是什么 synchronized(TestClass.class) { }

最佳答案

  1. 如果只有method1同步,则method2和method1可以并行执行。

  2. 如果两种方法都标记为同步,则它们无法并行运行。

我认为这里让您感到困惑的是 synchronized 关键字。同步方法将为该类的实例进行同步。就像这样:

synchronized void Method1(){}
synchronized void Method2(){}

只有在定义这些方法的实例未用于在其他地方执行同步代码块时,才能输入这些方法。与此比较:

void Method1(){
//can run in parallel
synchronized(this){
//cannot run in parallel.
}
//can run in parallel.
}
void Method2(){
synchronized(this){
//cannot run in parallel.
}
}

这并不完全相同。两种方法都可以输入,但同步块(synchronized block)中的代码无法并行运行。

最后,如果您在 TestClass.class 上进行同步,它将阻止在同一对象上同步的代码执行。在任何静态对象上同步时都是如此。

关于Java线程方法与 block 同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24656506/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com