并發(fā)編程第二章

<center>第二章</center>

線程安全知識

  1. 線程安全的代碼其核心在于要對狀態(tài)訪問進(jìn)行管理,比如 共享的、可變的狀態(tài)。
    • 正確的編程方式是首先使代碼正確運(yùn)行,然后再提高代碼的速度。
  2. 什么是線程安全性
    • 當(dāng)多個(gè)線程訪問某個(gè)類時(shí),這個(gè)類始終都能編寫出正確的行為。
    • 無狀態(tài)對象一定是線程安全的,比如局部變量。
               public class StatelessFactorizer implements Servlet{ 
               public void  service(ServletRequest 
                                   rep,ServletResponse resp){                     BigInteger i=extractFromRequest(rep); 
               BigInteger[] factors=factor(i);
         encodeIntoResponse(rep,resp);
              } }

<a><center>以上是否是線程安全的?</center></a>

  • 原子性
    所謂原子操作是指不會被線程調(diào)度機(jī)制打斷的操作;這種操作一旦開始,就一直運(yùn)行到結(jié)束,中間不會有任何上下文切換到另一個(gè)線程(比如數(shù)據(jù)庫事物)

      public class StatelessFactorizer implements Servlet{ 
         private  long conut=0;
              public void  service(ServletRequest 
                                  rep,ServletResponse resp){                     BigInteger i=extractFromRequest(rep); 
              BigInteger[] factors=factor(i);
                  ++count;
        encodeIntoResponse(rep,resp);
             } }
    

<a><center>** 在多線程里面以上會出現(xiàn)什么問題**</center></a>
+ 由于不恰當(dāng)執(zhí)行時(shí)序而出現(xiàn)不正確的結(jié)果稱為競態(tài)條件。
1. 基于一種可能失效的觀察結(jié)果來做出判斷或者執(zhí)行某個(gè)計(jì)算,這種競態(tài)條件稱為先檢查后執(zhí)行。比如(延遲初始化、懶加載、懶加載代理)

      <code> 
      public class Singleton {  
         private B instance=null;                  
    public  B getInstance() {  
         if (instance == null) {    
               instance = new B();  
           }    
    return single;  
     }  
      </code>     
  • 復(fù)合操作(其實(shí)就是多個(gè)原子操作)
    比如修復(fù)上面代碼出現(xiàn)的問題,將++count 變?yōu)橐粋€(gè)原子操作(暫時(shí)使用線程安全類來解決)。

     public class StatelessFactorizer implements Servlet{ 
           private  AtomicLong conut=new AtomicLong();
                public void  service(ServletRequest 
                                    rep,ServletResponse resp){                     BigInteger i=extractFromRequest(rep); 
                BigInteger[] factors=factor(i);
                    count.incrementAndGet();
          encodeIntoResponse(rep,resp);
               } }
    
  • 加鎖機(jī)制

    1. 內(nèi)置鎖(互斥鎖) 每一個(gè)對象都可以做實(shí)現(xiàn)同步的鎖,并且是可重入的。

         public class Widget { 
         public synchronized void doSomething() {   
      }   } 
      
        public class LoggingWidget extends Widget {  
        public synchronized void doSomething() {             System.out.println(toString() + ": callingdoSomething");  
        super.doSomething();  
         }  
            }  
      
  • 鎖保護(hù)狀態(tài)

    1. 對于可能被多個(gè)線程同時(shí)訪問的可變狀態(tài)變量,在訪問它時(shí)都需要持有同一個(gè)鎖,我們稱狀態(tài)變量是由這個(gè)鎖保護(hù)的。并且建議每個(gè)可變的變量都應(yīng)該由一個(gè)鎖來保護(hù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 1,015評論 0 1
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 6,018評論 1 19
  • OpenStack和Ceph是一個(gè)了不起的組合 Ceph提供統(tǒng)一的橫向擴(kuò)展存儲,使用帶有自我修復(fù)和智能預(yù)測故障功能...
    廖馬兒閱讀 607評論 0 1

友情鏈接更多精彩內(nèi)容