java判斷有沒有修改,java字節碼判斷對象應用是否被修改

原創

1 背景

在學習并發的時候看到了ConcurrentLinkedQueue隊列的源碼,剛開始的時候是看網上的帖子,然后就到IDE里邊看源碼,發現offer()方法在1.7版的時候有過修改。

bcf6db9c9f3c

樓主的問題不是整個方法,而是其中的一截代碼“(t != (t = tail))”,有點發暈,t是個引用,而修改引用的時候不是都修改嗎?怎么還會判斷是否相等呢 ?

2 為了解決這個問題,寫個測試方法。如下:

publicclassReferTest {

publicstaticvoidmain(String[] args) {

ReferTest a =newReferTest();

booleanb= (a != (a =newReferTest()));

}

}

答案:b= true。

說明 a != a,這個就更暈了。在度娘和谷歌上都查不到什么有用的資料,關鍵是不好描述,引用不等于引用?

再往下樓主就猜測了,引用的東西一般都和棧有關,就想看看方法的字節碼指令。使用javap命令解釋了方法的字節碼指令。

bcf6db9c9f3c

有用的方法看main方法的指令,樓主沒有接觸過字節碼指令,所以找個指令集學學了一下。在這里解釋下指令的意義,在這里記錄一下。

bcf6db9c9f3c

注意引用1是在命令8的時候加載的a的值,而引用2是新的引用,為什么出現這種情況,原因是if_acmpeq指令是比較兩個棧頂的值是否一樣。

所以在"!="號的兩端的值需要加載到棧頂,而右邊是一個表達式,所以先加載左邊的值到棧頂然后再去執行右邊的表達式,表達式的結果放入棧頂,這個時候a引用1先加載,而表達式的結果會改變a變量的值,但是不會改變棧頂的值。

所以就出現不一致的情況了。

同理,通過這個方式可以判斷對應的引用是否改變了。

ps:跟同事講解的時候,又分析了 i=i++ 、 i=++i、i= i+1的字節碼,發現 i++ 使用的是iinc的命令,而i=i+1使用的是iadd指令。

bcf6db9c9f3c

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php接口 含義,php晉級必備:一文讀懂php接口特點和使用!

PHP接口與類是什么關系?前面提到了php中抽象類和抽象方法,今天給大家談談php中接口技術。在PHP中每個類只能繼承一個父類,如果聲明的新類繼承了抽象類實現了以后,這個新類就不能有其它的父類了。但是在實際中需要繼承多個類實現功…

php獲取不重復的隨機數字,php如何生成不重復的隨機數字

【摘要】PHP即“超文本預處理器”,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。下面是php如何生成不重復的隨機數字,讓我們…

