Java—锁—等待唤醒机制
答:不会,要先有执行资格和执行权然后才会执行下面的代码。
线程的安全问题
同步代码块
线程锁:
把操作共享数据的代码锁起来
特点1:锁默认打开,有一个线程进去了,锁自动关闭
特点2:里面的代码全部执行完毕,线程出来,锁自动打开
练习:某电影院目前正在上映国产大片,共有19张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
锁对象还可以改写成:MyThread.class
同步方法
就是把synchronized关键字加到方法上
练习:某电影院目前正在上映国产大片,共有19张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
注意:这里int ticket=0前面没有加静态,因为这里就创建了一个myrunble的对象。
这里因为执行过快会出现只有一个窗口买票的情况
如果想要看到窗口交织的情况可以加上thread.sleep(参数).
改为同步方法:
Lock锁
代码练习:某电影院目前正在上映国产大片,共有19张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票
1.程序不会停止因为当ticked=100时执行break代码会直接跳到while的外面没有执行关索拿着锁对象出去没有把锁打开。2线程和3线程会一直停在锁对象哪里,程序不会关闭。
2.这里lock加static静态是因为有多个对象需要共享一个
想要解决写try catch finally, finally里面的代码一定会执行
死锁
死锁:不是一个知识点,是一个错误。
学习目的:不犯这样的错误。
一句话俩个锁不能嵌套
等待唤醒机制
常见方法:
例子,吃面条
消费者代码
生产者代码
等待唤醒机制(阻塞队列方式实现)
阻塞队列的继承结构:
代码案例: