线程的等待和唤醒
wait() : 使线程等待
notify() :唤醒线程等待栈里的,栈顶线程
notifyAll():唤醒所有的线程
因为上述方法需要用到监视器(锁)并且在异步线程里才会用到锁,所以在异步线程里才会用到上述方法让部分代码达到同步的效果。上面三个方法是针对监视器来说的
为什么这些操作线程的方法要定义在Object类中呢?
因为这些线程在使用上述方法时,都要加上锁,而锁是任意类的对象,因为是任意对象,所以要定义在Object类中
1.唤醒和等待方法只能操作同一个锁下的线程
为了解决同一块代码被不同线程访问所产生的安全问题,产生了同步代码块synchronied(对象){}
安全问题出现的原因:对同一数据的操作在同步代码中出现两次或更多;
发现安全问题的步骤1.找到共享代码块
2.找到共享数据
3.看看此数据在这个同步代码块中是否出现了两次
4.结合实际情况判断是否会产生安全问题
死锁:产生的原因:同步代码块嵌套&&两个同步代码块两个锁的嵌套顺序不同
线程间的通讯:不同线程访问共享资源