java 素數乘積,求助2424379123 = 兩個素數的乘積,求這兩個素數?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓import java.util.ArrayList;import java.util.Date;public class Test {static ArrayList list new ArrayList();/*** 初始化素數表* return*/public static ArrayList initArrayList() {list.add(2);list.add(3);list.add(5);li…

php header什么意思,php header是什么意思

header函數在PHP中是發送一些頭部信息的, 我們可以直接使用它來做301跳轉等,下面我來總結關于header函數用法與一些常用見問題解決方法。發送一個原始 HTTP 標頭[Http Header]到客戶端。標頭 (header) 是服務器以 HTTP 協義傳 HTML 資料到瀏覽器前所送出的字串&…

matlab dct稀疏系數,Matlab DCT詳解

轉自:http://blog.csdn.net/ahafg/article/details/48808443DCT變換DCT又稱離散余弦變換,是一種塊變換方式,只使用余弦函數來表達信號,與傅里葉變換緊密相關。常用于圖像數據的壓縮,通過將圖像分成大小相等(一般為8*8)…

matlab驗潮站,驗潮站的作用是什么

驗潮站的作用是什么?驗潮站的建成投入使用,可實時觀測沿海潮汐等觀測要素,為潮汐預報、赤潮的發生、風暴潮預警報、海嘯預警及海平面變化提供基礎數據保障以及預測,同時為科學開發海洋提供有力的支持,為海洋經濟健康發展保駕護航…

答題闖關php,成語答題闖關紅包流量主小程序源碼

修復紅包頁面提現提示文字得疊的問題限制過關紅包每天領取個數左側影響美觀的小程序鏈接的文字去掉了增加版本號沒有問題的可以暫不更新此版本修復前一版本客服提現沒有授權的問題管理后臺增加主動推送客服消息(紅包)給用戶的功能,喚醒用戶使用自定義分享的配置增加…

php是音頻嗎,只要是用PHP和JS發布的HTML5是否可以播放音頻?

我正在嘗試創建一個可以上傳播客的頁面。我想擁有“發布”或“取消發布”的能力。我讓每個播客添加到一個數據庫中,包含它的信息和發布列,可以是真是假。目前我使用以下代碼PHP:if(isPublished()){header(Cache-Control: max-age100000);header(Content-Transfer-Encoding: bin…

php收購,php中文網收購全國用戶量最大的phpstudy集成開發環境揭秘

phpstudy介紹2008年第一個版本誕生,至今已有9年,該程序包集成最新的ApachePHPMySQLphpMyAdminZendOptimizer,一次性安裝,無須配置即可使用,是非常方便、好用的PHP調試環境.該程序不僅包括PHP調試環境,還包括了開發工具、開發手冊等.總之學習PHP只需一個包…

復雜電網三相短路計算的matlab仿真,復雜電網三相短路計算的MATLAB仿真電力系統分析課設報告 - 圖文...

XG?XT**35.3100??0.11003000.856100???0.05100120發電廠B:XG?XT**17.65100 ??0.051003000.853100???0.025100120發電廠H:XG?XT**17.65100??0.051003000.8512100???0.1100120變電站C:3.6100*XT???0.03100120 線路&#x…

php 將多個數組 相同的鍵重組,PHP – 合并兩個類似于array_combine但具有重復鍵的數組...

你可以使用array_map:$arrKeys array(str, str, otherStr);$arrVals array(1.22, 1.99, 5.17);function foo($key, $val) {return array($key>$val);}$arrResult array_map(foo, $arrKeys, $arrVals);print_r($arrResult);Array([0] > Array([str] > 1.…

C php反序列化,php反序列化漏洞 - anansec的個人空間 - OSCHINA - 中文開源技術交流社區...

反序列化本身是沒有漏洞的,但是當反序列化和一些魔術方法結合使用時就可能會產生安全風險。常用的魔術方法__wakeup反序列化漏洞示例(__wekeup)class A{var $test "demo";function __wakeup(){eval($this->test);}}$b new A();$c serialize($b);$a …

oracle lob值是什么,關于Oracle數據庫LOB大字段總結

概述在ORACLE數據庫中,DBA_OBJECTS視圖中OBJECT_TYPE為LOB的對象是什么東西呢?其實OBJECT_TYPE為LOB就是大對象(LOB),它指那些用來存儲大量數據的數據庫字段。Oracle 11gR2 文檔:http://download.oracle.com/docs/cd/E11882_01/Ap…

php 統計目錄大小,PHP 統計目錄大小

例01:function dirsize($dir){$size0;//打開目錄$ddopendir($dir); //--opendir("")打開一個目錄,返回此目錄的資源句柄readdir($dd); //--通過讀兩次,來跳過特殊目錄"."、".."readdir($dd);//遍歷目錄累加大小while($f …

oracle03206,ORACLE數據庫創建表空間ORA-03206報錯的解決方案

Oracle的數據文件大小是有限制的,今天在創建表空間的時候就遇到了問題,限制很簡單,作為DBA必須要了解。測試環境:操作系統:Win7 64位專業版數據庫版本:64位Oracle10.2.0.4DB_NAME:hoegh表空間名…

oracle sql server的區別,oracle與sqlserver的十大區別

http://blog.csdn.net/it_fengli/article/details/8213839 --sql server 與 oracle的區別: --DBMS 數據庫管理系統 --1.數據類型不同。 --sql server 的數據類型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima…

Oracle19C的dbhome,Windows server 安裝Oracle19c (WINDOWS.X64_193000_db_home.zip) 過程碰到的問題總結...

Oracle19c的下載地址:鏈接: https://pan.baidu.com/s/1snqyViOAoeffAztPes_Tvw提取碼: 9kb6Oracle19c的安裝過程:解壓縮安裝包:解壓結果 以管理員方式運行setup開始安裝 一直默認走到安裝完成即可創建用戶cmd執行sqlplus命令,輸入…

oracle01537,ORACLE REUSE實驗

一、查看數據文件位置SQL> show user;User is "SYS"SQL> desc dba_data_files;Name Type Nullable Default Comments--------------- ------------- -------- ------- ---------------------------------------------------FILE_NAME …

oracle數據庫配置管理,Oracle配置管理

一、連接Oracle1、Oracle建立連接的過程無論是通過sqlplus命令連接還是第三方工具遠程連接到Oracle,都需要建立客戶端與服務端之間的連接。Oracle Net Service組件就是為了用于建立連接的,這個組件在安裝Oracle時已經安裝。1)在服務器端有一個listener監…

oracle 插入一個語句,oracle如何通過1條語句插入多個值 oracle通過1條語句插入多個值方法...

本篇文章小編給大家分享一下oracle通過1條語句插入多個值方法,小編覺得挺不錯的,現在分享給大家供大家參考,有需要的小伙伴們可以來看看。在實踐過程中遇到一個問題,我想往數據庫插入多條數據時,使用了如下語句&#x…