當前位置:首頁 » 文件傳輸 » java並發重復訪問問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

java並發重復訪問問題

發布時間: 2023-02-06 13:50:06

㈠ java多線程並發問題怎麼解決

java多線程並發問題產生的主要原因是多個線程訪問一個實例,導致其中一個線程修改或刪除這個實例時,其他線程產生並發問題。

要解決這種並發問題有兩種方法:
(1)加上線程鎖synchronization
(2)還有個不是辦法的辦法:不用成員變數,用局部變數

㈡ 為什麼Java程序在並發的情況下資料庫會出現重復記錄

如果遇到這個問題了.有一個辦法可以實現你的要求.將讀取存儲過程的代碼塊加鎖.達到線程安全就OK了.

怎麼會呢?
每個對象都只有一個鎖標記,只有獲得鎖標記的進程才能執行裡面的代碼....

不是幾核的問題...CPU看似可以處理很多請求.其實一個時刻也只能處理一個請求.因為它的速度相當快.所以我們就覺得它是一次處理很多請求...

㈢ 關於JAVA編寫的WEB程序多次並發訪問資料庫的問題

有一個思路,你可以用ajax局部刷新數據,不刷新整個頁面,同時用緩存,例如第一個30秒的數據放入緩存,頁面從緩存里取數據,第二個30秒,你從資料庫取出數據後,寫個對象對比的方法,來比對新數據和第一個30秒存入緩存的數據,如果數據沒有改變,那頁面什麼操作也不用做,因為數據沒變化,刷新也沒意義,如果第二個30秒數據發生變化,那麼就刷新緩存為第二個30秒的數據,並且局部刷新頁面數據。資料庫的查詢是避免不了的,所以沒發減輕資料庫的壓力,只能是優化數據的顯示。就象我上邊提到的,如果前後2個30秒數據沒有變化,那麼就不要刷新頁面。

㈣ 為什麼Java程序在並發的情況下資料庫會出現重復記錄

這是一個高並發,多線程問題
如果數據粒度沒有設計到行級鎖,
比方說A這條記錄 是100,並發情況下兩個人拿到A記錄100 一個更新為70,一個更新為80
實際是拿走了50的量,但是因為是並發情況 導致數據不正確。所以這個地方是一個數據鎖的概念,至於為什麼會這樣,道理也很簡單,一個排隊做事情,一個並行做事情,能一樣嗎?

㈤ java中什麼是並發,如何解決

多個進程或線程同時(或著說在同一段時間內)訪問同一資源會產生並發問題。 銀行兩操作員同時操作同一賬戶就是典型的例子。比如A、B操作員同時讀取一餘額為1000元的賬戶,A操作員為該賬戶增加100元,B操作員同時為該賬戶減去
50元,A先提交,B後提交。 最後實際賬戶余額為1000-50=950元,但本該為 1000+100-50=1050。這就是典型的並發問題。
可以用鎖解決。
關於鎖我也不是太清楚,你可以研究一下.....

㈥ java程序員面試時被問到:如何在j2ee項目中處理高並發量訪問 該怎麼回答 請仔細看題干再回答

一般需從三點入手。

一、程序本身支持高並發。

簡單來說就是要優化我們的代碼。

1、避免使用錯誤的方式,盡量不用instanceof做條件判斷,不要將數組聲明為:public static final 。

2、使用java中效率高的類,比如盡量使用HashMap 和ArrayList ,除非必要,否則不推薦使用HashTable和Vector ,後者由於使用同步機制,而導致了性能的開銷。

3、盡量指定類的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String。為String類指定final防止了人們覆蓋length()方法。另外,如果指定一個類為final,則該類所有的方法都是final。Java編譯器會尋找機會內聯(inline)所有的final方法(這和具體的編譯器實現有關)。此舉能夠使性能平均提高50% 。

4、盡量重用對象,避免頻繁的使用new對象。對於整個應用只需要存在一個實例的類,我們可以使用單例模式。對於工具類可以使用靜態方法的方式訪問。

用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。clone()方法不會調用任何類構造函數。

在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實

例非常簡單。例如,

Java代碼收藏代碼
下面是Factory模式的一個典型實現:
(){
returnnewCredit();
}
改進後的代碼使用clone()方法,如下所示:
privatestaticCreditBaseCredit=newCredit();
(){
return(Credit)BaseCredit.clone();
}

上面的思路對於數組處理同樣很有用。

5、特別是String 對象的使用中,出現字元串連接情況時應用StringBuffer 代替。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。

6、StringBuffer 的使用:StringBuffer表示了可變的、可寫的字元串。

它有三個構造方法 :

StringBuffer();//默認分配16個字元的空間
StringBuffer(intsize);//分配size個字元的空間
StringBuffer(Stringstr);//分配16個字元+str.length()個字元空間

你可以通過StringBuffer的構造函數來設定它的初始化容量,這樣可以明顯地提升性能。這里提到的構造函數是StringBuffer(int length),length參數表示當前的StringBuffer能保持的字元數量。你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer對象創建之後設置它的容量。首先我們看看StringBuffer的預設行為,然 後再找出一條更好的提升性能的途徑。

