gpt4 book ai didi

java - 静态和非静态同步,为什么输出结果不同?

转载 作者:行者123 更新时间:2023-11-30 08:40:42 25 4
gpt4 key购买 nike

为什么输出有差异?我有 2 个案例:

  1. 在第一种情况下,我使用静态函数 f1f2:
    public static synchronized void f1() {
    for (int i = 0; i < 100; i++)
    System.out.print("A");
    }

    public static synchronized void f2() {
    for (int i = 0; i < 100; i++)
    System.out.print("B");
    }
    这是我的主要方法体:
    Thread t1 = new Thread(
    new Runnable(){public void run(){f1();}}
    );

    Thread t2 = new Thread(
    new Runnable(){public void run(){f2();}}
    );
    t1.start();
    t2.start();
    输出是:
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  2. 在第二种情况下 f1f2 不是静态的:
    public synchronized void f1() {
    for (int i = 0; i < 100; i++)
    System.out.print("A");
    }

    public synchronized void f2() {
    for (int i = 0; i < 100; i++)
    System.out.print("B");
    }
    输出是如此困惑:
    AAABABABBBBAAAAAAAAAABBAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBAA

最佳答案

静态同步函数在类上同步,而非静态同步函数在实例上同步。

这意味着当函数是静态的时它们会相互阻塞,而当它们不是(并使用不同的实例)时它们不会。

如果您的类(class)名为 MyClass,则:

public static synchronized foo() {...}

类似于:

public static foo() {
synchronized (MyClass.class) {
// ...
}
}

同时:

public synchronized foo() {...}

类似于:

public foo() {
synchronized (this) {
// ...
}
}

通常,您希望指定要同步的对象(您希望独占哪些资源?)并避免在类/实例上使用隐式同步,正是因为这个原因。

关于java - 静态和非静态同步,为什么输出结果不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35528026/

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