java同期问题,请教大家

来源:百度知道 编辑:UC知道 时间:2024/06/17 17:19:25
public class MyThread2 extends Thread {
int obj = 0;

private Object lock = new Object();

public void setObj(int objSet) {
synchronized (lock) {
for (int i = 0; i < 1000; i++) {
obj++;
System.out.println(obj);
}
}
}

public void run() {
setObj(obj);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成されたメソッド・スタブ
MyThread2 tt = new MyThread2();
MyThread2 tt2 = new MyThread2();
tt.start();
tt2.start();
}

}
我想实现同期,就是th1现实1~1000后th2才能在现实1~1000,因为有synchronized (lock) 锁嘛,但实际结果中却有



989
990
991
992
993
994
995
996
997
998
999
1000
941
942
943
944
945
946
947
948
949



请问为什么没有同期,即使把函数setObject改成 public synchronized void se

你的思路有点问题,

首先线程是各自执行的,你开启了两个线程,先后顺序是不能控制的,所以会交叉执行

至于你说的同步是对同一个对象而言的,你创建
MyThread2 tt = new MyThread2();
MyThread2 tt2 = new MyThread2();
tt.lock 和tt2.lock 就已经是两个对象了,所以你说的同步就没有意思了

private Object lock = new Object();
改成 private static Object lock =new Object()
试一下

加上static以后,lock就是同一个对象,无论你生成多少个类对象,对象中的lock都是共用一个,这样就是同一把锁
不加的话,你的tt 有一把锁,tt2也有一把锁, 各管各的锁,相互不能约束就达不到同步目的

恩。
正如上面说的,线程间是独立的,它们的执行顺序是不受控制的。并且你的这段代码要是在不同的系统中,其执行结果也是不同的,这与系统内核有关。
你要想让th1,th2有先后顺序,可以尝试让th2先休眠一段时间。

思路有点问题