class ThreadB extends Thread{
int total = 0;
public void run(){
synchronized(this){
System.out.println("ThreadB is running...");
for(int i=0;i<100;i++){
total += i;
System.out.println("total is "+total);
}
notify();
//这句的意思是不是假如A线程放弃了锁,B线程得到锁,执行run()方法,
//执行完毕后再唤起A线程?(2)
}
}
}
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
System.out.println("Waiting for b to complete...");
try{
b.wait();
//主线程先获得了对象锁,执行到这儿时,表示当前线程释放该对象锁,是不是?
//用b.wait(); 字面意思好难理解啊...(1)
}catch(InterruptedException e){}
System.out.println("Completed.Now back to main thread");
//上面的语句,当(2)处没写notify()的时候,主线程没被唤醒怎么执行后面的语句的?
//(3)
}
System.out.println("....Total is:"+b.total);
}
}各位网友,如题,学习中,帮指点下子感谢
//执行完毕后再唤起A线程?(2)【答】不是, 是唤醒其他正在等待 “this”(就是当前这个对象)的其他线程,你们可以开始竞争这把锁了。
b.wait();
//主线程先获得了对象锁,执行到这儿时,表示当前线程释放该对象锁,是不是?【答】不是, b.wait(),是说我现在开始wait b了,直到其他线程执行了b.notify(),我就开始竞争b这把锁,如果抢到了就,我就执行 (注:你这个case,就这个线程wait b, 所以只有其他线程b.notify()了,就可以执行)
所以,b.wait(); 你应该理解成 wait b.
//上面的语句,当(2)处没写notify()的时候,主线程没被唤醒怎么执行后面的语句的?
//(3)
【答】没有办法执行。
class ThreadB extends Thread{
int total = 0;
public void run(){
synchronized(this){
System.out.println("ThreadB is running...");
for(int i=0;i<100;i++){
total += i;
System.out.println("total is "+total);
}
//notify();注销掉。为什么还能唤醒主线程,主线程还能继续执行?
}
}
}
public class ThreadA{
public static void main(String args[]){
ThreadB b = new ThreadB();
b.start();
synchronized(b){
System.out.println("Waiting for b to complete...");
try{
b.wait();
}catch(InterruptedException e){}
System.out.println("Completed.Now back to main thread");
}
System.out.println("....Total is:"+b.total);
}
}
//两只熊猫,过来看一下,没明白。
【答】因为ThreadB 可以无限制的执行完毕,这样锁就自动释放了,当然主线程可以执行。
只是如果你notify一下,主线程可以更加及时的继续执行。
对不起,没有及时的关注此贴。
因为synchronized块运行完了,然后就释放对象锁了,主线程中的synchronized又得到了对象锁,所以主线程再次运行。关键还是对对象锁理解因为synchronized的作用就是获得对象锁。在没有使用wait()与notify()的情况下,当运行完synchronized的方法或块时,就释放了对象锁。synchronized锁定的都是同一个对象,即b
b.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行
因为synchronized块运行完了,然后就释放对象锁了,主线程中的synchronized又得到了对象锁,所以主线程再次运行。关键还是对对象锁理解因为synchronized的作用就是获得对象锁。在没有使用wait()与notify()的情况下,当运行完synchronized的方法或块时,就释放了对象锁。synchronized锁定的都是同一个对象,即b
b.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行
因为synchronized块运行完了,然后就释放对象锁了,主线程中的synchronized又得到了对象锁,所以主线程再次运行。关键还是对对象锁理解因为synchronized的作用就是获得对象锁。在没有使用wait()与notify()的情况下,当运行完synchronized的方法或块时,就释放了对象锁。synchronized锁定的都是同一个对象,即b
b.wait();的意思是临时释放锁,并阻塞当前线程,好让其他使用同一把锁的线程有机会执行