- 浏览: 188893 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
grzrt:
zkf55915 写道哥们怎么用啊
好久不用了,就是看帮助资 ...
淘宝MetaQ开源消息队列安装 -
zkf55915:
哥们怎么用啊
淘宝MetaQ开源消息队列安装 -
grzrt:
jinnianshilongnian 写道整这个了?
没有 看 ...
linux内核中链表的实现 -
jinnianshilongnian:
整这个了?
linux内核中链表的实现
在Oracle JVM 1.6 里面实现的object的wait 和notify方法是在synchronizer.cpp里实现。
先介绍2个对象:
1. ObjectMonitor 对象 主要用来监视创立的Object
在synchronizer.cpp 里定义了,ObjectMonitor 的对象,我们来看ObjectMonitor的对象的结构体
ObjectMonitor::ObjectMonitor() {
_header = NULL;
_count = 0;
_waiters = 0,
_recursions = 0;
_object = NULL;
_owner = NULL;
_WaitSet = NULL;
_WaitSetLock = 0 ;
_Responsible = NULL ;
_succ = NULL ;
_cxq = NULL ;
FreeNext = NULL ;
_EntryList = NULL ;
_SpinFreq = 0 ;
_SpinClock = 0 ;
OwnerIsThread = 0 ;
}
每个object的对象里 markOop->monitor() 里可以保存ObjectMonitor的对象。
建立ObjectMonitor的算法:
如果不存在,可以向Thread 的ObjectMonitor 的对象列表中Allocate free objectMonitor 对象。
每个线程都有ObjectMonitor 的free和used的objectMonitor对象列表,如果没有free objectMonitor对象列表,将向global 中ListLock Allocate为了提高效率。
2. ObjectWaiter 对象
ObjectWaiter 对象
class ObjectWaiter : public StackObj {
public:
enum TStates { TS_UNDEF, TS_READY, TS_RUN, TS_WAIT, TS_ENTER, TS_CXQ } ;
enum Sorted { PREPEND, APPEND, SORTED } ;
ObjectWaiter * volatile _next;
ObjectWaiter * volatile _prev;
Thread* _thread;
ParkEvent * _event;
volatile int _notified ;
volatile TStates TState ;
Sorted _Sorted ; // List placement disposition
bool _active ; // Contention monitoring is enabled
public:
ObjectWaiter(Thread* thread) {
_next = NULL;
_prev = NULL;
_notified = 0;
TState = TS_RUN ;
_thread = thread;
_event = thread->_ParkEvent ;
_active = false;
assert (_event != NULL, "invariant") ;
}
void wait_reenter_begin(ObjectMonitor *mon) {
JavaThread *jt = (JavaThread *)this->_thread;
_active = JavaThreadBlockedOnMonitorEnterState::wait_reenter_begin(jt, mon);
}
void wait_reenter_end(ObjectMonitor *mon) {
JavaThread *jt = (JavaThread *)this->_thread;
JavaThreadBlockedOnMonitorEnterState::wait_reenter_end(jt, _active);
}
};
ObjectWaiter 对象里存放thread(线程对象) 和 ParkEvent(线程的unpark), 每一个等待锁的线程都会有一个ObjectWaiter对象.
而objectwaiter是个双向链表结构的对象。
我们可以看到在ObjectMonitor对象里有2个队列成员_WaitSet 和 _EntryList 存放的就是ObjectWaiter
_WaitSet:
主要存放所有wait的线程的对象,也就是说如果有线程处于wait状态,将被挂入这个队列
_EntryList:
所有在等待获取锁的线程的对象,也就是说如果有线程处于等待获取锁的状态的时候,将被挂入这个队列。
Wait 方法实现:
ObjectSynchronizer::wait方法
通过object的对象中找到ObjectMonitor对象
调用方法
void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS)
通过ObjectMonitor::AddWaiter调用把新建立的ObjectWaiter对象放入到 _WaitSet 的队列的末尾中
然后在ObjectMonitor::exit释放锁,接着 thread_ParkEvent->park 也就是wait
Notify方法的实现:
ObjectSynchronizer::notify方法
调用ObjectSynchronizer::inflate
object的对象中找到ObjectMonitor对象
然后调用方法ObjectMonitor::notify
调用ObjectMonitor::DequeueWaiter 摘除第一个ObjectWaiter对象从_WaitSet 的队列中
并把这个ObjectWaiter对象放入_EntryList中,_EntryList 存放的是ObjectWaiter的对象列表,列表的大小就是那些所有在等待这个对象锁的线程数。
注意这里并没有调用ObjectMonitor::exit释放锁
NotifyALL和Notify 的区别就是
通过遍历调用ObjectMonitor::DequeueWaiter,把所有的_WaitSet的队列中的ObjectWaiter对象放入到_EntryList中
关于放入到_EntryList的策略大概有4中Policy,其中还涉及到一个_cxq的队列,先不具体介绍了
notify, 和notifyAll 都没有释放对象的锁,而是在Synchronizer同步块结束的时候释放
如何释放锁
调用ObjectMonitor::exit
从_EntryList里找到一个ObjectWaiter,因为ObjectWaiter里有线程的_event ParkEvent,调用unpark() 通知ObjectWaite里的线程运行(拿到锁),具体实现在ObjectMonitor::ExitEpilog方法里
发表评论
-
项目代码质量控制
2014-10-20 17:15 837在以后的开发项目时可以适当使用工具进行程序检查: 1、F ... -
WorkbookFactory 找不到
2013-11-08 10:46 1016在最近的POI版本中,poi-3.9.jar包中找不到Work ... -
记一次JVM GC日志分析
2013-03-08 21:36 1754这几天在准备升级JDK版本到1.6,对目前线上JVM(版 ... -
Eclipse 相同变量的高亮 及颜色
2013-02-18 17:26 1664在Eclipse/MyEclipse中如果不小心把变量的高 ... -
java jstack dump 线程 介绍 解释
2013-02-05 15:52 1216hi,all: 最近抽时间把JVM运行 ... -
[转载]JDMK 基本JMX配置( html adaptor)
2013-01-07 13:37 1740原文地址: JDMK 基本JMX配置( html adap ... -
JAVA中的继承分析
2012-12-27 11:43 5183为什么写这篇博客,之前对继承的理解知识大体理论上,最近 ... -
JVM学习之:虚拟机中的运行时栈帧总结(二)
2012-12-12 19:46 845在 JVM学习之:虚拟机 ... -
JVM学习之:虚拟机中的运行时栈帧总结(一)
2012-12-12 19:45 874每 个人都知道,各种各样的动画视频,都是由一帧一帧图片连 ... -
JAVA字符串占位符
2012-12-06 08:24 3228包 java.text.MessageFormat java ... -
copy项目是容易出现的错误--webAppRootKey错误
2012-12-05 21:18 733Tomcat 发布多个项目时抛的webAppRootKey错误 ... -
web.xml配置总结
2012-12-05 20:50 696一、关于webAppRootKey的定义 默 ... -
spring组件扫描<context:component-scan/>使用详解
2012-12-05 19:14 738关于spring自动检测组件的使用方式网上太多了,而且也不 ... -
spring组件扫描<context:component-scan/>使用详解 (
2012-11-28 08:57 721关于spring自动检测组件的使用方式网上太多了,而且也不 ... -
static class 静态类(Java)
2012-11-23 20:20 887一般情况下是不可以用static 修饰类的。 ... -
java jvm 调优实战
2012-11-13 10:01 8171.eclipse 打印gc日志 eclipse根目录 ... -
Zookeeper的一致性协议:Zab
2012-11-04 16:14 1241Zookeeper使用了一种称为 ... -
浅谈java内存模型
2012-10-30 19:29 855不同的平台,内存模 ... -
JVM分代垃圾回收策略的基础概念
2012-08-15 12:43 704由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分 ... -
bloom filter 的Java 版
2012-07-26 21:50 889属于转贴:http://www.cnblo ...
相关推荐
从给定的文件片段中,我们可以提取出关于Java中Object类和String类的源码分析的知识点。 首先,Object类是Java中所有类的根类。它包含了所有对象共有的方法,是所有类继承结构的最顶层。从文件片段中我们可以看到...
Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...
源码分析可以帮助读者理解和运用这些机制,编写出高效、安全的并发程序。 文件I/O操作在任何编程语言中都是必不可少的。Java的File类和InputStream/OutputStream家族提供了丰富的功能,用于读写文件和处理流。通过...
`run()`方法是线程执行的主要入口,`synchronized`关键字用于控制并发访问,`wait()`和`notify()`方法实现线程间的通信。 5. `IOException` 和 `Exception` 类:Java异常处理机制的核心在于`Exception`类及其子类。...
Java提供了内置的多线程支持,源码中会有并发编程的相关示例,包括线程的创建、同步机制(如synchronized关键字、wait/notify机制)以及并发工具类的使用。 I/O流是Java处理输入输出的重要部分,包括文件操作、网络...
源码是程序员与计算机交流的语言,通过阅读和分析《Thinking in Java》的源码,我们可以更直观地理解书中的编程思想和设计模式。第四版的源码反映了Java SE 5.0及之后的版本特性,如枚举类型、泛型、注解等,这些都...
《Head First Java》是入门Java编程的一本经典...源码分析是学习Java的重要环节,通过阅读和实践书中的例子,你可以更好地理解这些概念如何在实际代码中应用。同时,不断练习编写和调试程序,才能真正掌握Java编程。
- Java提供了Thread类和Runnable接口来创建和管理线程,理解线程同步和互斥的概念,如synchronized关键字和wait/notify机制。 7. **网络编程**: - 使用Socket编程实现客户端和服务器之间的通信,理解TCP和UDP...
Java是一种广泛使用的面向...通过分析"Java入门学习源码"中的JavaProject,初学者可以逐步掌握上述知识点,从而建立起扎实的Java编程基础。实际操作这些代码,结合理论学习,将有助于提高编程技能并加深对Java的理解。
"java并发源码分析之实战编程"这个主题深入探讨了Java平台上的并发处理机制,旨在帮助开发者理解并有效地利用这些机制来提高程序性能和可扩展性。在这个专题中,我们将围绕Java并发库、线程管理、锁机制、并发容器...
总的来说,这个资源包涵盖了Java并发编程的核心概念和技术,结合源码分析,学习者可以深入理解并发编程的原理,提升在实际项目中的应用能力。通过实践和调试源码,可以更好地掌握这些知识点,提高解决问题的能力。
6. **多线程**:Java提供了强大的多线程支持,包括Thread类、Runnable接口,以及synchronized关键字、wait()、notify()等同步控制方法。源码会展示如何创建和管理线程,实现并发编程。 7. **网络编程**:Java的...
Java提供了多种线程同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Semaphore、CyclicBarrier等高级并发工具。 2. **并发下载策略**:在FlashGet的实现中,关键在于如何有效地分配和管理...
理解源码可以让我们知道如何控制线程的执行顺序,同步机制如`synchronized`关键字和`wait()`, `notify()`方法的使用。 6. **输入/输出流**:Java的I/O系统支持文件操作、网络通信等多种数据传输。`InputStream`和`...
6. **多线程编程**:Java提供了丰富的多线程支持,源码会展示如何创建和管理线程,同步机制如synchronized关键字和wait()、notify()方法的运用。 7. **网络编程**:Java的Socket编程是实现网络应用的基础,源码可能...
5. **多线程编程**:Java提供了强大的多线程支持,书中的相关章节会讲解线程的创建、同步机制(如synchronized关键字、wait/notify机制)、线程池等,帮助读者理解和编写并发程序。 6. **网络编程**:Java提供了...
7. **多线程**:Java支持并发编程,书中会介绍如何创建和管理线程,包括同步机制(如synchronized关键字和wait/notify机制)以及线程池的使用。 8. **泛型**:泛型是Java 5引入的新特性,它允许在类、接口和方法中...
总而言之,《JAVA项目实例源码》提供了一个全面的学习平台,通过分析和理解这些源码,我们可以提升自己的Java编程技能,更好地掌握实际项目开发中的各种技术,为今后的Java职业生涯打下坚实的基础。而文件"sl"(实例...
5. **多线程**:Java提供了内置的多线程支持,源码包可能包含线程的创建、同步和通信实例,如synchronized关键字、wait()、notify()和notifyAll()方法的使用。 6. **I/O流**:Java的I/O流系统用于处理输入输出操作...
7. **多线程**:学习如何创建和管理线程,理解线程同步和通信,如synchronized关键字、wait()、notify()和notifyAll()方法的应用。 8. **网络编程**:掌握Socket编程,创建TCP和UDP通信,实现简单的客户端和服务端...