大家在学习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. 八十八、SAP中ALV事件之二,事件的定义和事件子例程

    一.我们来到SE37,找到REUSE_ALV_EVENTS_GET相关的定义 二.我们需要用到下面这3个事件 三.我们添加一个第五步,并把显示ALV座位第六步.在第五步中定义三个事件 四.在末尾,添加 ...

  2. C# SqlBulkCopy 大量数据导入到数据库

    之前写了一篇C# 直接使用sql语句对数据库操作 (cmd.ExecuteNonQuery)的文章 这是针对数据量不大的操作,换句话说,效率太低,所以在此介绍一个效率高的.能大批量导入到数据库的方法 ...

  3. OleDbCommand 的用法

    OleDbCommand 的用法 OleDbConnection con=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; dat ...

  4. Java中的super关键字和this关键字作用介绍

    一.super关键字的作用 1.子类在构造方法中显示调用父类构造方法 super可以在子类的构造方法中显示调用父类的构造方法:并且这行代码必须出现在子类构造方法的第一行.原因:因为父类构造方法没有执行 ...

  5. 2019山东ACM省赛L题题解(FLOYD传递闭包的变形)

    本题地址 https://cn.vjudge.net/contest/302014#problem/L Median Time Limit: 1 Second      Memory Limit: 6 ...

  6. Mac修改用户名后程序配置和文件都找不到了?

    小编今天手残,修改mac 的用户名,幸亏文件没丢失,要不然配置程序估计至少要花费周末的两天时间了.. 所幸的是,各种Google,终于找回了原用户名下的所有配置. 接下来,讲讲小编如何入坑又如何脱坑的 ...

  7. CGridCtrl显示子控件 及事件

    m_Grid.SetCellType(row, , RUNTIME_CLASS(CGridCell)); m_Grid.SetItemText(row, , _T(")); m_Grid.S ...

  8. 2019 年 Google 编程之夏活动报告

    2019 年 Google 编程之夏活动报告 主要介绍了 GSoC 2019 活动的几个课题并讲述了整个活动的组织过程 Google 编程之夏活动不仅仅是一个夏日的实习项目,对于组织和一些社区的成员来 ...

  9. LIS是什么?【质量控制】

    继续[LIS是什么?]中提到的[质量控制]. Ⅱ.质量控制要求非常专业,现在只说一说个人理解,以下仅为LIS检验中部分理解,实际上实验室质量控制还包含的报告时效,实验室温度.湿度等等一系列内容,是一个 ...

  10. CCCC 红色警报

    题意: 战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个 ...