昨天下班, 我回来后。由于没有钥匙,于是先到一个待就业的学弟那里做了一下。
首先我们谈了一下最近的就业环境。
后来他就像我问了一个Java基础方面的问题。
Object对象中有那些方法?
呵呵,还别说, 对于这些基础知识本人还是很有信息的。
但是结果还是差强人意。少说了两个方法equals(), clone();
一说起clone(),前不久在公司写的一个native方法,还打算去重载clone()这个方法呢
这里, 给大家和我都留下一个研究的问题。
那就是hashCode这个方法到底有什么用途? 它在C层面是怎么实现的?
这个这次就不做详细的研究了。
好了, 废话有点多了。 呵呵!
在看API文档的时候,我们又谈到了wait与sleep的区别等等。其中,在与他谈论中, 我自己想到一个问题,感觉还是满有意思的。
问题是:为什么wait(), notify()要放在同步快中呢?
Java中每个对象VM都会给它分配一个锁资源。参考源代码,可以知道wait, notify都是native方法,也就是本地方法。这些方法主要的目的是提供不同线程间的一个通信问题!由于这个目的,才会出现这些方法的。也就是说这两个方法VM的多线程设计是密切相关的。
当你在一个方法加上synchronized或同步块的话,VM会对你做一些额外的编码工作。主要是两个点,一个是进入点,一个是出入点。进入口:需要根绝当前对象的锁对象状态做不同的动作。出入口:释放当前对象锁资源。所以方法的同步是比一般的方法所耗费的时间是更久一点的。主要在进入口与出入口这里的额外耗费时间。
下面我对这个问题做一个猜测,当然希望那位大牛能做一个全面的解释。我这里只是猜测! OK! Go.
wait, notify这两个方法主要是因为线程的同步机制才引入的,可以这么说它们是与线程的实现机制是密切相关的。而这两个方法是native方法实现的(参考源代码),也就是说在底层它做了什么我们根本不知道。但是一定会于锁有关系,因为wait方法有这么一个特性:wait住的线程会释放对象锁!从这里我们可以肯定一点wait会进行对象锁的操作!
而线程是一个随机调度的,假设我们不把wait放入同步快中。我来假设线程的一种调用情况:现在有两个线程t1, t2。一个对象obj。当t1调用wait,而wait还没有执行完, t2获得了CPU的时间片,t2也调用了wait()。那么wait将变得不可操作,因为t1,t2可能同时操作了锁资源!这样就会出现问题!
我的结论是:放入同步快中,主要是为了让wait与notify具有线性安全! 有的人可能会问,那为什么不在该方法前加同步关键字呢?呵呵!这是不可以的,因为它们是native方法, native方法的调用与Java的一般方法是有区别的。具体你可以去看<深入Java虚拟机>!
好了,这次就写到这里了。 最近正在研究公司的虚拟机, 若我有更好的解释我会继续发文章的!