线程习题

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秒直接进入方法则表示休眠的线程释放锁。

猜你喜欢

转载自blog.csdn.net/qq_42539533/article/details/88077369