小白一枚,请多指教
小白今日任务:多线程交替生产、消费,如0->1,1->0
synchronized
class Rookie { //代码量 private int codeNum = 0; public synchronized void productCode() { try { //防止出现多线程虚假唤醒,使用while,不能使用if while (codeNum != 0) { //如果当前有代码量,则开始等待被审查出bug删除 wait(); } System.out.println("菜鸟开始制造代码,当前代码量:"+(++codeNum)); notifyAll(); }catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void debugCode() { try { while (codeNum == 0) { //如果当前没有代码则开始等待菜鸟生产代码 wait(); } System.out.println("菜鸟代码出现bug,审核失败删除,当前代码量:"+(--codeNum)); notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } }
Lock
class Rookie { //代码量 private int codeNum = 0; private final Lock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); public void productCode() { try { lock.lock(); //防止出现多线程虚假唤醒,使用while,不能使用if while (codeNum != 0) { //如果当前有代码量,则开始等待被审查出bug删除 condition.await(); } System.out.println("菜鸟开始制造代码,当前代码量:"+(++codeNum)); condition.signal(); }catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } public synchronized void debugCode() { try { lock.lock(); while (codeNum == 0) { //如果当前没有代码则开始等待菜鸟生产代码 condition.await(); } System.out.println("菜鸟代码出现bug,审核失败删除,当前代码量:"+(--codeNum)); condition.signal(); } catch (InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } }
开始调用
public static void main(String[] args) { Rookie rookie = new Rookie(); //菜鸟开始写代码 new Thread(()->{for(int i=0;i<2;i++) rookie.productCode();}).start(); //大神开始审核代码 new Thread(()->{for(int i=0;i<2;i++) rookie.debugCode();}).start(); }
菜鸟开始制造代码,当前代码量:1 菜鸟代码出现bug,审核失败删除,当前代码量:0 菜鸟开始制造代码,当前代码量:1 菜鸟代码出现bug,审核失败删除,当前代码量:0