探索Java同步机制 - 编程入门网
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |