Object中有哪些公共方法及作用
大家在學習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)就好理解了,如果超過指定時間等待的執行緒也會進入等待集合而不用再等待。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912514/viewspace-2677607/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript中有用的Array和Object方法JavaScriptObject
- python集合中有哪些方法Python
- volatile關鍵字在併發中有哪些作用?
- 大資料在製造業中有哪些作用大資料
- 水舞燈光秀在城市建設中有哪些作用呢
- 夜遊專案在旅遊景區的發展中有哪些作用
- Linux系統中有哪些目錄結構?分別有什麼作用?Linux
- python中有哪些包Python
- Innodb中有哪些鎖?
- 錫膏在SMT中有什麼作用?
- Chainlink在元宇宙中有什麼作用?AI元宇宙
- Java transient 的作用及使用方法Java
- js中有哪些書寫位置JS
- java反射中有哪些APIJava反射API
- java中有哪些基本註解Java
- IP地址在網頁抓取中有何作用網頁
- 介面返回[object,Object]解決方法Object
- 建立公共方法
- Object.is()方法Object
- Javascrip—理解Object.defineProperty的作用(15)JavaObject
- Java常見知識點彙總(⑥)——Object有哪些公用方法?JavaObject
- Android (VTS) 的概念、作用及測試方法Android
- js 中有哪些拷貝的方式JS
- Tomcat的配置檔案中有哪些關鍵的配置項,它們分別有什麼作用?Tomcat
- 公共映象有哪些型別型別
- Object方法與ReflectObject
- Object.assign()方法Object
- 在直播軟體搭建中有哪些可以實現瀑布流的的方法?
- .NET 8.0 中有哪些新的變化?
- php中有哪些迴圈控制語句PHP
- 你知道SQLite中有哪些約束嗎?SQLite
- 分散式系統中有哪些快取?分散式快取
- SSL證書在資料安全中有什麼作用
- 作用域及作用域鏈
- JS中的雙向資料繫結及Object.defineProperty方法JSObject
- 011 Object.defineProperty 方法Object
- Linux中有哪些好用的虛擬機器?Linux虛擬機
- Java 20中有哪些新功能? - symflowerJava