亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

關于Java多線程編程鎖優化的深入學習

2024-07-13 10:17:19
字體:
來源:轉載
供稿:網友

正文

并發環境下進行編程時,需要使用鎖機制來同步多線程間的操作,保證共享資源的互斥訪問。加鎖會帶來性能上的損壞,似乎是眾所周知的事情。然而,加鎖本身不會帶來多少的性能消耗,性能主要是在線程的獲取鎖的過程。如果只有一個線程競爭鎖,此時并不存在多線程競爭的情況,那么JVM會進行優化,那么這時加鎖帶來的性能消耗基本可以忽略。因此,規范加鎖的操作,優化鎖的使用方法,避免不必要的線程競爭,不僅可以提高程序性能,也能避免不規范加鎖可能造成線程死鎖問題,提高程序健壯性。下面闡述幾種鎖優化的思路。

一、盡量不要鎖住方法

在普通成員函數上加鎖時,線程獲得的是該方法所在對象的對象鎖。此時整個對象都會被鎖住。這也意味著,如果這個對象提供的多個同步方法是針對不同業務的,那么由于整個對象被鎖住,一個業務業務在處理時,其他不相關的業務線程也必須wait。下面的例子展示了這種情況:

LockMethod類包含兩個同步方法,分別在兩種業務處理中被調用:

public class LockMethod { public synchronized void busiA() {  for (int i = 0; i < 10000; i++) {   System.out.println(Thread.currentThread().getName() + "deal with bussiness A:"+i);  } } public synchronized void busiB() {  for (int i = 0; i < 10000; i++) {   System.out.println(Thread.currentThread().getName() + "deal with bussiness B:"+i);  } }}

BUSSA是線程類,用來處理A業務,調用的是LockMethod的busiA()方法:

public class BUSSB extends Thread { LockMethod lockMethod; void deal(LockMethod lockMethod){  this.lockMethod = lockMethod; } @Override public void run() {  super.run();  lockMethod.busiB(); }}

TestLockMethod類,使用線程BUSSA與BUSSB進行業務處理:

public class TestLockMethod extends Thread { public static void main(String[] args) {  LockMethod lockMethod = new LockMethod();  BUSSA bussa = new BUSSA();  BUSSB bussb = new BUSSB();  bussa.deal(lockMethod);  bussb.deal(lockMethod);  bussa.start();  bussb.start(); }}

運行程序,可以看到在線程bussa 執行的過程中,bussb是不能夠進入函數 busiB()的,因為此時lockMethod 的對象鎖被線程bussa獲取了。

二、縮小同步代碼塊,只鎖數據

有時候為了編程方便,有些人會synchnoized很大的一塊代碼,如果這個代碼塊中的某些操作與共享資源并不相關,那么應當把它們放到同步塊外部,避免長時間的持有鎖,造成其他線程一直處于等待狀態。尤其是一些循環操作、同步I/O操作。不止是在代碼的行數范圍上縮小同步塊,在執行邏輯上,也應該縮小同步塊,例如多加一些條件判斷,符合條件的再進行同步,而不是同步之后再進行條件判斷,盡量減少不必要的進入同步塊的邏輯。

三、鎖中盡量不要再包含鎖

這種情況經常發生,線程在得到了A鎖之后,在同步方法塊中調用了另外對象的同步方法,獲得了第二個鎖,這樣可能導致一個調用堆棧中有多把鎖的請求,多線程情況下可能會出現很復雜、難以分析的異常情況,導致死鎖的發生。下面的代碼顯示了這種情況:

synchronized(A){ synchronized(B){  } }

或是在同步塊中調用了同步方法:

