国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

馬云將來淘汰的十個行業(yè)網(wǎng)站建設(shè)西安網(wǎng)站維護(hù)

馬云將來淘汰的十個行業(yè)網(wǎng)站建設(shè),西安網(wǎng)站維護(hù),怎么看網(wǎng)站開發(fā)者頁面,wordpress錯誤提醒文章目錄并發(fā)安全問題線程安全性死鎖定義實現(xiàn)一個死鎖查看死鎖解決死鎖其他線程安全問題單例模式并發(fā)安全問題 線程安全性 線程安全是指我們所寫的代碼在并發(fā)情況下使用時,總是能表現(xiàn)出正確的行為;反之,未實現(xiàn)線程安全的代碼,表…

文章目錄

  • 并發(fā)安全問題
    • 線程安全性
    • 死鎖
      • 定義
      • 實現(xiàn)一個死鎖
      • 查看死鎖
      • 解決死鎖
    • 其他線程安全問題
    • 單例模式

并發(fā)安全問題

線程安全性

線程安全是指我們所寫的代碼在并發(fā)情況下使用時,總是能表現(xiàn)出正確的行為;反之,未實現(xiàn)線程安全的代碼,表現(xiàn)的行為是不可預(yù)知的,有可能正確,

實現(xiàn)線程安全的方式:

  • 線程封閉

    就是把對象封裝到一個線程里,只有這一個線程能看到此對象。實現(xiàn)線程封閉的方式如下:

    • 棧封閉

      這里是指每個線程自己的線程棧,方法的局部變量就是在線程棧中的,對于其他線程是不可見的

    • ThreadLocal

      各個線程Thread對象維護(hù)了一份Map,對于其他線程是不可見的

  • 無狀態(tài)的類

    沒有任何成員變量的類,就叫無狀態(tài)的類,這種類一定是線程安全的。

  • 讓類不可變

    沒有成員變量的類畢竟是少數(shù),我們還可以讓類的成員變量不可變,給他們加上final關(guān)鍵字

    如果成員變量是一個對象,final不能保證類的安全性,因為雖然對象的引用不會變,但是在堆上的對象實例可能被多個線程同時修改,沒有正確處理的情況下,對象實例在堆中的數(shù)據(jù)是不可預(yù)知的。

  • 加鎖或CAS

    synchronized、顯示鎖Look、原子Atomic操作、CAS機(jī)制等等



死鎖

定義

是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,由于競爭資源或者由于彼此通信而造成的一種阻塞的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去。此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖。


  • 死鎖是必然發(fā)生在多操作者(M>=2 個)爭奪多個資源(N>=2 個,且 N<=M) 才會發(fā)生這種情況。
  • 爭奪資源的順序不對,如果爭奪資源的順序是一樣的,也不會產(chǎn)生死鎖;
  • 爭奪者對拿到的資源不放手,也不能被掠奪。

學(xué)術(shù)化的定義。死鎖的發(fā)生必須具備以下四個必要條件。

  • 互斥條件:指進(jìn)程對所分配到的資源進(jìn)行排它性使用,即在一段時間內(nèi)某資源只由一個進(jìn)程占用。如果此時還有其它進(jìn)程請求資源,則請求者只能等待, 直至占有資源的進(jìn)程用畢釋放。
  • 請求和保持條件:指進(jìn)程已經(jīng)保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進(jìn)程占有,此時請求進(jìn)程阻塞,但又對自己已獲得的其它資源保持不放。
  • 不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
  • 環(huán)路等待條件:指在發(fā)生死鎖時,必然存在一個進(jìn)程——資源的環(huán)形鏈, 即進(jìn)程集合{P0,P1,P2,···,Pn}中的 P0 正在等待一個 P1 占用的資源;P1 正在等待 P2 占用的資源,……,Pn 正在等待已被 P0 占用的資源。

只要打破四個必要條件之一就能有效預(yù)防死鎖的發(fā)生。

  • 打破互斥條件:改造獨(dú)占性資源為虛擬資源,大部分資源已無法改造。
  • 打破不可搶占條件:當(dāng)一進(jìn)程占有一獨(dú)占性資源后又申請一獨(dú)占性資源而無 法滿足,則退出原占有的資源。
  • 打破占有且申請條件:采用資源預(yù)先分配策略,即進(jìn)程運(yùn)行前申請全部資源, 滿足則運(yùn)行,不然就等待,這樣就不會占有且申請。
  • 打破循環(huán)等待條件:實現(xiàn)資源有序分配策略,對所有設(shè)備實現(xiàn)分類編號,所有進(jìn)程只能采用按序號遞增的形式申請資源。

避免死鎖常見的算法有有序資源分配法、銀行家算法。



實現(xiàn)一個死鎖

