java一致性
你說的問題屬性多線程編程,根據你的要求,解決方法不難,你同學的說法也基本正確。下面是解答:
在定義屬性 permit的添加 volatile關鍵字即可,示例
public class Login {
private volatile boolean permit;
}
如果不能解決這個問題,可能要涉及到多線程的其它問題。不過我想來想去,示例肯定能解決你的問題,因為你說的是緩存方面,且必須保證代碼邏輯不能有誤。
『貳』 java怎麼實現讀寫分離 數據一致性
讀寫分離一般用在資料庫和緩存的架構設計方面。讀庫只負責返回查詢結果,寫庫只負責更新和增加,然後兩個庫實時同步。一般系統的讀壓力比寫壓力大的多,這樣可以設計多個讀庫分擔查詢的壓力。
『叄』 java 程序中怎麼保證多線程的運行安全
2.1.讀一致性
Java 中針對上述「讀不安全」的問題提供了關鍵字 volatile 來解決問題,被 volatile 修飾的成員變數,在內容發生更改的時候,會通知所有線程去主內存更新最新的值,這樣就解決了讀不安全的問題,實現了讀一致性。
但是,讀一致性是無法解決寫一致性的,雖然能夠使得每個線程都能及時獲取到最新的值,但是1.1中的寫一致性問題還是會存在。
既然如此,Java 為啥還要提供 volatile 關鍵字呢?這並非多餘的存在,在某些場景下只需要讀一致性的話,這個關鍵字就能夠滿足需求而且性能相對還不錯,因為其他的能夠保證「讀寫」都一直的辦法,多多少少存在一些犧牲。
2.2.寫一致性
Java 提供了三種方式來保證讀寫一致性,分別是互斥鎖、自旋鎖、線程隔離。
2.2.1.互斥鎖
互斥鎖只是一個鎖概念,在其他場景也叫做獨占鎖、悲觀鎖等,其實就是一個意思。它是指線程之間是互斥的,某一個線程獲取了某個資源的鎖,那麼其他線程就只能睡眠等待。
在 Java 中互斥鎖的實現一般叫做同步線程鎖,關鍵字 synchronized,它鎖住的范圍是它修飾的作用域,鎖住的對象是:當前對象(對象鎖)或類的全部對象(類鎖)——鎖釋放前,其他線程必將阻塞,保證鎖住范圍內的操作是原子性的,而且讀取的數據不存在一致性問題。
對象鎖:當它修飾方法、代碼塊時,將會鎖住當前對象
類鎖:修飾類、靜態方法時,則是鎖住類的所有對象
注意:鎖住的永遠是對象,鎖住的范圍永遠是 synchronized 關鍵字後面的花括弧劃定的代碼域。
2.2.2.自旋鎖
自旋鎖也只是一個鎖概念,在其他場景也叫做樂觀鎖等。
自旋鎖本質上是不加鎖,而是通過對比舊數據來決定是否更新:
『肆』 一致性哈希 java實現 怎麼映射到圓環上
一致性哈希提出了在動態變化的Cache環境中,哈希演算法應該滿足的4個適應條件:單調性是指如果已經有一些內容通過哈希分派到了相應的緩沖中,又有新的緩沖區加入到系統中,那麼哈希的結果應能夠保證原有已分配的內容可以被映射到新的緩沖區中去,而不會被映射到舊的緩沖集合中的其他緩沖區。(這段翻譯信息有負面價值的,當緩沖區大小變化時一致性哈希(Consistenthashing)盡量保護已分配的內容不會被重新映射到新緩沖區。)簡單的哈希演算法往往不能滿足單調性的要求,如最簡單的線性哈希:x→ax+bmod(P)在上式中,P表示全部緩沖的大小。不難看出,當緩沖大小發生變化時(從P1到P2),原來所有的哈希結果均會發生變化,從而不滿足單調性的要求。哈希結果的變化意味著當緩沖空間發生變化時,所有的映射關系需要在系統內全部更新。而在P2P系統內,緩沖的變化等價於Peer加入或退出系統,這一情況在P2P系統中會頻繁發生,因此會帶來極大計算和傳輸負荷。單調性就是要求哈希演算法能夠應對這種情況。負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩沖區中,那麼對於一個特定的緩沖區而言,也可能被不同的用戶映射為不同的內容。與分散性一樣,這種情況也是應當避免的,因此好的哈希演算法應能夠盡量降低緩沖的負荷。從表面上看,一致性哈希針對的是分布式緩沖的問題,但是如果將緩沖看作P2P系統中的Peer,將映射的內容看作各種共享的資源(數據,文件,媒體流等),就會發現兩者實際上是在描述同一問題。路由演算法在一致性哈希演算法中,每個節點(對應P2P系統中的Peer)都有隨機分配的ID。在將內容映射到節點時,使用內容的關鍵字和節點的ID進行一致性哈希運算並獲得鍵值。一致性哈希要求鍵值和節點ID處於同一值域。最簡單的鍵值和ID可以是一維的,比如從0000到9999的整數集合。根據鍵值存儲內容時,內容將被存儲到具有與其鍵值最接近的ID的節點上。例如鍵值為1001的內容,系統中有ID為1000,1010,1100的節點,該內容將被映射到1000節點。為了構建查詢所需的路由,一致性哈希要求每個節點存儲其上行節點(ID值大於自身的節點中最小的)和下行節點(ID值小於自身的節點中最大的)的位置信息(IP地址)。當節點需要查找內容時,就可以根據內容的鍵值決定向上行或下行節點發起查詢請求。收到查詢請求的節點如果發現自己擁有被請求的目標,可以直接向發起查詢請求的節點返回確認;如果發現不屬於自身的范圍,可以轉發請求到自己的上行/下行節點。為了維護上述路由信息,在節點加入/退出系統時,相鄰的節點必須及時更新路由信息。這就要求節點不僅存儲直接相連的下行節點位置信息,還要知道一定深度(n跳)的間接下行節點信息,並且動態地維護節點列表。當節點退出系統時,它的上行節點將嘗試直接連接到最近的下行節點,連接成功後,從新的下行節點獲得下行節點列表並更新自身的節點列表。同樣的,當新的節點加入到系統中時,首先根據自身的ID找到下行節點並獲得下行節點列表,然後要求上行節點修改其下行節點列表,這樣就恢復了路由關系。
『伍』 java編譯器與java運行器版本一致性問題
你如果想向下兼容,可以在javac或java命令後加上你代碼實際的版本,比如-1.1
『陸』 java中怎麼控制事務的一致性
Java中為了控制事務的一致性,會使用插入回滾點、callback方法,保證數據不被篡改,示例如下:
public String delete(String id) {
String ID = id;
db = new getConnection();
Connection con = db.getConnection();
try {
con.setAutoCommit(false);
db.executeUpdate("delete from helloworld where ID=" + ID); //更新操作1
db.executeUpdate("delete from helloworld _book where ID=" + ID); //更新操作2
db.executeUpdate("delete from helloworld_user where ID=" + ID); //更新操作3
con.commit();//提交JDBC事務
con.setAutoCommit(true);
db.close();
return 「success」;
}
catch (Exception e) {
con.rollBack();//回滾JDBC事務
e.printStackTrace();
db.close();
return 「fail」;
}
}
『柒』 Java中不用事務,如何保證數據一致性
很難很麻煩,也不是不可以
如果只是對於單表不可重復數據來說,可以設置資料庫表的唯一屬性來保證
對於多表操作或多數據源操作,只能在業務邏輯中自定義一個寫入資料庫操作的開關,當業務邏輯都處理完時,在最短時間內將數據同步到資料庫。並且在同步完成後,再次查詢結果進行數據一致性和正確性驗證操作