1、请设计一个程序证明使用wait()休眠的线程会释放锁,使用sleep()休眠的线程不会释放锁。而且说明证明的过程。
证明:使用wait休眠的方法会释放锁。
让A线程访问对象的一个同步方法,之后在该方法中使用wait休眠,此时再让B线程访问该对象同步方法,如果B线程能访问则证明A线程在休眠的时候释放了锁,如果不能访问则A线程休眠的时候没有释放锁。
package com.sun.test;
import java.io.Serializable;
public class Animal implements Serializable {
public synchronized void set() {
System.out.println(Thread.currentThread().getName()+"线程调用了set方法");
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void get() {
System.out.println(Thread.currentThread().getName()+"线程调用了get方法");
}
}
package com.sun.test;
// 定义生产者线程主体类
class Productor implements Runnable {
private Animal animal;
public Productor(Animal animal) {
this.animal = animal;
}
@Override
public void run() {
this.animal.set();
}
}
// 定义消费者线程
class Customer implements Runnable {
private Animal animal;
public Customer(Animal animal) {
this.animal=animal;
}
@Override
public void run() {
this.animal.get();
}
}
public class Test {
public static void main(String[] args) throws Exception {
Animal animal=new Animal();
new Thread(new Productor(animal)).start();
new Thread(new Customer(animal)).start();
}
}
此时如果A线程和B线程都能进入set方法表示释放上一个线程释放锁,如果只有一个进入则表示上一个线程没有释放锁(输出方法中的信息则表示进入方法)
证明:证明sleep休眠的线程在休眠期间不会释放锁
让A线程访问对象的一个同步方法,之后在该方法中使用sleep()休眠,此时再让B线程访问该对象的同步方法,如果B线程能访问则证明A线程在休眠的时候释放了锁,如果不能访问则A线程休眠的时候没有释放锁。
package com.sun.test;
import java.io.Serializable;
public class Animal implements Serializable {
public synchronized void set() {
System.out.println(Thread.currentThread().getName()+"线程调用了set方法");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void get() {
System.out.println(Thread.currentThread().getName()+"线程调用了get方法");
}
}
package com.sun.test;
// 定义生产者线程主体类
class Productor implements Runnable {
private Animal animal;
public Productor(Animal animal) {
this.animal = animal;
}
@Override
public void run() {
this.animal.set();
}
}
// 定义消费者线程
class Customer implements Runnable {
private Animal animal;
public Customer(Animal animal) {
this.animal=animal;
}
@Override
public void run() {
this.animal.get();
}
}
public class Test {
public static void main(String[] args) throws Exception {
Animal animal=new Animal();
new Thread(new Productor(animal)).start();
new Thread(new Customer(animal)).start();
}
}
如果在上一个线程休眠期间后面的线程不能进入方法,等到5秒以后后面的线程才进入方法则证明了在休眠期间线程没有释放锁,如果A线程和B线程都不需要等待5秒直接进入方法则表示休眠的线程释放锁。