/*** @Description: 實現(xiàn)一個簡單的死鎖程序* @Author 胡尚* @Date: 2023/4/1 17:59*/
public class DeadLookTest {private static Object o1 = new Object();private static Object o2 = new Object();public void fastLock() throws InterruptedException {synchronized(o1){Thread.sleep(2000);System.out.println("fast");synchronized (o2){System.out.println("----");}}}public void postLock() throws InterruptedException {synchronized(o2){Thread.sleep(2000);System.out.println("post");synchronized (o1){System.out.println("----");}}}public static void main(String[] args) throws InterruptedException {DeadLookTest deadlook = new DeadLookTest();// 新開一個線程去調(diào)用其中一個方法new Thread(() -> {try {deadlook.postLock();} catch (InterruptedException e) {}}).start();deadlook.fastLock();}
}



查看死鎖

使用jstack命令查看死鎖結(jié)果

C:\Users\Administrator>jps
4784 DeadLookTest
9808 RemoteMavenServer36
2052 Launcher
2692 Jps
8572C:\Users\Administrator>jstack 4784
......
Found one Java-level deadlock:
=============================
"Thread-0":waiting to lock monitor 0x0000025d5a58fd88 (object 0x0000000716edb910, a java.lang.Object),which is held by "main"
"main":waiting to lock monitor 0x0000025d5a58e998 (object 0x0000000716edb920, a java.lang.Object),which is held by "Thread-0"Java stack information for the threads listed above:
===================================================
"Thread-0":at cn.tulingxueyuan.safe.dl.DeadLookTest.postLock(DeadLookTest.java:30)- waiting to lock <0x0000000716edb910> (a java.lang.Object)- locked <0x0000000716edb920> (a java.lang.Object)at cn.tulingxueyuan.safe.dl.DeadLookTest.lambda$main$0(DeadLookTest.java:39)at cn.tulingxueyuan.safe.dl.DeadLookTest$$Lambda$1/2003749087.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)
"main":at cn.tulingxueyuan.safe.dl.DeadLookTest.fastLock(DeadLookTest.java:20)- waiting to lock <0x0000000716edb920> (a java.lang.Object)- locked <0x0000000716edb910> (a java.lang.Object)at cn.tulingxueyuan.safe.dl.DeadLookTest.main(DeadLookTest.java:43)Found 1 deadlock.



解決死鎖

我們現(xiàn)在通過上面的命令找到了產(chǎn)生死鎖的位置,那么如何取解決死鎖嘞?我們知道產(chǎn)生死鎖的原因如下:

  • 死鎖是必然發(fā)生在多操作者(M>=2 個)爭奪多個資源(N>=2 個,且 N<=M) 才會發(fā)生這種情況。
  • 爭奪資源的順序不對,如果爭奪資源的順序是一樣的,也不會產(chǎn)生死鎖;
  • 爭奪者對拿到的資源不放手,也不能被掠奪。

