今天学习了关于多线程的有关知识,主要涉及到几个概念的理解,对象锁、sleep、wait、notify、notifyAll。
对象锁:每个对象都有对象锁,当某个线程进入用synchronized定义方法时,就获得了当前类对象(方法所属的类的对象)的锁,其他线程就不能再获得该锁,直到线程释放该锁。一个类对象有一个对象锁,多个同步方法公用一个对象锁。
sleep:是当前线程处于休眠状态,将对cpu的控制权交给其他线程,但不释放当前对象的锁,其他线程可以获得cpu,但不能进入当前线程控制的对象锁。
wait:与sleep的区别是,它会释放对象锁,其他线程可以进入该同步块。
notify:进入当前同步块的线程调用wait方法变成休眠状态的线程,notify将该线程变成等待状态。
notifyAll:进入当前同步块的线程调用wait方法变成休眠状态,notifyAll使所有休眠线程变成等待状态。
一个类中有多个同步方法,进入任意一个同步块都将获得该对象锁,由于wait方法使进入同步块的线程休眠,notify只能唤醒所有被休眠线程中的一个,notifyAll可以唤醒所有休眠线程。通常线程的通信通过wait,notifyAll和wait条件来实现。
同步方法:进入方法的线程获取该对象的锁。作用域是整个方法。
同步块:synchronized(this){},获取当前对象的锁,如果访问访问该对象的其他同步块将被堵塞。
synchronized要求只有获取对象的锁之后才能执行。