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
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先休眠一段时间。
思路有点问题