您的位置:首页 > 编程语言 > Java开发

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

2011-10-29 16:18 239 查看
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、如果两个线程之间有共享的数据对象,则要使用该数据对象的锁,比如我们常用的 生产者-消费者 模式等,这里不再赘述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: