1.同步的产生,处理操作,死锁的情况.
- 同步:多个线程访问同一资源所需要考虑的问题.异步操作会引起
- 使用synchronized同步代码块和synchronized方法进行实现同步操作.
- 同步代码块调用当前线程对象,执行某一操作其他线程对象无法进来.
- 多个线程访问资源的时候使用synchronize;
- 同步操作与异步操作相比,异步操作速度会更快但是同步操作时数据的安全性较高属于安全的线程操作.
2.生产者与消费者的问题的产生
- 问题的引出
- 生产者和消费者指的是两个不同的线程类对象,操作同一资源的情况
- 生产者负责生产数据,消费者负责取走数据
- 生产者每生产完一组数据之后,消费者就取走一组数据.
- 比较容易出现的问题,1.数据错位. 2.数据重复取出,数据重复设置.
- 解决数据错乱的问题,数据错位完全是由非同步的操作所造成的,所以需要使用同步处理.
- 因为取和设置是两个不同的操作,所以想进行同步控制,就需要将其进行定义在同一个类里面完成,可以进行解决数据错位问题.
- 重复生产和重复取出操作的问题,
- 如果想实现整个代码的操作,必须加入等待和唤醒机制.在object类中提供了专门处理的几个方法.
- 等待: public final void wait() throws InterruptedException;
- 唤醒第一个等待线程: public final void notify();
- 唤醒全部等待线程,那个优先级高就先执行.public final void notifyAll();
面试题:sleep()与wait()的区别?
- sleep() 是Thread()类定义的方法,wait()是Object类定义的方法.
- sleep()可以设置休眠时间,时间一到自动唤醒,而wait()需要等待notify()进行唤醒.
死锁线程同步过多就有可能造成死锁.
- 死锁是开发中某一逻辑错误造成的的问题,且出现机率较低.
面试题:多线程访问同一资源时需要考虑到那些情况?有可能带来那些问题?
- 多个线程访问同一资源时一定要处理好同步,可以使用同步代码块或同步方法的形式解决.
- |-同步代码块: synchronized(锁定对象){代码};
- |-同步方法: public synchronized 返回值 方法名称(){代码};
- 但过多的使用同步.有可能造成死锁.
- 一般同步和异步的区分方式可以通过synchronized 来区分.
- 死锁是一种不确定的状态,