1、一個幾千萬數據,發現數據查詢很慢,怎麼辦?
1、查看對應的查詢字段上是否建立索引,如果沒有建立索引的話,建立索引,再查看效果。
2、如果已經建立了索引的話,分析對應的sql語句是否存在問題,是否有走索引。
3、如果sql語句沒有問題,也走了索引的話,則考慮因為表的頻繁的增刪操作,導致表空間持續增大未得到釋放,此時需要釋放表空間,重建索引。
2、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法? stop()和suspend()方法為何不推薦使用?
實現線程有兩種方式:1.繼承Thread類,重寫run方法,在調用start方法。
實現Runnable接口,重寫run方法。在傳給Thread構造器,調用時調用Thread的start方法。
用synchronized關鍵字修飾同步方法 。
不使用stop(),是因為它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啟動線程。
3、sleep() 和 wait() 有什麼區別?
sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。 wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
閱讀更多 JAVA凌晨四點半 的文章