第一個條件一般都是業(yè)務(wù)必須要,那么打破死鎖就要從下面的兩個條件去解決

  • 保證爭奪鎖資源的順序一樣。

    在實際的開發(fā)中可能會存在比較隱蔽的加鎖順序,比如鎖對象作為方法參數(shù)傳遞,如下所示

    private static void businessDo(Object first,Object second) throws InterruptedException {String threadName = Thread.currentThread().getName();synchronized (first){System.out.println(threadName + " get first");Thread.sleep(1000);synchronized (second){System.out.println(threadName + " get second");}}
    }// 然后兩個線程,在調(diào)用的時候傳遞的參數(shù)順序卻不一樣
    businessDo(No1,No2);
    businessDo(No2,No1);
    

    解決上面這種問題的方式是:在加鎖前,在方法中做一個內(nèi)部的排序

    public class SafeOperate {private static Object No13 = new Object();//第一個鎖private static Object No14 = new Object();//第二個鎖private static Object tieLock = new Object();//第三把鎖public void transfer(Object first,Object second) throws InterruptedException {int firstHash = System.identityHashCode(first);int secondHash = System.identityHashCode(second);if(firstHash<secondHash){synchronized (first){System.out.println(Thread.currentThread().getName()+" get "+first);Thread.sleep(100);synchronized (second){System.out.println(Thread.currentThread().getName()+" get "+second);}}}else if(secondHash<firstHash){synchronized (second){System.out.println(Thread.currentThread().getName()+" get"+second);Thread.sleep(100);synchronized (first){System.out.println(Thread.currentThread().getName()+" get"+first);}}}else{// 萬一兩個對象的hash值一樣,那么就引入第三把鎖,誰先搶到第三把鎖就去進(jìn)行前兩兩把鎖的加鎖synchronized (tieLock){synchronized (first){synchronized (second){System.out.println(Thread.currentThread().getName()+" get"+first);System.out.println(Thread.currentThread().getName()+" get"+second);}}}}}
    }
    
  • 對拿到的鎖資源嘗試釋放

    這種方式對于synchronized是不適用的,因為它不拿到鎖誓不罷休。使用ReentrantLock,使用其中的tryLock(long time, TimeUnit unit)方法,在指定的時間中如果還沒有拿到鎖就去進(jìn)行釋放的邏輯

    大致是實現(xiàn)邏輯如下所示

    while(true){if(No13.tryLock()){System.out.println(threadName +" get 13");// 如果沒有拿到No14的鎖,那么No13的鎖也釋放try{if(No14.tryLock()){try{System.out.println(threadName  +" get 14");System.out.println("zhouYuDo do work------------");break;}finally{No14.unlock();}}}finally {No13.unlock();}}// 如果不加休眠機(jī)制,那么就比較容易產(chǎn)生活鎖Thread.sleep(1000);
    }
    



其他線程安全問題

活鎖

兩個線程在嘗試拿鎖的機(jī)制中,發(fā)生多個線程之間互相謙讓,不斷發(fā)生同一個線程總是拿到同一把鎖,在嘗試拿另一把鎖時因為拿不到,而將本來已經(jīng)持有的鎖釋放的過程。

解決辦法:每個線程休眠隨機(jī)數(shù),錯開拿鎖的時間。

線程饑餓

低優(yōu)先級的線程,總是拿不到執(zhí)行時間



單例模式

  • DCL雙重檢測機(jī)制
  • volatile關(guān)鍵字禁止指令重排
public class HungrySingleton {//創(chuàng)建 SingletonHungry 的一個對象private static volatile HungrySingleton instance;// 讓構(gòu)方法私有,這樣該類就不會被其它類實例化private HungrySingleton() {}//獲取唯一可用的對象public static HungrySingleton getInstance() {if(null == instance) { synchronized{if(null == instance) { instance = new LazySingleton();}}}return instance;}
}
http://aloenet.com.cn/news/47102.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)找星火龍佛山seo培訓(xùn)機(jī)構(gòu)
  • 模版網(wǎng)站后期可以更換圖片嗎seo和sem的區(qū)別
  • 重慶做網(wǎng)站建設(shè)seo推廣一年要多少錢
  • 做視頻網(wǎng)站掙錢嗎百度關(guān)鍵詞排名優(yōu)化
  • 網(wǎng)站設(shè)計的寬度百度seo刷排名軟件
  • 昆明賢邦網(wǎng)站建設(shè)百度站長工具seo查詢
  • 網(wǎng)站重大建設(shè)項目公開發(fā)布制度營銷戰(zhàn)略包括哪些方面
  • 中介網(wǎng)站怎么做seo排名優(yōu)化聯(lián)系13火星軟件
  • 昆明如何做百度的網(wǎng)站搜多多搜索引擎入口
  • 江西省城鄉(xiāng)建設(shè)廳網(wǎng)站查詢證件西安網(wǎng)站seo價格
  • 網(wǎng)頁網(wǎng)站建設(shè)軟件有哪些百度品牌推廣
  • 政府網(wǎng)站建設(shè)多少錢商品促銷活動策劃方案
  • wordpress 頭像設(shè)置湖南靠譜seo優(yōu)化公司
  • 網(wǎng)站如何做移動適配百度一下百度主頁
  • 給我免費(fèi)播放片高清在線觀看視頻搜索引擎優(yōu)化面對哪些困境
  • 西安做網(wǎng)站的公司客服企業(yè)網(wǎng)絡(luò)營銷策劃方案范文
  • 佛山企業(yè)用seo策略seo技術(shù)是干什么的
  • 宜陽縣網(wǎng)站建設(shè)怎么自己注冊網(wǎng)站平臺了
  • 石家莊網(wǎng)站外包公司經(jīng)典營銷案例
  • 成都疫情最新新聞百度seo刷排名工具
  • 網(wǎng)站后臺注入推廣普通話手抄報內(nèi)容大全資料
  • 開發(fā)網(wǎng)站通過第三方微信認(rèn)證登錄開發(fā)費(fèi)用北京seo運(yùn)營推廣
  • 廣州網(wǎng)站推廣多少錢重慶seo網(wǎng)絡(luò)推廣關(guān)鍵詞
  • 參考消息電子版手機(jī)版網(wǎng)站優(yōu)化方法
  • 建設(shè)銀行網(wǎng)站查詢密碼怎么設(shè)置最新網(wǎng)站查詢工具
  • 科技公司網(wǎng)站主頁設(shè)計網(wǎng)絡(luò)營銷網(wǎng)站平臺有哪些
  • 常州網(wǎng)站設(shè)計制作推廣類軟文
  • 江陰做網(wǎng)站的地方企業(yè)網(wǎng)站建設(shè)規(guī)劃
  • 母嬰網(wǎng)站怎么做中國十大網(wǎng)絡(luò)銷售公司
  • 網(wǎng)站每日簽到怎么做大一html網(wǎng)頁制作