显式锁和隐式锁都是默认为非公平锁
意思就是锁,当有多个线程在抢一把锁的时候,不是按照先来后到的规律,而是锁一旦打开,大家都去抢,抢到是谁的,就给谁,这就是非公平锁(世界本来就是不公平的,所以锁也是,默认就是不公平)
我们可以将 显式锁定义成公平锁,fair 默认是 false, true:公平锁
多线程通信的问题
wait notifyAll
生产者 与 消费者问题
我们想实现这么一个工作的流程,就是当生产者生产的时候,消费者是处于休眠状态,消费者不在运行。当消费者运行的时候,生产者就处于休眠不进行生产。
这样我们就达到一种交替运行的状态。
问题的产生与解决过程:
这里我们可以创建两个类,都是线程,一个是生产的线程,另外一个是消费的线程,生产者只生产苹果,消费者也只消费苹果,所以还需要创建一个苹果的类,里面包括苹果的生产和消费的两个方法
我们在主方法里 就可以创建两个线程,一个生产苹果的线程,另外一个消耗苹果的线程
当我们直接运行程序的时候,肯定会出现异常的情况,比如说生产苹果的过程需要打标签包装,可能没来得及包装(苹果就没产生)就可能被消费者拿去吃了(吃了的苹果是上次生产的),等等情况
根据我们之前学的同步方法:使用同步代码块,使用同步方法运行
刚开始学的时候是这么想的,不就是在我们生产的过程另外一个线程调用了消费线程吗?那我给生产和消费方法都加一个同步就行了呀
实际上:
注意这时,我们在苹果类中的生产和消费方法都加入同步,由于两个方法都是苹果的类的方法,两个方法使用的是同一个锁,此时A方法释放了锁,不是说B就一定能得到锁,B方法 和A方法是会同时去竞争锁,不是A释放锁之后,A就不去抢锁了
所以 加同步方法达不到我们想要的交替执行的效果。我们就该使用线程之间的通信方法
等A执行完方法后,唤醒所有的线程notifyAll,然后A自己休眠wait。此时B方法拿到锁 进行操作之后,唤醒所有的线程,然后B自己休眠
我们还应该给生产设置一个flag,只有当flag为true的时候才生产,生产结束之后flag置为false。这样可以防止生产多个苹果,因为这里我们想要的效果是生产一个消费一个
这样就可以达到任务交替执行的效果