大家在学习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. 167-PHP 文本分割函数str_split(二)

    <?php $str='PHP is a very good programming language'; //定义一个字符串 $arr=explode(' ',$str,-3); //使用空格 ...

  2. (HN)AHOI2018 转盘

    题意: 有 \(n\) 个格子围成一圈,每个格子里有一个物品,每个物品的出现时间为 \(T_i\) .开始时选择一个格子为起点,每个单位时间可以向前走一格或不动,若当前格的物品已出现则将其标记.有 \ ...

  3. JavaScript获取当前日期前后7天的日期

    function fun_date(aa){ var date1 = new Date(), time1=date1.getFullYear()+"-"+(date1.getMon ...

  4. 22 ~ express ~ 内容评论实现

    1,使用 ajax 提交评论内容 给 api.js 2,数据库 contents 增加评论字段 3,后台路由 api.js 接收并完成存储 /** 增加评论(用户,内容,时间) */ router.p ...

  5. dmesg 显示开机信息。

    功能说明:显示开机信息. 语 法:dmesg [-cn][-s <缓冲区大小>] 补充说明:kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dme ...

  6. C++基础--随机数

    C/C++要产生随机数的方法一般是采用rand()函数核srand()函数来实现的. rand()函数返回的是一个伪随机数,这个函数内部采用线性同余法来实现伪随机数,而这个伪随机数是在一定范围内可以看 ...

  7. 关于boostrap的TAB切换 ,如何获取?

    $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {    // 获取已激活的标签页的名称    var acti ...

  8. 下页小希学MVC5+EF6.2 学习记录二

    目的:1 学习mvc+ef 2  写下日记也是对自己的督促 从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端UI的部分. ASP.NET MVC抛 ...

  9. 调用servlet报The requested resource is not available.

    调用servlet的时候经常有这种报错,一般来说我直到现在遇到的情况大致有以下几类: 1.参数写错了 在新创建的servlet文件中有这么一行代码,“/LoginCheck”这个一定要和form表单中 ...

  10. C语言-字符类型

    C语言-字符类型 char不仅是一种整数,也是一种特殊的类型:字符(character). 常用单引号表示字符的字面量,如'a', '1'. 单引号''也是一个字符,printf和scanf里用的%c ...