什么是假唤醒? 当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功 1。比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁 为什么if会出现虚假唤醒 因为if只会执行一次,执行完会接着向下执行if()外边的 而while不会,直到条件满足才会向下执行while()外边的 避免虚假唤醒 线程之间的通信问题:生产者和消费者的问题等待唤醒,通知唤醒 线程交替执行AB操作同一个变量num0 Anum1 Bnum1 publicclassA{ publicstaticvoidmain(String〔〕args){ DatadatanewData(); newThread((){ for(inti0;i10;i){ try{ data。increment(); }catch(InterruptedExceptione){ e。printStackTrace(); } } },A)。start(); newThread((){ for(inti0;i10;i){ try{ data。decrement(); }catch(InterruptedExceptione){ e。printStackTrace(); } } },B)。start(); newThread((){ for(inti0;i10;i){ try{ data。increment(); }catch(InterruptedExceptione){ e。printStackTrace(); } } },C)。start(); newThread((){ for(inti0;i10;i){ try{ data。decrement(); }catch(InterruptedExceptione){ e。printStackTrace(); } } },D)。start(); } } 判断等待,业务,通知 classData{数字资源类 privateintnumber0; 1 publicsynchronizedvoidincrement()throwsInterruptedException{ while(number!0){ 等待 this。wait(); } number; System。out。println(Thread。currentThread()。getName()number); 通知其他线程我1完毕了 this。notify(); } 1 publicsynchronizedvoiddecrement()throwsInterruptedException{ while(number0){ 等待 this。wait(); } number; System。out。println(Thread。currentThread()。getName()number); 通知其他线程我1完毕了 this。notify(); } } 怎么产生虚假唤醒 把while(product1){} 换成if(product1){} 就会出现虚假唤醒