Java進擊C#——語法之線程同步

来源:http://www.cnblogs.com/hayasi/archive/2016/10/17/5969245.html
-Advertisement-
Play Games

上一章我們講到關於C#線程方向的應用。但是筆者並沒有講到多線程中的另一個知識點——同步。多線程的應用開發都有可能發生臟數據。同步的功能或多或少都會用到。本章就要來講一下關於線程同步的問題。根據筆者這幾年來的.NET開發可以瞭解到的同步方式至少有四種以上。如。lock、volatile、Monitor ...


上一章我們講到關於C#線程方向的應用。但是筆者並沒有講到多線程中的另一個知識點——同步。多線程的應用開發都有可能發生臟數據。同步的功能或多或少都會用到。本章就要來講一下關於線程同步的問題。根據筆者這幾年來的.NET開發可以瞭解到的同步方式至少有四種以上。如。lock、volatile、Monitor等。

lock方式

對lock的關鍵字作用跟JAVA的synchronized關鍵字類似。但有一定的差別。JAVA的synchronized關鍵字可能修飾在方法上面。可惜C#卻不能修飾在方法上面。用法有什麼不同嗎。那不如讓我們看一下代碼?

C#:

lock (aomiLock)
{
    Thread.Sleep(300000);
     i++;

     Console.WriteLine(aomiLock.Name);
}

上面的aomiLock只是一個筆者定義類的一個實例而以。顯然筆者是看不出寫法上有多大的的區別。對於lock的用法,有一個新人這樣子問我:如果我有倆個靜態的全局變數。一個用去作lock的參數值。即是上面的aomiLock變理的位置。另一個在lock內部。即是大括弧裡面。那麼可以在別的地方修改lock內部的值呢?我只能跟他說聲對不起。可以修改的。

註意:上面有說到volatile關鍵字事實在JAVA也有volatile關鍵字。都是作用於變數級別的。作用只是讓變理可見。這一點跟JAVA是一樣子。同時如果你想用跟synchronized關鍵字一樣子修飾在方法上面的話。不好意思請用[MethodImpl(MethodImplOptions.Synchronized)]。

Monitor類

Monitor類在使用上跟locak的關鍵字有一點像。只是Monitor類本身提供了太多靈活的功能。大家是否知道JAVA 5.0之後提供的一個叫Lock介面。他的實例類ReentrantLock。他的功能就跟Monitor類類似。

bool acquireLock = false;
Monitor.Enter(aomiLock, ref acquireLock);
          
//內容
i++;
Console.WriteLine("add i=" + i);
         
Monitor.Exit(aomiLock);
Mutex類

這是一個互斥鎖,筆者很少用他來作同步。Mutex類的作用可以到進程之間。所以更多的是被用在一個電腦只能運行一個應用程式的功能上。而且他用的資源比較大。但筆者沒有辦法證明。總之筆者很少用他就對了。

 1  class Program
 2     {
 3         public static Mutex mutex;
 4         static void Main(string[] args)
 5         {
 6             bool created;
 7             mutex = new Mutex(false, "aomiApplication", out created);
 8 
 9             Console.ReadKey();
10 
11         }
12 
13         public static void Add()
14         {
15             for (int i = 0; i < 10; i++)
16             {
17                 mutex.WaitOne();
18                 Console.WriteLine("add i=" + i);
19                 mutex.ReleaseMutex();
20 
21             }
22 
23         }
24     }

Mutex類的構造函數第一個參數用於表示。是否在新建Mutex類的時候就獲得互斥權利。true表示立即獲得。false的話則用WaitOne方法來獲得。相信筆者不用多說大家也明白。

 SemaphoreSlim類

SemaphoreSlim類筆者覺得他是一個控制線程量的一個類。他常常用於控制在當前應用最多能運行幾個線程或非同步運行的數量。筆者更多的用於設計公司的框架的時候應用。

class Program
    {
        public static SemaphoreSlim ss = new SemaphoreSlim(4);
        static void Main(string[] args)
        {

            for (int i = 0; i < 10; i++)
            {
                Thread thread = new Thread(Add);
                thread.Start();
            }

            Console.ReadKey();

        }

        public static void Add()
        {
            if (ss.Wait(2000))
            {
                Console.WriteLine("正在運行中");
                Thread.Sleep(2000);
                ss.Release();
            }
            else
            {
                Console.WriteLine("線程忙");
            }
        
        }
    }
AutoResetEvent類

筆者個人認為這個類不屬於同步類裡面的。更覺得他是一個信號燈的一個概念。可是他卻也能實現小功能的同步工作。在設計框架的時候筆者也常常用到。

class Program
    {
        public static AutoResetEvent mainEvent = new AutoResetEvent(false);
        static void Main(string[] args)
        {
            Thread thread = new Thread(Execute);
            thread.Start();

            mainEvent.Set();//通知他可以很執行了
            Console.ReadKey();


        }

        public static void Execute()
        {
            mainEvent.WaitOne();
            Console.WriteLine("Execute 正在運行中");
            //內容

        }
    }
本章總結

本章主要介紹關於線程之間同步數據的一些常用的方式。當然以上只是筆者常用到的而以。並不全面。好了本章就到這裡了。


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

-Advertisement-
Play Games
更多相關文章
  • 一、在項目中添加Ckeditor4.5.11 (1) 新建 ASP.NET MVC5項目,解壓縮ckeditor_4.5.11_standard.zip,在VS2015的解決方案資源管理器中將得到的“ckeditor”文件夾複製到當前項目的Scripts文件夾中。 (2) 此時在解決方案資源管理器中 ...
  • 匿名函數一個“內聯”語句或表達式,可在需要委托類型的任何地方使用。可以使用匿名函數來初始化命名委托,或傳遞命名委托(而不是命名委托類型)作為方法參數。 共有兩種匿名函數: Lambda表達式(在這裡只舉例在Lambda表達式在委托中的應用) 匿名方法 Lambda表達式是一種可用於創建委托或表達式目 ...
  • ASP.NET Aries 4.0 主要更新如下:1:增加AR.Global.GetUser() 方法返回當前登陸者的用戶信息。2:重寫AR.Combobox 支持下拉樹。3:調整及擴展Input下拉的配置參數。4:優化及新增AR.Combobox相關的方法。5:重寫層級表頭的配置及演算法。6:擴展下... ...
  • 1、概覽 1.1、介紹 ...
  • 上大學時學校開過一門課程就是數據結構,當時學的似懂非懂,不知道它的重要性,現在工作了,想撿起來,所以重新買了本書,重溫數據結構,我自己會記錄整個學習的過程,有興趣的同學可以一起。 今天剛看到基礎篇,也記錄下來,方便日後查看和再次回顧。 <一>你需要知道的一些名詞定義: 1.數據:數據是對客觀事物的符 ...
  • 為.net core 配一個基於html5的UI框架 傳送門:TchApp項目說明 ...
  • [ASP.NET Core] Getting Started 前言 本篇文章介紹如何快速建立一個ASP.NET Core應用程式,為自己留個紀錄也希望能幫助到有需要的開發人員。 ASP.NET Core官網 環境 建立一個ASP.NET Core應用程式,首先要從官網下載SDK來建置.NET Cor ...
  • 枚舉類型是定義了一組“符號名稱/值”配對。枚舉類型是強類型的。每個枚舉類型都是從system.Enum派生,又從system.ValueType派生,而system.ValueType又從system.Object派生,所以枚舉類型是指類型。 編譯枚舉類型時,C#編譯器會把每個符號轉換成類型的一個常 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...