一、問:都做過哪些項目,用了什么?
答:用Servlet和Hibernate做過一個簡單的登錄界面;用SpringMVC Mybatis Redis做過一個寵物商店的系統;
二、問:那你用過Hibernage和Mybatis,那你從你具體使用中感覺到二者的不同是什么?
答:兩者都能屏蔽jdbc api的繁瑣操作,但是呢,Hibernate是全自動ORM映射,而Mybatis是半自動的,Hibernate會將所有的SQL操作寫好封裝 ,而Mybatis則可以自己使用動態SQL進行靈活書寫MYSQL代碼。(忘記說Hibernate相對較快;Mybatis相對較慢了);
三、問:你說你做過寵物商店的系統,那如果有庫存問題,減庫存是在什么時候?添加到購物車之后還是結算的時候?
答:結算的時候,因為添加到 購物車並沒有真正將庫存減少,如果在添加到購物車 時候就減庫存,那其他用戶購買的時候就會出現庫存不足現象,可是實際上庫存仍然有。
四、問:那如果庫存有10件,一個人添加到購物車9件,還有一件,另外一個人也要買9件,怎么控制才能不出問題?
答:可以使用樂觀鎖機制,在數據庫添加一個version字段,通過每次取出貨物使用貨物后將該字段加一,當存入時如果存入version的數字大於數據庫中的version才能插入。
五、問:那既然說到了樂觀鎖,你說一下樂觀鎖和悲觀鎖的區別
答:悲觀鎖悲觀的認為一個資源同時會有許多線程來調用,是將一個資源只分配給一個線程,當一個線程占有該資源的時候,會給該資源上互斥鎖,其他的線程就無法在訪問該資源,類似於我們java api用過的sychonized;
樂觀鎖就是樂觀的認為一次只有一個線程來調用資源,具體用法我上面說過了。
問:樂觀鎖只有這一種實現?
答:我好像就見過這一種,沒學過第二種。(實際上第二種是CAS機制進行樂觀鎖實現,原理如下:CAS是樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。
CAS 操作中包含三個操作數 —— 需要讀寫的內存位置(V)、進行比較的預期原值(A)和擬寫入的新值(B)。如果內存位置V的值與預期原值A相匹配,那么處理器會自動將該位置值更新為新值B。否則處理器不做任何操作。無論哪種情況,它都會在 CAS 指令之前返回該位置的值。(在 CAS 的一些特殊情況下將僅返回 CAS 是否成功,而不提取當前值。)CAS 有效地說明了“ 我認為位置 V 應該包含值 A;如果包含該值,則將 B 放到這個位置;否則,不要更改該位置,只告訴我這個位置現在的值即可。 ”這其實和樂觀鎖的沖突檢查+數據更新的原理是一樣的。JDK的一些無鎖的並發容器是基於CAS做的(如:ConcurrentHashMap))https://blog.csdn.net/qq_24489717/article/details/78556172
樂觀鎖CAS自旋缺點:
① 樂觀鎖只能保證一個共享變量的原子操作。如上例子,自旋過程中只能保證value變量的原子性,這時如果多一個或幾個變量,樂觀鎖將變得力不從心,但互斥鎖能輕易解決,不管對象數量多少及對象顆粒度大小。
② 長時間自旋可能導致開銷大。假如CAS長時間不成功而一直自旋,會給CPU帶來很大的開銷。
③ ABA問題。CAS的核心思想是通過比對內存值與預期值是否一樣而判斷內存值是否被改過,但這個判斷邏輯不嚴謹,假如內存值原來是A,后來被一條線程改為B,最后又被改成了A,則CAS認為此內存值並沒有發生改變,但實際上是有被其他線程改過的,這種情況對依賴過程值的情景的運算結果影響很大。解決的思路是引入版本號,每次變量更新都把版本號加一。
六、問:好吧,那你學過數據結構吧?說一下什么是二叉樹吧
答:二叉樹是最多有兩個分支節點的樹,左節點叫左子樹,右節點叫右子樹。
問:那你說一下怎么實現二叉樹倒置?
答:不好意思,我不太會這個,我會二叉樹的先序后序中序遍歷。。。。
(二叉樹倒置:https://www.cnblogs.com/grandyang/p/5172838.html)
七、問:多線程學過吧?你說一下wait和sleep的區別?
答:wait是object類下的方法,sleep是Thread類下的方法,wait線程后,放棄鎖資源,只有notify和notifyall方法可以將其喚醒;sleep可以將其中設置參數,參數為毫秒時間,到時間后會自動喚醒。
問:那有沒有什么方法可以打斷sleep方法?
答;我記得有個interrupt的方法可以打斷sleep方法;
問:那這個interrupt放在什么位置來打斷這個sleep方法?
答:不怎么用過,只是聽說過。https://www.cnblogs.com/carmanloneliness/p/3516405.html
八、問:想一下ip地址用什么類型存比較好?
答:使用String。
問:還有更好的么?
答:用hashmap,因為一個域名當做鍵,用ip當值,可以一一對應容易查找;
問:我只想存ip地址呢?
答:如果只是存儲的話可以使用Linkedlist,因為使用了鏈式結構,可以快速存取。
問:還有么?
答:想不出來了。。。
問:int多少字節?long多少字節?
答:int32位,4字節;long 64位,8字節;
問:ip地址多少位?
答:32位
問:分幾段
答:4段
問:那你想一下那什么存?
答:是int么?但是里面的冒號怎么辦?
問:冒號有意義么?
答:沒有。。
問:那你再想想怎么用int存一個ip網段?
答:用最后一段從255-0,之后轉化成二進制
問:你見過ip地址最后是0和255的么?
答:沒有。。。
問:為啥沒見過?
答:因為。。。