我从扩展Thread类的类A创建了两个线程a1
,a2
。类A声明了两个同步的构造函数和run方法。当我以这种形式编写的代码两个线程有时开始在同一时间虽然run
方法声明为synchronized和我得到的结果一样java中的同步关键字
0 0 1 1 2 3 4 5 6 7 2 8 3 9 4 10 5 11 6 12 7 8 9 10 11 12
代码:
public class Main {
public static void main(String[] args) {
A t = new A() ;
A a1 = new A (t) ;
A a2 = new A (t) ;
a1.start();
a2.start();
}
}
class A extends Thread {
public A() {
super() ;
}
public A(Thread th) {
super(th) ;
}
@Override
public synchronized void run() {
for (int i = 0; i <13; i++) {
System.out.print(i+" ");
}
}
}
但是,当我通过创建Thread类不是A两个线程,
Thread a1 = new Thread (t);
Thread a2 = new Thread (t);
同步方法run
工作,两个线程不会在开始同时总是给结果
0 1 2 3 4 5 6 7 8 9 10 11 12 0 1 2 3 4 5 6 7 8 9 10 11 12
我的问题:为什么synchronized关键字,当我创建A级两个线程(虽然我定义了两个构造函数)不工作,工作时,我创建Thraed类两个线程?
您如何看到第一种情况下的线程在同一时间开始?你看到混合输出吗?你能告诉我们那个输出吗? –
我可以向你保证'synchronized'确实能正常工作。你正在同步线程对象本身,这真的有点没有意义。 –
我的朋友同步始终正常工作。现在你的错误是在这里理解**线程a1 =新线程(t);线程a2 =新的线程(t); **小的描述=在这里你创建两个不同的对象有两个不同的锁权利?所以为什么一个线程会等待你有这个?两个线程都有不同的锁定。得到它了? –