szShareData是一个String,对他进行下面的赋值:
szShareData = "这是第 1 个线程";
会创建另外一个对象,这样szShareData就指向了另外一个对象。建议将szShareData改成StringBuffer。问题应该可以得到解决。但是需要注意:
给StringBuffer赋值的时候,要先将StringBuffer清空,再append:
StringBuffer sb = new StringBuffer();sb.delete(0, sb.length());
sb.append("这是第 1 个线程");
* 文件:ThreadDemo_06.java
* 描述:为什么造成线程的不同步。
* =============================================================================
*/
class ThreadDemo extends Thread{
//共享一个静态数据成员
//private static String szShareData = "";
private static StringBuffer szShareData = new StringBuffer();
ThreadDemo(){
}
ThreadDemo(String szName){
super(szName);
}
public void run(){
// 为了更清楚地看到不正确的结果,这里放一个大的循环
for (int i = 0; i < 50; i++){
if (this.getName().equals("Thread1")){
synchronized(szShareData){
//szShareData = "这是第 1 个线程";
szShareData.delete(0,szShareData.length());
szShareData.append("这是第 1 个线程");
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
}catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + szShareData);
}
} else if (this.getName().equals("Thread2")){
synchronized(szShareData){
//szShareData = "这是第 2 个线程";
szShareData.delete(0,szShareData.length());
szShareData.append("这是第 2 个线程");
// 为了演示产生的问题,这里设置一次睡眠
try{
Thread.sleep((int)Math.random() * 100);
}catch(InterruptedException e){
}
// 输出结果
System.out.println(this.getName() + ":" + szShareData);
}
}
}
}
}public class ThreadMain{
public static void main(String argv[]) throws Exception{
ThreadDemo th1 = new ThreadDemo("Thread1");
ThreadDemo th2 = new ThreadDemo("Thread2"); th1.start();
th2.start();
Thread.currentThread().join();
}
}
走召弓虽^_^