package test;
public class ThreadA {
public static void main(String[] args){
ThreadB b = new ThreadB();
Threadc c = new Threadc();
c.setName("c线程");
b.setName("b线程");
c.start();
System.out.println(Thread.currentThread().getName()+"is start....");
synchronized(c){
try{
System.out.println("waiting for b1 to complete....");
c.wait();
System.out.println("Completed.now back to"+Thread.currentThread().getName());
b.start();
}catch(InterruptedException e){
}
}
}
}
class ThreadB extends Thread{
int total;
public void run(){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"is running..");
for(int i=0;i<10;i++){
total +=i;
}
System.out.println("total is"+total);
}
}
}
class Threadc extends Thread{
int sum=1;
public void run(){
synchronized(this){
System.out.println(Thread.currentThread().getName()+"is running..");
for(int i=1;i<10;i++){
sum *=i;
}
System.out.println("sum is"+sum);
notify();
}
}
}
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
这两种结果产生的原因是以对象c为同步对象的两段代码块,谁先运行的问题。
第一种情况,主线程优先运行到synchonized(c)标记的同步代码块,这时c线程synchronized(this)标记的代码块就暂时无法运行。主线程运行到c.wait()时,主线程释放同步对象的锁,进入阻塞状态,c线程会由阻塞状态变为运行状态。c线程运行完后,通过其 notify(),使主线程由阻塞状态进入运行状态,正常执行完毕。
第二种情况,c线程优先运行到synchronized(this)标记的代码块,这时主线程因为得不到同步对象锁而阻塞。当c线程运行结束后,释放同步对象锁,这时主线程由阻塞进入运行状态,当运行到c.wait()时,进入阻塞状态,因没有程序运行notify(),所以一直阻塞下去了。
------解决方案--------------------------------------------------------