StringBuffer在內部維護一個字元數組,當你使用預設的構造函數來創建StringBuffer對象的時候,因為沒有設置初始化字元長度,StringBuffer的容量被初始化為16個字元,也就是說預設容量就是16個字元。當StringBuffer達到最大容量 的時候,它會將自身容量增加到當前的2倍再加2,也就是(2*舊值+2)。如果你使用預設值,初始化之後接著往裡面追 加字元,在你追加到第16個字元的時候它會將容量增加到34(2*16+2),當追加到34個字元的時候就會將容量增加到 70(2*34+2)。無論何事只要StringBuffer到達它的最大容量它就不得不創建一個新的字元數組然後重新將舊字元和 新字元都拷貝一遍――這也太昂貴了點。所以總是給StringBuffer設置一個合理的初始化容量值是錯不了的,這樣會帶來 立竿見影的性能增益。

StringBuffer初始化過程的調整的作用由此可見一斑。所以,使用一個合適的容量值來初始化StringBuffer永遠都是一個最佳的建議。

7、盡量使用局部變數,調用方法時傳遞的參數以及在調用中創建的臨時變數都保存在棧(Stack)中,速度較快。其他變數,如靜態變數、實例變數等,都在堆(Heap)中創建,速度較慢。另外,依賴於具體的編譯器/JVM,局部變數還可能得到進一步優化。請參見《盡可能使用堆棧變數》。

8、不要重復初始化變數 默認情況下,調用類的構造函數時, Java會把變數初始化成確定的值:所有的對象被設置成null,整數變數(byte、short、int、long)設置成0,float和double變數設置成0.0,邏輯值設置成false。當一個類從另一個類派生時,這一點尤其應該注意,因為用new關鍵詞創建一個對象時,構造函數鏈中的所有構造函數都會被自動調用。

9、在JAVA + ORACLE 的應用系統開發中,java中內嵌的SQL語句盡量使用大寫的形式,以減輕ORACLE解析器的解析負擔。

10、Java 編程過程中,進行資料庫連接、I/O流操作時務必小心,在使用完畢後,即使關閉以釋放資源。因為對這些大對象的操作會造成系統大的開銷,稍有不慎,會導致嚴重的後果。

11、由於JVM的有其自身的GC機制,不需要程序開發者的過多考慮,從一定程度上減輕了開發者負擔,但同時也遺漏了隱患,過分的創建對象會消耗系統的大量內存,嚴重時會導致內存泄露,因此,保證過期對象的及時回收具有重要意義。JVM回收垃圾的條件是:對象不在被引用;然而,JVM的GC並非十分的機智,即使對象滿足了垃圾回收的條件也不一定會被立即回收。所以,建議我們在對象使用完畢,應手動置成null。

12、在使用同步機制時,應盡量使用方法同步代替代碼塊同步。

13、盡量減少對變數的重復計算

例如:
for(inti=0;i<list.size;i++){

}
應替換為:
for(inti=0,intlen=list.size();i<len;i++){

}

14、盡量採用lazy loading 的策略,即在需要的時候才開始創建。

例如:
Stringstr=「aaa」;
if(i==1){
list.add(str);
}
應替換為:
if(i==1){
Stringstr=「aaa」;
list.add(str);
}

15、慎用異常

異常對性能不利。拋出異常首先要創建一個新的對象。Throwable介面的構造函數調用名為fillInStackTrace()的本地(Native)方法,fillInStackTrace()方法檢查堆棧,收集調用跟蹤信息。只要有異常被拋出,VM就必須調整調用堆棧,因為在處理過程中創建了一個新的對象。 異常只能用於錯誤處理,不應該用來控製程序流程。

16、不要在循環中使用try...catch,應把其放置在最外層。

17、合理的使用Java類 java.util.Vector。

簡單地說,一個Vector就是一個java.lang.Object實例的數組。Vector與數組相似,它的元素可以通過整數形式的索引訪問。但是,Vector類型的對象在創建之後,對象的大小能夠根據元素的增加或者刪除而擴展、縮小。請考慮下面這個向Vector加入元素的例子:

Java代碼收藏代碼
Objectobj=newObject();
Vectorv=newVector(100000);
for(intI=0;
I<100000;I++){v.add(0,obj);}

㈦ java高並發,如何解決,什麼方式解決,高並發

首先,為防止高並發帶來的系統壓力,或者高並發帶來的系統處理異常,數據紊亂,可以以下幾方面考慮:1、加鎖,這里的加鎖不是指加java的多線程的鎖,是指加應用所和資料庫鎖,應用鎖這邊通常是使用redis的setnx來做,其次加資料庫鎖,因為代碼中加了應用所,所以資料庫不建議加悲觀鎖(排他鎖),一般加樂觀鎖(通過設置一個seq_no來解決),這兩個鎖一般能解決了,最後做合理的流控,丟棄一部分請求也是必不可少的