在使用多线程时,一般会使用synchronized关键字对代码和方法进行同步,从jdk5以后出现了Lock类,功能和synchronized关键字是一样的,只是实现的方式不一样。使用synchronized可以同步方法和同步代码块:
synchronized同步代码块:
synchronized(同步监听对象) { //需要同步的代码 } 同步监听对象取值通常有: 1. 同一份资源; 2. this,此时只能使用实现方式,继承时不能使用this 3. 同步代码块所在类的字节码,
synchronized同步方法时:
非静态方法默认使用的是this作为同步监听对象; 静态方法默认是使用的是方法所在类的字节码对象; 使用Lock类时:使用lock()对代码和方法进行加锁
问题是:设计到很多个线程,比如消费者和生产者问题,会出现死锁的可能,为了避免死锁,使用synchronized关键字对代码块和方法进行同步时,最后都使用 notify(); //唤醒等待中的第一个线程 ,notifyAll();//唤醒剩下的所有线程 这两个方法唤醒线程,这两个方法时从Object类继承的
但是使用Lock类时,却不可以使用 notify(); notifyAll();这两个方法唤醒线程,要想唤醒线程,必须使用Condition中的signal() 唤醒等待中的第一个线程,signalAll()方法 唤醒所有等待线程。
Lock类的父类不也是Object类吗,也继承了notify(),notifyAll()方法,为什么不可以使用这两个方法呢?而只能使用Condition中的signal(),signalAll()
方法唤醒等待中的线程。
|