同步块显示奇怪的结果
synchronized block showing weird results
我正在尝试 运行 java 中的一个简单的多线程程序,该程序在非静态 method.I 中使用 synchronized
块有一个 class TestThread
有一个字段 string
这是一个 StringBuffer
变量。我创建了两个线程 one
和 two
并且它们的每个 string
变量都初始化为 StringBuffer
b
其中包含值 A
。进入 运行ning 状态的第一个线程必须显示值 A
一百次,然后将其递增一个,以便下一个线程 运行ning 将显示递增的值 B
一百次 too.I 在 synchronized
中使用了由 this
表示的当前对象。但不幸的是我没有得到预期的输出。第一个线程显示 A
超过一百次,第二个线程显示 B
少于 100 次。每次我 运行 它,我都会变得不同 outputs.So 我想没有实现互斥。我在这里做错了什么?
public class TestThread extends Thread{
StringBuffer string;
public void run(){
synchronized(this){
for(int i=0;i<100;i++){
System.out.print(this);
}
System.out.println();
string.setCharAt(0,(char)(string.charAt(0)+1));
}
}
public TestThread(StringBuffer string){
this.string=string;
}
public String toString(){
return string.toString();
}
public static void main(String args[]){
StringBuffer b=new StringBuffer("A");
TestThread one=new TestThread(b);
TestThread two=new TestThread(b);
one.start();
two.start();
}
}
您正在锁定当前对象,即this
。因此,您锁定了 2 个 不同的对象 。使用普通锁,然后尝试相同的示例。
synchronized(this)
==> synchronized(someGlobalObject)
我正在尝试 运行 java 中的一个简单的多线程程序,该程序在非静态 method.I 中使用 synchronized
块有一个 class TestThread
有一个字段 string
这是一个 StringBuffer
变量。我创建了两个线程 one
和 two
并且它们的每个 string
变量都初始化为 StringBuffer
b
其中包含值 A
。进入 运行ning 状态的第一个线程必须显示值 A
一百次,然后将其递增一个,以便下一个线程 运行ning 将显示递增的值 B
一百次 too.I 在 synchronized
中使用了由 this
表示的当前对象。但不幸的是我没有得到预期的输出。第一个线程显示 A
超过一百次,第二个线程显示 B
少于 100 次。每次我 运行 它,我都会变得不同 outputs.So 我想没有实现互斥。我在这里做错了什么?
public class TestThread extends Thread{
StringBuffer string;
public void run(){
synchronized(this){
for(int i=0;i<100;i++){
System.out.print(this);
}
System.out.println();
string.setCharAt(0,(char)(string.charAt(0)+1));
}
}
public TestThread(StringBuffer string){
this.string=string;
}
public String toString(){
return string.toString();
}
public static void main(String args[]){
StringBuffer b=new StringBuffer("A");
TestThread one=new TestThread(b);
TestThread two=new TestThread(b);
one.start();
two.start();
}
}
您正在锁定当前对象,即this
。因此,您锁定了 2 个 不同的对象 。使用普通锁,然后尝试相同的示例。
synchronized(this)
==> synchronized(someGlobalObject)