標籤:stack his rgs nal span cond out tar bsp
轉自:http://www.tuicool.com/articles/AraaQbZ
論integer是地址傳遞還是值傳遞
Integer 作為傳參的時候是地址傳遞 , 可以參考如下例子,在程式剛啟動的時候把 Integer 的index 對象鎖住 ,並且調用了 wait方法,釋放了鎖的資源,等待notify,最後過了5秒鐘,等待testObject 調用notify 方法就繼續執行了。大家都知道鎖的對象和釋放的對象必須是同一個,否則會拋出 java.lang.IllegalMonitorStateException 。由此可以證明 Integer作為參數傳遞的時候是地址傳遞,而非值傳遞。
public class IntegerSyn { public static void main(String[] args) throws InterruptedException { Integer index = 0; TestObject a = new TestObject(index); synchronized (index) { new Thread(a).start(); index.wait(); } System.out.println("end"); }}class TestObject implements Runnable { private Integer index; public TestObject(Integer index){ this.index = index; } public void run() { try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (index) { index.notify(); } }}
那就會有人問了,為什麼執行如下代碼的時候兩次的輸出結果是一樣的?
public static void main(String[] args) throws InterruptedException { Integer index = 0; System.out.println(index); test(index); System.out.println(index); } public static void test(Integer index){ index++; }
理由很簡單,可以看到 Integer 類中final的value欄位,說明一旦integer類建立之後他的值就不能被修改,在 index++ 的時候Integer是建立一個新的類,所以這個第二次輸出的時候結果是一樣的!
private final int value;
【轉】【java】論integer是地址傳遞還是值傳遞