大家在学习java的时候,一定遇到过Object类,因为在java单一继承体系中Object类是根类,所有的类都会继承它,并拥有Object的公共方法,意味着在java的面向对象的世界中,所有对象都拥有这些方法,非常通用。那么我们来看一看这些方法有哪些?

直接看一下,Object类的源码:

package java.lang;

public class Object {

private static native void registerNatives();

static {

registerNatives();

}

public final native Class<?> getClass();

public native int hashCode();

public boolean equals(Object obj) {

return (this == obj);

}

protected native Object clone() throws CloneNotSupportedException;

public String toString() {

return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {

if (timeout < 0) {

throw new IllegalArgumentException("timeout value is negative");

}

if (nanos < 0 || nanos > 999999) {

throw new IllegalArgumentException(

"nanosecond timeout value out of range");

}

if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {

timeout++;

}

wait(timeout);

}

public final void wait() throws InterruptedException {

wait(0);

}

protected void finalize() throws Throwable { }

}

其实看JDK文档大家都能知道这些方法的含义,不过我把自己对它们的理解介绍一下,这里面public的方法,重点我会详细介绍较难掌握的wait和notify方法。

具体方法的说明如下:

public String toString()

这个默认是打印对象的getClass().getName() + '@' + Integer.toHexString(hashCode())

类名@哈希码,可子类可重写该方法定义自己的对象字符串,最常用。

public final native Class<?> getClass();

获取对象的类名,在反射中可以用到。

public int hashCode();

public boolean equals(Object obj)

这两个方法在集合框架的Set集合类中用途非常重要,因为Set集合中的元素不允许重复,各种自定义对象如何判断是否重复,就是通过重写这两个方法来完成的。

public final native void notify();

public final native void notifyAll();

public final void wait()

public final native void wait(long timeout)

public final void wait(long timeout, int nanos)

这里几组方法有多个重载方法,不过核心的方法就是wait方法和notify方法,这两个方法,如果没有学习过java多线程编程估计不会接触到,这涉及到线程的同步以及在同步条件下线程通信的问题。

java 线程同步机制就是保证多个线程访问同一个共享对象时不发生冲突的步骤是上锁、操作、释放锁。而这个锁是在java对象中隐含的锁,锁也叫"同步监视器" ,它是所有对象都拥有的,你不用可视而不见,

其实就定义在Object类中,不过我们不用了解它的存在,为了防止同一个共享对象不发生冲突,java用 synchronized 来保护共享对象不处于竞争状态.,可采用同步方法或同步块来完成,但是当同步环境下两个线程需要通信怎么办?如果没有通信机制,两个线程只能针对锁的获取发出轮询效率很低,这里Object类的wait和notify两个方法就可以解决这个问题。

采用 wait()/notify() 实现同步条件下线程间通信的原理如下:

使用前提:必须是同步条件,否则调用会异常.

调用wait()

调用线程会放弃CPU

调用线程释放锁

调用线程进入锁的等待集合(池),等待CPU重新调度。

调用notify()

某个线程从锁的等待集合中离开进入准备运行状态

被通知的线程必须重新请求锁才能执行.

notify()不能精确指定被通知的线程.

notifyAll() 通知所有在等待集合的线程离开进入准备运行状态

下面以经典的生产者和消费者问题来了解生产者线程Producer和消费者线程Consumer,同步一个同享对象Shop,利用wait和notify方法来通信的代码:

Puducer.java 生产者线程定义

public class Producer implements Runnable{

Shop shop;

public Producer(Shop shop) {

// TODO Auto-generated constructor stub

this.shop=shop;

new Thread(this,"生产者线程").start();

}

@Override

public void run() {

// TODO Auto-generated method stub

int i=0;

while(true){

shop.put(i++);

}

}

}

Consumer.java 消费者线程定义

public class Consumer implements Runnable{

Shop shop;

public Consumer(Shop shop) {

// TODO Auto-generated constructor stub

this.shop=shop;

new Thread(this,"消费者线程").start();

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

shop.get();

}

}

}

共享对象Shop.java定义

