虽然同步锁机制解决了线程安全问题,但是也带来一些弊端: 1. 效率会降低,每次都需要判断锁的状态 2. 可能引发死锁(彼此占用所需要的资源),出现的概率非常小,非常特殊.
线程之间彼此占用对方所需的资源,就是死锁, 死锁会造成程序阻塞
爸爸说:“给我成绩单,就给你零花钱”,儿子说:“给我零花钱,就给你成绩单”,如果两人互不相让...
当死锁发生后,要么等待同步锁自动释放,要么手动解锁.
因为任何对象都有锁,所以Object类提供了释放锁的方法:
public final void wait(),让当前线程等待,同时释放锁,直到被再次唤醒
public final void wait(long timeout),在指定时间内让当前线程等待,同时释放锁
wait()和sleep()都可以让当前线程等待,区别: 1. sleep():释放执行权(等待),不释放锁 2. wait():释放执行权(等待),同时释放锁
三.线程间通信
1.通信:打电话 发短信 QQ
2.线程间通信不是说线程之间互相发消息/传数据
3.线程间是相互独立/互不联系的
4.通信:A线程唤醒被wait()的B线程
Object类中有notify()方法,用来实现唤醒
5.思路:A线程和B线程必须认识同一个人(同一把锁),相当于中间人
A线程告诉锁,锁去叫醒B线程
6.同步锁不仅可以解决线程安全问题,还可以实现线程间通信
7.案例:两个美女吵架(必须你骂一句,我骂一句)
案例:交替输出数字
8.细节:notify()和wait()方法必须在同步代码块内进行调用
唤醒线程的方法:notify方法(Object中)
如果调用的是无参的wait()方法,那锁就一直释放,当前线程就一直等待, 还需要唤醒。Object类提供了notify()方法用来唤醒某个被wait()的锁,也就 是唤醒线程 细节: wait()和notify()方法都是操作锁的,而锁存在于同步中,也就是说这两个 方法必须出现在同步中(同步代码块或同步方法)。同步锁不仅可以解决 昨天的线程安全问题,还可以实现线程间的通信
五.线程状态
1.每个线程在不同的时间处于不同的状态
2.就绪状态 运行状态 死亡状态 阻塞状态 等待状态
3.清楚某方法执行后线程是什么状态