多線程第二彈

来源:http://www.cnblogs.com/enginehome/archive/2016/07/27/5712918.html
-Advertisement-
Play Games

為何結尾處驚現啪,啪,啪?這是屌絲的寂寞,還是程式的錯?是人性的墮落,還是對現實的無可奈何?走進C.Engineman,一個跳跳的程式民工。 ...


  各位看官,抓緊上車,老司機要接著飆車了。

     <!------------------------------我是萬惡的分割線----------------------------------->

  上回咱們講到多線程中有個不得不提的關鍵字---synchronized,不知道各位看官中有沒有對這句話表示費解的(沒有的話,咱們就委屈一下,假裝有),java的關鍵字有很多,多線程的關鍵字也不少,那為什麼會說synchronized是多線程中不得不提的關鍵字呢?各位看官不要著急,備好瓜子,且聽我細細道來。

  話說當年java初現,天地法則新立,各種不足(ps:有不足就對了,沒有漏洞的話那還讓人活不活了),宇宙間那家伙是一片混亂。因為制度的不完善,導致各種行為得不到約束,java這位新君麾下的多線程,I/O等大將更是桀驁不馴,放縱手下無法無天,,,,啥,你問有多瘋狂?據說當初多線程的這個“多”代表2個以上的數時,效率低就不說了,各個線程的數據傳輸也會極其混亂,我嚴重懷疑牛頭馬面就是早期多線程的“傑出作品”。就在這人神共憤的關鍵時刻,天空一聲巨響,synchronized這個小將化好了妝,踏著七彩祥雲就登上了歷史的舞臺。

  上回分解時,不知各位看官還有印象沒有,我說過synchronized的作用相當於一個督察,在它的監督下,所有的線程,沒錯,是所有的,都必須按照先後順序一個個來,,,,啥?你媳婦要生了?你要回去看兒子?那你也得排隊,還有,不准有性別歧視,女孩你就不看了?,,,,,啥?你隔壁的二狗的第三隻狗一窩生了40只狗,你要去道喜?那你也得排隊

不過,規矩是死的,人是活的,不讓插隊,那多排幾隊,大家同時進行。(ps:腦補一下,驚堂木一聲驚堂),正主來了,今天小子就給大家說道說道synchronized的同步方法(敲黑板)

  上回說到線程安全分為“線程安全”和“非線程安全”,我這有一個祖傳的傳男不傳女,傳內不傳外的秘密,偷偷告訴大家,大家別往外傳,“非線程安全”問題存在於“實例變數”中,如果是方法內的私有變數,則不存在“非線程安全”,也就是俗說的業內黑話---“線程安全”了;如果多個線程同時訪問1個對象中的實例變數,那就有可能出現“非線程安全”問題,此外,如果多線程訪問的對象中如果有多個實例變數,則運行的結果又可能出現交叉的情況,我嚴重懷疑牛頭馬面就是這麼出來的(ps:純屬逗樂,都別當真哈)。

實例如下(如果巧合,看來成功的路都是一樣的,:)):

首先,創建一個HasSelfPrivateNum類

 

 1 public class HasSelfPrivateNum 
 2 {
 3     public void addI(String userName)
 4     {
 5         try
 6         {
 7             int num = 0;
 8             if(userName.equals("a"))
 9             {
10                 num = 100;
11                 System.out.println("a set over");
12                 Thread.sleep(100);
13             }
14             else
15             {
16                 num = 200;
17                 System.out.println("b set over");
18             }
19             System.out.println(userName+" num="+num);
20         }
21         catch(InterruptedException e)
22         {
23             e.printStackTrace();
24         }
25     }
26 }

 

 

 

 

 

創建一個ThreadA類:

 1 public class ThreadA extends Thread 
 2 {
 3     private HasSelfPrivateNum numRef;
 4     public ThreadA(HasSelfPrivateNum numRef)
 5     {
 6         super();
 7         this.numRef=numRef;
 8     }
 9     public void run()
10     {
11         super.run();
12         numRef.addI("a");
13     }
14 }

 

創建一個ThreadB類:

