- 线程安全问题
当多个线程使用“共享数据”时,就会有线程安全问题
当一个线程修改了“共享数据”,是会影响其它线程
如何解决?
加锁:通过同步代码块或同步方法 - 同步代码块
语法格式:
synchronized(锁对象){
需要加锁的代码
}
锁对象:又称为监视器对象,同一时刻某一段代码,只允许一个线程运行,这个锁就记录谁现在在运行,其他线程进不来
锁对象的选择:可以是任意类型的对象,必须是这几个线程使用同一个锁对象
锁的代码的范围选择:太大不行,太小不行;锁一次任务 - 同步方法:锁的是一次调用过程
语法格式:
【修饰符】 synchronized 返回值类型 方法名(【形参列表】) throws 异常列表{
}
同步方法的锁对象:
(1)静态方法:当前类的class对象
(2)非静态方法:this
避免死锁 - 生产者和消费者问题
有两个或多个线程,其中一个或一部分线程,生产“数据”,称为生产者线程;另一个或另一部分线程,消耗“数据”,称为消费者线程。
这些数据放在一个共享区域。那么就会出现:当“共享”区域中的数据空了,消费者线程必须“停/等待”,等待生产者线程生产了新数据后,继续进行;当“共享”区域中的数据满了,生产者线程必须“停/等待”,等到消费者线程消耗了数据后,继续进行
生产者消费者问题及如何解决:
(1)共享数据:就会有线程安全问题,需要“同步”来解决
(2)共享区域大小固定的:就需要用到“协作”,即线程通信。
Object类中有:
(1)wait():必须由锁对象(线程的监视器对象)来调用
(2)notify():必须由锁对象(线程的监视器对象)来调用,其作用就唤醒一个正在等待的线程,唤醒的只能是想要获取同一个锁对象的线程。
(3)notifyAll():唤醒所有和我是同一个监视器对象的正在等待的线程
Java——线程安全问题,同步方法,同步代码块,生产者和消费者问题
最新推荐文章于 2021-01-03 01:18:51 发布