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

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

2011-10-29 16:21 295 查看
java中的锁的机制

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

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

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

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

都共享该对象的等待池(waitpool)和锁池(lockedpool)

例:

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

示例程序:

viewsourceprint?

package
com.gyf;
import

java.util.Date;
public
class
T2{
/**
*@paramargs
*/
public
static

void
main(String[]args){
//TODOAuto-generatedmethodstub
Objectobject=
new
Object();
A1a1=
new
A1(object);
B1b1=
new
B1(object);
Thread.yield();
}

}
/////////////////这里令A只休息1分钟

class

A1
extends
Thread{
private
static

int
a=
0
;
//记录以及休息的毫秒数
private
ObjectjObject;
public
A1(ObjectjObject){
this
.jObject=jObject;
this
.start();
}

public
static

int
getA(){
return
a;
}

public
void

run(){
synchronized
(jObject){
//notifyAll();
Datedate1=
new
Date();
//获得睡觉时的时间
Datedate2;
while
(a<
10000
){
jObject.notifyAll();
System.out.println(
"A:我要开始睡觉了....."
);
try
{
jObject.wait(
10000
-a);
}
catch

(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
System.out.println(
"A:我被吵醒了....."
);
date2=
new
Date();
a=(
int
)(date2.getTime()-date1.getTime());
}
System.out.println(
"A:我睡醒了"
);
}
}

}
class

B1
extends
Thread{
private
ObjectjObject;
public
B1(ObjectjObject){
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

(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}

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