public class ThreadB extends Thread
{
    private HasSelfPrivateNum numRef;
    public ThreadB(HasSelfPrivateNum numRef)
    {
        super();
        this.numRef=numRef;
    }
    public void run()
    {
        super.run();
        numRef.addI("b");
    }
}

下麵是Run類:

 1 public class Run 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         HasSelfPrivateNum numRef = new HasSelfPrivateNum();
 6         ThreadA n = new ThreadA(numRef);
 7         n.start();
 8         ThreadB m = new ThreadB(numRef);
 9         m.start();
10     }
11 }

好了,咱們跑一下試試:

試驗結果很明顯,由於沒用synchronized,即兩個線程訪問一個沒有同步的方法,出現了”非線程安全“。下麵,我們對程式做一個個微整形,在HasSelfPrivateNum類public void addI(String userName)方法前添加關鍵字--synchronized

 1 public class HasSelfPrivateNum 
 2 {
 3     synchronized public void addI(String userName)
 4     {
 5         try
 6         {
 7             int num = 0;
 8             if(userName.equals("a"))
 9             {
10                 num = 100;
11                 System.out.println("a set over");
12                 Thread.sleep(100);
13             }
14             else
15             {
16                 num = 200;
17                 System.out.println("b set over");
18             }
19             System.out.println(userName+" num="+num);
20         }
21         catch(InterruptedException e)
22         {
23             e.printStackTrace();
24         }
25     }
26 }

我們再跑一次:

這次試驗我們可以看出,由於是同步訪問,所以結果是先列印a,然後列印出b.

結論:在兩個線程訪問同一個對象中的同步方法時,一定是線程安全的。

<!---------------------我是萬惡的分割線,我又來了------------->

啪,精彩不斷,好戲連連,預知後事如何,且聽下回分解。

啪,未完待續。

啪,明天見。

 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 說來慚愧,做了幾年ASP.NET最近才有機會使用MVC開發生產項目。項目中新增、編輯表單提交存在大量服務端數據格式校驗,各種if else顯得代碼過於繁瑣,特別是表單數據比較多的時候尤為噁心,正好今天比較閑就寫了一個Demo,統一驗證Model層中的數據格式。在此說明一下,MVC自帶數據檢 ...
  • myeclipse老版本不分32位和64位,歡迎大家下載使用! 鏈接:http://pan.baidu.com/s/1dEJCxcl 密碼:z1ga ...
  • 靜態代碼塊:用staitc聲明,jvm載入類時執行,僅執行一次構造代碼塊:類中直接用{}定義,每一次創建對象時執行。執行順序優先順序:靜態塊,main(),構造塊,構造方法。 構造函數 關於構造函數,以下幾點要註意:1.對象一建立,就會調用與之相應的構造函數,也就是說,不建立對象,構造函數時不會運行的 ...
  • IntelliJ Idea 常用快捷鍵列表 Alt+回車 導入包,自動修正 Ctrl+N 查找類 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代碼 Ctrl+Alt+O 優化導入的類和包 Alt+Insert 生成代碼(如get,set方法,構造函數等) Ctrl+E或者Alt+ ...
  • tornado簡介 1、tornado概述 Tornado就是我們在 FriendFeed 的 Web 伺服器及其常用工具的開源版本。Tornado 和現在的主流 Web 伺服器框架(包括大多數 Python 的框架)有著明顯的區別:它是非阻塞式伺服器,而且速度相當快。得利於其 非阻塞的方式和對ep ...
  • ...
  • 2016-07-28 00:10:14 懶漢式: class text { public String k; private static text t=null;//右邊代碼結構比上邊餓漢式繁瑣,可能出現安全問題 private test(){} //安全問題無疑是違背這個程式的初衷就是可以創建多 ...
  • 修改了線上程式的xml配置文件,重啟後報如下錯誤: 百度了下大體的意思是說文件的編碼錯誤,需要重新設置一下文件的編碼格式. vim打開配置文件,執行命令: 保存的時候又報錯: 執行: 重新保存,重啟程式後恢復正常. fenc代表當前文件的編碼格式,提示轉換失敗,也就是說無法直接覆蓋當前的編碼格式,所 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...