gpt4 book ai didi

java - 匿名线程类的输出不同步

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

我有以下代码片段。

public class Test {
static final StringBuffer sb1 = new StringBuffer();
static final StringBuffer sb2 = new StringBuffer();
public static void main(String args[])
{
new Thread()
{
public void run() {
synchronized(this)
{
try {
sb1.append("A");
sb2.append("B");
System.out.println (sb1 + " " + sb2);
Thread.currentThread().sleep(5000);
h.sb1.append("U");
h.sb2.append("V");
System.out.println (sb1 + " " + sb2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}.start();
new Thread()
{
public void run()
{
synchronized(this)
{
sb1.append("C");
sb2.append("D");
System.out.println (sb1 + " " + sb2);
}
}
}.start(); /* Line 28 */

new Thread()
{
public void run()
{
synchronized(this)
{
sb1.append("E");
sb2.append("F");
System.out.println (sb1 + " " + sb2);
}
}
}.start();

}
}

当我运行该程序时,它看起来没有在对象级别同步。我得到的输出是:

A B
AC BD
ACE BDF
ACEU BDFV

我期望预期的输出为

A B
AU BV
AUC BVD
AUCE BVDF

有人可以解释一下这个关键字指的是什么吗?另外,如果我使用 synchronize(this.getThreadGroup()) 而不是 synchronized(this)。我得到了预期的输出。

最佳答案

synchronized(this)

在这种情况下不起作用,因为 this 将引用 Thread 对象,并且每个 run 函数都在自己的线程中运行.

如果您使用synchronized(sb1),您的代码应该按预期工作。你可以同步每个你想要的对象,java会在语句上锁定对象并在括号后释放它。您应该只关心您是否确实在同一个对象上同步。

关于java - 匿名线程类的输出不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22418632/

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