快速业务通道

探索Java同步机制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
  return full_i ();    }    synchronized void put (Message msg) {      while (full_i ()) {        try {          System.out.println("thread["+           Thread.currentThread().getId()+           "]"+           "release monitor lock, wait for space in the queue");          wait();        } catch (InterruptedException e) {          //do something.        } finally {          //do something.        }      }//end while.      put_i(msg);      notifyAll();    }    synchronized Message get() {      while (empty_i ()) {         try {           System.out.println("thread["+            Thread.currentThread().getId()+            "]"+            "release monitor lock, wait for message in the queue");                wait();              } catch (InterruptedException e) {                //do something.              } finally {                //do something.              }      }//end while.      Message m = get_i ();      notifyAll();      return m;    }    private boolean empty_i () {      return message_count_ == 0;    }    private boolean full_i () {      return message_count_ == max_messages_;    }    private void put_i (Message msg) {      System.out.println("thread ["+        Thread.currentThread().getId()+        "] put message <"+        msg+        ">" +        "to the queue");      buffer_[in_] = msg;          in_ = (in_ + 1) % max_messages_;          message_count_++;    }    private Message get_i() {         Message msg = buffer_[out_];          out_= (out_ + 1) % max_messages_;          message_count_--;          System.out.println("thread ["+            Thread.currentThread().getId()+            "] get message <"+            msg+            ">" +            "from the queue");        return msg;    } }

在 Java 的示例中,没有放更多的注释,希望读者通过对照 C++ 的示例,来 阅读理解这里的 Java 代码。可以看到,使用 Java 的版本代码简洁了很多。另 外,这里提供的 Java 代码,稍作修改,是直接可以作为独立的 Java 程序运行 的。

总结

我们对比一下 Monitor Object 设计模式的 C++ 版本与 Java 版本,做出如 下的总结。

在 Java 的版本中,我们不需要亲自开发 Scoped Lock,Thread Condition 类,Java 语言给我们提供了内建的支持,我们很容易使用 synchronized, wait/notify 这些 Java 特性来构建基于 Monitor Object 模式的应用。而缺点 是:缺乏一些必要的灵活性。比如 : 在 Java 的版本中,我们并不能区分出 not empty 与 not full 这两个条件变量,所以我们只能使用 notifyAll 来通知所有 等待者线程,而 C++ 版本使用了不同的通知唤醒:not_f

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号