标签:释放 结束 操作 yield 导致 非静态方法 block 解决 共享数据
1、为了解决“生产者与消费者问题”。
当一些线程负责往“数据缓冲区”放数据,另一个线程负责从“数据缓冲区”取数据。
问题1:生产者线程与消费者线程使用同一个数据缓冲区,就是共享数据,那么要考虑同步
问题2:当数据缓冲区满的时候,生产者线程需要wait(), 当消费者消费了数据后,需要notify或notifyAll
当数据缓冲区空的时候,消费者线程需要wait(), 当生产者生产了数据后,需要notify或notifyAll
2、java.lang.Object类中声明了:
(1)wait():必须由“同步锁”对象调用
(2)notfiy()和notifyAll():必须由“同步锁”对象调用
3、面试题:sleep()和wait的区别
(1)sleep()不释放锁,wait()释放锁
(2)sleep()在Thread类中声明的,wait()在Object类中声明
(3)sleep()是静态方法,是Thread.sleep()
wait()是非静态方法,必须由“同步锁”对象调用
(4)sleep()方法导致当前线程进入阻塞状态后,当时间到或interrupt()醒来
wait()方法导致当前线程进入阻塞状态后,由notify或notifyAll()
4、哪些操作会释放锁?
(1)同步代码块或同步方法正常执行完一次自动释放锁
(2)同步代码块或同步方法遇到return等提前结束
(3)wait()
5、不释放锁
(1)sleep()
(2)yield()
(3)suspend()
标签:释放 结束 操作 yield 导致 非静态方法 block 解决 共享数据
原文地址:https://www.cnblogs.com/douyunpeng/p/13674571.html