我们通过上面的代码发现,相同的票出现了多次,出现了超出范围的票,那是因为线程执行时,有随机性。(造成线程安全问题)
此时我们可以利用同步代码块将操作共享数据的代码锁起来
注意此处锁对象我们可以传递当前类的字节码,因为字节码是唯一的
同步方法;
我们发现这样的锁全是自动的,那有没有办法可以手动设置锁呢?
死锁的现象:
当锁镶套时,有可能出现死锁现象
生产者和消费者(消费者等待的情况):
(生产者等待的情况):
阻塞队列:
注意此处可能会出现打印多次 厨师做了一碗面和面条的字样,因为ArrayBlockingQueue实现类中的put和take方法的底层是已经加了锁的,而此时打印厨师做了一碗面和面条的字样处于锁的外面,因此它们将会抢占cpu的执行权,它们运行的概率是随机的。
线程的六种状态:(Java中没有定义运行状态,因为当线程抢走了cpu的执行权,JVM将会把线程交给操作系统去执行,类似如果手机被抢走,手机的维修状态我们就不用管了)