美文网首页
Java Thread:(2) wait() and notif

Java Thread:(2) wait() and notif

作者: 戈壁堂 | 来源:发表于2021-04-29 20:20 被阅读0次

Java Thread:(1) synchronization

中的实现版本使用sleep方法进行等待,造成了CPU的浪费。使用wait()notify()机制优化如下——

public class BusyFlag {

    protected Thread busyflag = null;
    protected int busycount = 0;


    public synchronized void  getBusyFlag() {
        while (!tryGetBusyFlag()) {
            try {
                wait();
            } catch (Exception e) {}
        }
    }

    public synchronized boolean tryGetBusyFlag() {
        if (busyflag == null) {
            busyflag = Thread.currentThread();
            busycount = 1;
            return true;
        }
        if (busyflag == Thread.currentThread()) {
            busycount++;
            return true;
        }
        return false;
    }

    public synchronized void freeBusyFlag() {
        if (getBusyFlagOwner() == Thread.currentThread()) {
            busycount--;
            if (busycount == 0) {
                busyflag = null;
                notify();
            }
        }
    }
    public synchronized Thread getBusyFlagOwner() {
        return busyflag;
    }
}

  • getBusyFlagOwner()方法也添加了同步操作,因为wait()方法必须在同步方法中调用
  • wait()notify()方法都必须要在同步方法中调用(或使用相同锁对象的同步代码块)。前者表示“需要等待某个条件发生”;后者表示“等待的条件已经发生”
  • wait()在同步方法中调用,似乎永远占据了对象锁,导致其他同步方法无法执行。实际上,在执行wait()前,将释放锁,然后进入wait状态;条件满足后(notify()调用后,)wait方法返回前,重新获取到对象锁。
  • 实际上,Java并没有提供获取锁、释放锁的API,wait()方法是本地方法,与同步操作紧密结合。这样从外部看,似乎是wait()方法一直占据着锁
  • 如果notify()方法调用时,没有wait()方法调用,立即返回即可,不会有副作用

在内部实现上,wait()notify()通常都是通过控制变量来实现的。所以这要求对这两个方法的调用需要加锁,确保内部对变量的操作是原子的。

相关文章

网友评论

      本文标题:Java Thread:(2) wait() and notif

      本文链接:https://www.haomeiwen.com/subject/jowirltx.html