日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java框内的值怎么同步_java并发编程使用锁进行数据同步操作一

發布時間:2024/10/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java框内的值怎么同步_java并发编程使用锁进行数据同步操作一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目中總是出現招標項目超投的情況,最開始總是覺得應該使用框架Hibernate自帶的并發策略中的樂觀鎖(version)解決問題,參考了很多網上的資料,也參考了Hibernate的幫助文檔,由于對Hibernate樂觀鎖機制不了解,問題就一直沒有解決。

最近在看Java并發編程相關知識,了解了些許并發,線程,鎖的知識。想到了這個問題,曾經使用Synchroized關鍵字時總是苦于無法獲取同一個對象,導致解決方案無效。這次采用的方案是:創建了靜態的HashMap,初始化一定數量的對象(可結合服務器的性能來確認對象的數量),采用公平模式競爭鎖,在處理業務數據。package?com;

import?java.util.HashMap;

import?java.util.concurrent.locks.Lock;

import?java.util.concurrent.locks.ReentrantLock;

public?class?testMain?{

/**

*?test類

*?@param?args

*/

public?static?void?main(String[]?args)?{

//?TODO?Auto-generated?method?stub

testOut?testOut=new?testOut();

outPut?o?=new?outPut(testOut);

//模擬并發三個線程

new?Thread(o,"first").start();

new?Thread(o,"second").start();

new?Thread(o,"thread").start();

}

}

/**

*?線程類

*?@author?linyan

*

*/

class?outPut?implements?Runnable{

private?testOut?testOut;

public?outPut(testOut?t){

testOut=t;

}

@Override

public?void?run()?{

//?TODO?Auto-generated?method?stub

testOut.sysout(20);

}

}

/**

*?業務處理方法

*?@author?linyan

*

*/

class?testOut{

/**

*?創建靜態map

*?初始化map對象

*/

public?final?static?HashMap?map=new?HashMap();

static{

for(int?i=0;i<2;i++){

//初始化公平鎖,確保等待時間最久的線程獲得鎖

map.put(i,?new?ReentrantLock(true));

}

}

private?int?number=0;

public?void?sysout(int?i){

System.out.println(Thread.currentThread().getName()+":"+i);

//模擬同一個招標項目的標的編號來爭搶鎖

int?index=i%map.size();

try{

map.get(index).lock();

//TOOD??業務邏輯處理方法

number=number+i;

//輸出當前獲得線程的鎖及請求參數

System.out.println(Thread.currentThread().getName()+":"+index);

//獲得當前線程內查看到的活動線程數

System.out.println(Thread.currentThread().getName()+":"+Thread.currentThread().activeCount());

//輸出對應累加的數值

System.out.println(Thread.currentThread().getName()+"="+number);

}finally{

map.get(index).unlock();

}

}

public?int?getNumber()?{

return?number;

}

public?void?setNumber(int?number)?{

this.number?=?number;

}

}

對應的輸出結果:thread:20

first:20

first:0

first:4

first=20

second:20

thread:0

thread:3

thread=40

second:0

second:2

second=60

經過反復的測試,輸出的結果都和預期一致,故判定這一解決方案有效。將解決方案放到具體項目上實施,結果仍然出現了超投問題,經過問題定位發現,在業務邏輯處理中業務邏輯的事務分割范圍太寬,導致了數據不能立即入庫,同時Hibernate的查詢仍與緩存交互,不是實時查詢數據庫,導致繼續超投的情況。

事務范圍切割問題很好解決,但是對Hibernate查詢問題一直沒有解決,為了解決問題,采用了臨時方案:創建JDBC連接來實時查詢。最終以犧牲了部分性能為代價,解決這個問題,最近在研究一下Hibernate查詢方式,看是否能用Hibernate的實時查詢。

總結

以上是生活随笔為你收集整理的java框内的值怎么同步_java并发编程使用锁进行数据同步操作一的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。