synchronized(A){ B b = objArrayList.get(0); b.method(); //這是一個同步方法}

解決的辦法是跳出來加鎖,不要包含加鎖:

{  B b = null; synchronized(A){ b = objArrayList.get(0); } b.method();}

四、將鎖私有化,在內部管理鎖

把鎖作為一個私有的對象,外部不能拿到這個對象,更安全一些。對象可能被其他線程直接進行加鎖操作,此時線程便持有了該對象的對象鎖,例如下面這種情況:

class A { public void method1() { }}class B { public void method1() {  A a = new A();  synchronized (a) { //直接進行加鎖      a.method1();  } }}

這種使用方式下,對象a的對象鎖被外部所持有,讓這把鎖在外部多個地方被使用是比較危險的,對代碼的邏輯流程閱讀也造成困擾。一種更好的方式是在類的內部自己管理鎖,外部需要同步方案時,也是通過接口方式來提供同步操作:

class A { private Object lock = new Object(); public void method1() {  synchronized (lock){     } }}class B { public void method1() {  A a = new A();  a.method1(); }}

五、進行適當的鎖分解

考慮下面這段程序:

public class GameServer { public Map<String, List<Player>> tables = new HashMap<String, List<Player>>(); public void join(Player player, Table table) { if (player.getAccountBalance() > table.getLimit()) {  synchronized (tables) {  List<Player> tablePlayers = tables.get(table.getId());  if (tablePlayers.size() < 9) {   tablePlayers.add(player);  }  } } } public void leave(Player player, Table table) {/*省略*/}  public void createTable() {/*省略*/}  public void destroyTable(Table table) {/*省略*/}}

在這個例子中,join方法只使用一個同步鎖,來獲取tables中的List<Player>對象,然后判斷玩家數量是不是小于9,如果是,就調增加一個玩家。當有成千上萬個List<Player>存在tables中時,對tables鎖的競爭將非常激烈。在這里,我們可以考慮進行鎖的分解:快速取出數據之后,對List<Player>對象進行加鎖,讓其他線程可快速競爭獲得tables對象鎖:

public class GameServer {    public Map < String,    List < Player >> tables = new HashMap < String,    List < Player >> ();    public void join(Player player, Table table) {        if (player.getAccountBalance() > table.getLimit()) {            List < Player > tablePlayers = null;            synchronized(tables) {                tablePlayers = tables.get(table.getId());            }            synchronized(tablePlayers) {                if (tablePlayers.size() < 9) {                    tablePlayers.add(player);                }            }        }    }    public void leave(Player player, Table table) {        /*省略*/    }    public void createTable() {        /*省略*/    }    public void destroyTable(Table table) {        /*省略*/    }}

 


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产日韩欧美在线99| 国产精品专区一| 国外视频精品毛片| 精品在线观看国产| 中文字幕亚洲一区在线观看| 日韩免费av片在线观看| 国产亚洲欧洲高清| 国产精品高潮在线| 亚洲欧美国产一本综合首页| 欧美高清在线视频观看不卡| 日韩精品黄色网| 久久99精品久久久久久琪琪| 久久99久久亚洲国产| 国产精品高潮在线| 91精品久久久久久久久久| 国产成人精品一区二区在线| 26uuu日韩精品一区二区| 国产欧美va欧美va香蕉在线| 国产精品久久久久久久久粉嫩av| 欧美三级免费观看| 日韩中文字幕在线看| 日韩美女激情视频| 久久久久久一区二区三区| 久久久久99精品久久久久| 亚洲国产一区二区三区四区| 国产亚洲精品久久久久久| 日韩亚洲第一页| 91精品91久久久久久| 亚洲成人久久久| 欧美夜福利tv在线| 精品亚洲一区二区三区在线播放| 日韩成人在线免费观看| 国产精品久久久久99| 九色成人免费视频| 国产亚洲一级高清| 亚洲最大的av网站| 亚洲精品乱码久久久久久金桔影视| 亚洲一区二区免费| 中文日韩电影网站| 81精品国产乱码久久久久久| 欧美激情一二三| 中文日韩在线观看| 九色精品美女在线| 中文字幕日韩av综合精品| 久久久久久有精品国产| 亚洲视频777| 国产精品1234| 亚洲另类激情图| 在线日韩精品视频| 国产91九色视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 精品女厕一区二区三区| 国产有码在线一区二区视频| 国产亚洲精品日韩| 亚洲97在线观看| 亚洲电影免费观看| 性日韩欧美在线视频| 久久伊人免费视频| 欧美一级大胆视频| 国产精品影片在线观看| 亚洲人在线观看| 欧美激情一级欧美精品| 日韩一区视频在线| 国产一区二区日韩| 欧美一级在线播放| 97精品欧美一区二区三区| 亚洲国产精品va在线观看黑人| 国产91在线播放九色快色| 精品人伦一区二区三区蜜桃网站| 日本午夜精品理论片a级appf发布| 7777kkkk成人观看| 日韩中文字幕在线播放| 热99久久精品| 中文字幕国产精品久久| 久久久久免费视频| 欧美激情第1页| 日韩电影在线观看中文字幕| 亚洲成人精品在线| 日本一欧美一欧美一亚洲视频| 久久精品国产欧美亚洲人人爽| 亚洲色图校园春色| 亚洲国产婷婷香蕉久久久久久| 亚洲成人a级网| 欧美伦理91i| 全亚洲最色的网站在线观看| 91沈先生作品| 久久久久久久一| 亚洲欧美日韩久久久久久| 日韩精品视频在线观看免费| 国产97在线亚洲| 97超碰蝌蚪网人人做人人爽| 久久亚洲精品国产亚洲老地址| 性欧美激情精品| 啪一啪鲁一鲁2019在线视频| 日韩在线播放av| 成人性生交大片免费看小说| 欧美大成色www永久网站婷| 免费97视频在线精品国自产拍| 日韩在线观看网址| 国产综合福利在线| 日韩精品免费在线观看| 亚洲电影av在线| 91在线视频九色| 国产精品美女视频网站| 亚洲自拍偷拍网址| 欧美成人中文字幕在线| 欧美亚洲成人免费| 国产精品视频一区国模私拍| 国产精品亚洲欧美导航| 国产精品网红直播| 欧美xxxwww| 2019国产精品自在线拍国产不卡| 亚洲国产精品成人va在线观看| 久久精品国产欧美亚洲人人爽| 欧美性xxxxx极品娇小| 久久亚洲综合国产精品99麻豆精品福利| 九九热这里只有精品6| 日韩av影片在线观看| 91在线观看免费观看| 亚洲第一色在线| 91久久精品国产91久久性色| 欧美理论电影网| 国产精品久久久久久中文字| 国产一区二区三区在线免费观看| 亚洲一区二区三| 国内精品久久久久久影视8| 欧美在线影院在线视频| 亚洲精品久久在线| 欧美天天综合色影久久精品| 欧美乱大交xxxxx另类电影| 97在线视频精品| 色综合天天综合网国产成人网| 国产国语videosex另类| 欧美最近摘花xxxx摘花| 最近更新的2019中文字幕| 亚洲国产成人一区| 欧美日韩亚洲精品一区二区三区| 亚洲精品成人av| 亚洲欧美激情另类校园| 国产mv免费观看入口亚洲| 91精品久久久久久| 国产日本欧美在线观看| 欧美视频在线观看免费网址| 91精品久久久久| 国产精品久久久久久一区二区| 国产一级揄自揄精品视频| 欧美日韩综合视频网址| 亚洲护士老师的毛茸茸最新章节| 亚洲裸体xxxx| 欧美视频在线观看 亚洲欧| 国产精品日韩欧美综合| 精品美女永久免费视频| yellow中文字幕久久| 性欧美亚洲xxxx乳在线观看| 国产精品视频久久久久| 97国产精品人人爽人人做| 日韩三级影视基地| 亚洲色图综合久久| 欧美丰满老妇厨房牲生活| 亚洲男女自偷自拍图片另类| 清纯唯美日韩制服另类| 亚洲毛片在线观看.| 日韩激情在线视频| 九九久久久久99精品|