昨天下班, 我回来后。由于没有钥匙,于是先到一个待就业的学弟那里做了一下。
首先我们谈了一下最近的就业环境。
后来他就像我问了一个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虚拟机>!
好了,这次就写到这里了。 最近正在研究公司的虚拟机, 若我有更好的解释我会继续发文章的!
分享到:
相关推荐
主要介绍了Java 中Object的wait() notify() notifyAll()方法使用的相关资料,需要的朋友可以参考下
3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以在任何地方调用; 4.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。(如果不是在同步方法或同步代码块中调用wait()方法,...
创建多个condition对象 一个condition对象的signal(signalAll)方法和该对象的await方法是一一对应的,也就是一个condition对象的signal(signalAll)...Condition类的signalAll方法和Object类的notifyAll方法等效
注意:上述方法只能被同步监听锁对象来调用,这也是为啥wait() 和 notify()方法都在 Object 对象中,因为同步监听锁可以是任意对象,只不过必须是需要同步线程的共同对象即可,否则别的对象调用会报错: java.lang...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。) sleep...
为什么线程通信的方法wait(), notify()和notifyAll()被定义在Object 类里 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么 String str="i"与 String str=new String("i")一样吗 用过ConcurrentHashMap,...
只有当别的线程在该对象上调用了 notify()或者notifyAll()方法,"Wait Set"队列中的线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。"Wait Set"中的线程在Thread Dump中显示的状态为 in ...
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
描述一下notify和notifyAll区别; synchronized关键字加在静态方法和实例方法的区别; 用锁的注意点; cas机制可能导致的问题ABA,什么是ABA; 程序开多少线程合适; 实现一下DCL(双重检查锁) stream 和 parallel...
Java自1995年面世以来得到了广泛得一个运用,但是对多...在Java 5.0之前Java里的多线程编程主要是通过Thread类,Runnable接口,Object对象中的wait()、 notify()、 notifyAll()等方法和synchronized关键词来实现的。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...
4 void copy(Object obj) 把此Object拷贝到指定的Object对象中 5 Object clone() 克隆此Object对象 6 String toString() 把此Object对象转换成String类的对象 7 void notify() 唤醒一个等待的线程 8 void ...
在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。下面通过本文给大家介绍Java中线程的等待与唤醒知识,感兴趣的...
notify() notifyAll() toString() wait() String String、StringBuffer、StringBuilder三者的区别: 都在java.lang 包下 String使用final修饰,不可变,每次字符串变更都是创建新的字符串,String s = “a”+"b"除外...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...
LeetCode判断字符串是否循环 知识点总结 java基础 1、使用迭代器和for each循环查看集合元素时只能获得元素的值,不能改变元素 ...object的方法:wait(notify,notifyall),thread的方法:(sleep、join),结束
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
實踐53:優先使用notifyAll()而非notify() 185 實踐54:針對wait()和notifyAll()使用旋鎖(spin locks) 187 實踐55:使用wait()和notifyAll()替換輪詢循環(polling loops) 191 實踐56:不要對locked object(㆖鎖...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。