public class Shop {

int no;

boolean hasData=false; //false表示无数据 true有数据

synchronized int get(){ //消费产品

if(hasData==false){

try {

wait();//消费者线程暂停

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("消费:"+no);

hasData=false;//消费完了.通知生产

notify();

return no;

}

synchronized void put(int no){ //放产品

if(hasData==true){

try {

wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

System.out.println("生产:"+no);

hasData=true;

this.no=no;

notify();

}

}

测试类PC.java

public class PC {

public static void main(String[] args) {

Shop shop=new Shop();

new Producer(shop);

new Consumer(shop);

}

}

以上生产消费者问题很好的说明了wait和notify方法的用途,其他方法的变种例如wait(long timeout)就好理解了,如果超过指定时间等待的线程也会进入等待集合而不用再等待。

Object中有哪些公共方法及作用的更多相关文章

  1. Object中有哪些公用方法?

    clone()方法 实现对象的浅复制,只有实现了Cloneable接口才能调用该方法. toString()方法 返回该对象的字符串表示. equals()方法: 在Object中与“==”的定义是一 ...

  2. java Object类的公共方法

    1.HashCode();      2. wait();  3. notify(); 4.equals(); 5.getClass(); 6.toString(); 7.clone(); 8.fin ...

  3. Object中有哪些方法及其作用

    你知道Object中有哪些方法及其作用吗? 一.引言 二.Object方法详解 1.1.registerNatives() 1.2.getClass() 1.2.1.反射三种方式: 1.3.hashC ...

  4. 你知道Object中有哪些方法及其作用吗?

    一.引言二.Object方法详解1.1.registerNatives()1.2.getClass()1.2.1.反射三种方式:1.3.hashCode()1.4.equals()1.4.clone( ...

  5. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  6. Object中有哪些方法?

    有一种遗憾就是,每天都见到你,但是却不关注你!等到面试的时候才后悔莫及. Object类中有9大public方法: equals:判断两个对象"相等" hashCode:获取对象的 ...

  7. java基本类型和包装类型的区别以及object的公共方法

    Java的类型分为两部分,一个是基本类型(primitive),如int.double等八种基本数据类型: 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节 ...

  8. J2EE项目开发中常用到的公共方法

    在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...

  9. java克隆对象clone()的使用方法和作用

    转自:997.html">http://www.okrs.cn/blog/news/?997.html 内容摘要 若需改动一个对象,同一时候不想改变调用者的对象.就要制作该对象的一个本 ...

随机推荐

  1. 16.swoole学习笔记--异步事件

    <?php //异步事件 $fp=stream_socket_client(); fwrite($fp,"GET / HTTP/1.1\r\nHost:www.qq.com\r\n\r ...

  2. 女神说不能每张照片P的一样,所以朋友圈开三天可见,用Python一步解决

    大家好,我是小三十三,一个刚恰完午饭,正在用刷网页浪费生命的蒟蒻... 一堆堆无聊八卦信息的网页内容慢慢使我的双眼模糊,一个哈欠打出了三斤老泪,就在此时我看到了一张图片: ! 是谁!是谁把我女朋友的照 ...

  3. 134-PHP子类重写父类方法,并调用父类方法

    <?php class father{ //定义father类 public function method(){ //定义方法 echo '<br />father method' ...

  4. HDU 4893 2014多校三 线段树

    给定一个初始都为0的序列,有三种操作,前两种比较正常,一个是对某个位置的数add k,另一个是query区间和.然后比较麻烦的是第三个操作,把某个区间里面的每个值改成离它最近的Fibonacci数,如 ...

  5. spring 动态bean注册

    1. import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory. ...

  6. vue.js实现自定义输入分页

    效果如下: html: <input type="text" value="1" v-model="page.page_my_selected& ...

  7. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  8. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring体系结构详解

    Spring 框架采用分层架构,根据不同的功能被划分成了多个模块,这些模块大体可分为 Data Access/Integration.Web.AOP.Aspects.Messaging.Instrum ...

  9. java基础——深拷贝和浅拷贝的区别

    浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝. 深拷贝:对基本数据类型进行值传递,对引用数据类型船舰一个新的对象,并复制内容,这是深拷贝.

  10. python单链表的基本操作思路

    单链表: 1.定义链表 class ListNode: # 定义节点 def __init__(self, x): self.val = x # 节点当前值 self.next = None # 指向 ...