线程对象锁中wait(),notify()的调用

多线程在程序中充当着一个非常重要的角色,它能够保证网络程序中多用户的处理。

那么我们应该如何去正确调度线程呢

1.对象锁

多线程在程序中是会争夺cpu的,所以适当时期需要用到对象锁。

在进行线程在同一时间只保证一个线程访问方法或变量。比如售票系统,在保证多窗口售票的同时,要保证票数的正确性,则要使用对象锁。

对象锁的作用:增加并发性。

对象锁中两个重要的调度方法:wait();notify();用于控制线程状态。

注意:wait();方法只能在对象锁的时候使用。wait();调用后会返回对象锁。sleep();不能在对象锁中使用,该方法不会返回对象锁。

以一个小程序来举例对象锁的使用:

多线程与栈的结合:

client类:

public class client{

public static void main(String[] args){

Mystock stock =new Mystock();

ThreadPush t1=new ThreadPush(stock);//出栈类

ThreadPop t2=new ThreadPop(stock);//进栈类

t1.start();

t2.start();

}

}

Mystock类:

public class Mystock{

char data[]=new char[6];

int idx=0;

private boolean isEmpty=true;

public synchronized void push(char c){//添加对象锁

if(!isEmpty){//如果栈不为空,调用wait(),等待出栈。

try{

wait();

    }catch(InterruptedException e){

}

}

System.out.println("push:"+c);

data[0]=c;

isEmpty=!isEmpty;

notify();//唤醒pop(),进行出栈

}

public synchronized char pop() {//添加对象锁
if (isEmpty) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("pop:" + data[0]);
isEmpty = !isEmpty;
notify();
return data[0];
}

}


public class ThreadPop extends Thread {
private Mystock stock = null;


public ThreadPop(Mystock stock) {
this.stock = stock;
}


public void run() {
for (int i = 97; i < 103; i++) {
stock.pop();
}
}
}


public class ThreadPush extends Thread {
private Mystock stock = null;


public ThreadPush(Mystock stock) {
this.stock = stock;
}


public void run() {
for (int i = 97; i < 103; i++) {
stock.push((char) i);
}
}
}

这样程序运行的输出结果为:

push:a
pop:a
push:b
pop:b
push:c
pop:c
push:d
pop:d
push:e
pop:e
push:f
pop:f

这就是wait(),notify(),对象锁的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值