我有以下代码段。
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)
。我得到了预期输出的输出。
答案 0 :(得分:3)
synchronized(this)
在这种情况下不起作用,因为this
将引用Thread
对象,并且每个run
函数都在自己的线程中运行。
如果您使用synchronized(sb1)
,您的代码应按预期工作。您可以在所需的每个对象上进行同步,java将锁定语句上的对象并在括号后释放它。你应该只关心,你真的在同一个对象上同步。