java中的锁的机制---自己的理解

java中的锁的机制

1、java中对象的锁应用的根本是:通过该对象的等待池(wait pool)和锁池(locked pool),来是若干个线程来通信

如果来个线程之间没有共享数据对象,但两个线程之间有逻辑关系,那么我们可以随意自定义一个对象(比如object),

使两个对象来操作该对象的锁,在各自的同步代码块中,通过调用该对象的wait()、notify()、notifyAll()等方法

来彼此之间通信。因为这几个线程

都共享该对象的等待池(wait pool)和锁池(locked pool)

例:

采用Java多线程技术编写程序,其中包括两个线程:A和B,其中A线程准备休眠一小时,B线程每隔一秒输入3句“起床”后,吵醒休眠的线程A

示例程序:

 

 

package com.gyf;

import java.util.Date;

public class T2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object object =new Object();
		A1 a1=new A1(object);
		B1 b1=new B1(object);
		Thread.yield();

	}

}






/////////////////这里领A只休息1秒钟
class A1 extends Thread{
	private static int a=0;//记录以及休息的毫秒数
	private Object jObject;
	public A1(Object jObject){
		this.jObject=jObject;
		this.start();
	}
	public static  int getA(){
		return a;
	}
	
	public void run(){
		synchronized(jObject){
			//notifyAll();
			Date date1=new Date();//获得睡觉时的时间
			Date date2;
			while(a<10000){
				jObject.notifyAll();
				System.out.println("A:我要开始睡觉了.....");
				try {
					jObject.wait(10000-a);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("A: 我被吵醒了.....");
				date2=new Date();
				a=(int)(date2.getTime()-date1.getTime());
			}
			System.out.println("A: 我睡醒了");
		}
		
	}
}

class B1 extends Thread{
	
	private Object jObject;
	public B1(Object jObject){
		this.jObject=jObject;
		
		//a.setPriority(MAX_PRIORITY);//将A线程设置最高权限,使该线程先启动
		//a.start();
		this.start();
	}
	public void run(){
		//yield();//显示a获得cpu,使其先睡觉
		synchronized(jObject){
			int i=0;//记录叫了几次(执行了几秒)
			while(A1.getA()<10000){
				jObject.notifyAll();
				i++;
				try {
					sleep(1000);
					System.out.println(i+"B: 起床 起床 起床");
					jObject.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

 2、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的 生产者-消费者 模式等,这里不再赘述。

posted @ 2011-10-29 16:18  gyflyx  阅读(793)  评论(0编辑  收藏  举报