Java線程入門第二篇

来源:https://www.cnblogs.com/chenzhuantou/archive/2018/12/24/10171479.html
-Advertisement-
Play Games

Java線程通信方法 0、(why)每個線程都有自己的棧空間,我們要線程之間進行交流,合作共贏。 1、synchronized和volatile關鍵字 a) 看下麵的synchronized關鍵字 b) 看下麵的volatile關鍵字 2、等待/通知機制:一個線程A調用對象的wait()方法,另一個 ...


Java線程通信方法

0、(why)每個線程都有自己的棧空間,我們要線程之間進行交流,合作共贏。

1、synchronized和volatile關鍵字

  a)  看下麵的synchronized關鍵字

  b)  看下麵的volatile關鍵字

2、等待/通知機制:一個線程A調用對象的wait()方法,另一個線程調用線程B的notity()或者的notifyall()方法.

  a)  順序列印奇數偶數

public class ThreadPrintDemo2 {

    public static void main(String[] args) {
        final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2();
        //java8新特性
        Thread t1 = new Thread(demo2 :: print1);
        Thread t2 = new Thread(demo2 :: print2);
        t1.start();
        t2.start();
    }
    public   synchronized void print2() {

        for (int i = 1; i <= 100; i +=2) {
            System.out.println(i);
            this.notify();  //通知等待中的進程
            try {
                this.wait();    //線程進入等待
                Thread.sleep(100);// 防止列印速度過快導致混亂
            } catch (InterruptedException e) {
                // NO
            }
        }
    }
    public synchronized void print1() {
        for (int i = 0; i <= 100; i += 2) {
            System.out.println(i);
            this.notify();  //通知等待中的進程
            try {
                this.wait();    //線程進入等待
                Thread.sleep(100);// 防止列印速度過快導致混亂
            } catch (InterruptedException e) {
                // NO
            }
        }
    }
}

  b) 列印連續句子

public class ThreadPrintDemo2 {
    private char[] arr = new char[]{'a', ' ', 'b', 'c', 'd', 'e'};

    public static void main(String[] args) {
        final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2();
        Thread t1 = new Thread(demo2::print1);
        Thread t2 = new Thread(demo2::print2);
        t1.start();
        t2.start();
    }
    public synchronized void print2() {

        for (int i = 1; i < arr.length; i +=2) {
            System.out.print(arr[i]);
            this.notify();
            try {
                this.wait();
                Thread.sleep(100);// 防止列印速度過快導致混亂
            } catch (InterruptedException e) {
                // NO
            }
        }
    }
    public synchronized void print1() {
        for (int i = 0; i < arr.length; i +=2) {
            System.out.print(arr[i]);
            this.notify();
            try {
                this.wait();
                Thread.sleep(100);// 防止列印速度過快導致混亂
            } catch (InterruptedException e) {
                // NO
            }
        }
    }
}

結果:a bcde

3、管道輸入輸出流:pipedreader和pipedwriter 面向字元

          Pipedoutputstream和pipedinputstream面向位元組

4、使用thread.join()方法:利用線程等待特性

5、使用ThreadLocal線程變數

Synchronize關鍵字(重量級鎖)

1、基礎:Java中每一個對象都可以作為鎖

2、手段:確保多線程在同一時刻,只有一個線程處於方法或同步塊中

3、實現原理:JVM基於進入和退出monitor對象來實現方法同步和代碼塊同步

4、鎖優化:jdk1.6之後優化了鎖,加入了偏向鎖和輕量級鎖,鎖可以升級但不能降級

5、使用場景:方法  代碼塊

Lock介面

1、他是一個介面

2、使用的時候需要顯式獲取鎖

3、使用方法:

Lock lock = new ReentrantLock();
lock.lock();
try {
    
}finally {
    lock.unlock();
}

4、Synchronized經常與Lock放在一起比較

Volatile

1、是什麼:(what)是輕且量級的synchronize,保證共用變數的可見性(一個線程修改一個共用變數的時候,另一個線程會知道),並他不會引起線程的上下文切換和調度。

2、使用場景:修飾變數

3、優化:在1.7中將共用變數追加了60個位元組,變成64個位元組。因為(硬體)目前流行的cpu的高速緩存行是64個位元組,當隊列的頭尾節點不足64位元組時候,處理器會將他們讀到同一個緩存行,並且鎖定緩存行。這樣會影響隊列出隊入隊效率。

ThreadLoacl類(線程變數)

為每個線程變數創建一個該變數的副本,避免併發訪問的線程安全問題,保證線程安全


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

-Advertisement-
Play Games
更多相關文章
  • 一、引言 單例模式應該是設計模式中比較簡單的一個,因為這個模式只有一個類,但不要小看這個設計模式,這個模式可是面試的時候很常見的一個。 單例模式有什麼的用處:有一些對象我們只需要一個的時候,比如線程池,緩存,註冊表等。 也就是說這個模式的作用是:保證只有一個實例對象。 二、單例模式 先看定義:確保一 ...
  • 比較符合中國人的思維模式,舉的例子也多為作者自己經歷過的項目,容易產生共鳴。 六大原則和23個模式都有覆蓋,內容沒有GoF的書精辟,但也講解清楚。代碼的例子沒有大問題,對於理解有幫助。對GoF提出的23個模式的C++代碼都提供了相應的Java代碼實現,並且是基於JDK5的標準之上,使用了泛型和枚舉,... ...
  • 1、什麼叫迭代 現在,我們已經獲得了一個新線索,有一個叫做“可迭代的”概念。 首先,我們從報錯來分析,好像之所以1234不可以for迴圈,是因為它不可迭代。那麼如果“可迭代”,就應該可以被for迴圈了。 這個我們知道呀,字元串、列表、元組、字典、集合都可以被for迴圈,說明他們都是可迭代的。 我們怎 ...
  • 除了使用 new 操作符之外,還有更多的製造對象的方法。你將瞭解到實例化這個活動不應該總是公開進行,也會認識到初始化經常造成“耦合”問題。 ...
  • 以上實例中,100,1000.0和"John"分別賦值給counter,miles,name變數。 執行以上程式會輸出如下結果: ...
  • 一 開發環境說明: python3.5+wxpython包+math包 win10環境下開發,兼任win7 編譯工具:pycharm 二 運行界面展示: 三 開源共用: 四 打包xe文件下載地址: 百度網盤:https://pan.baidu.com/s/1xn9hjBsAvCFFq8XSpqS0L ...
  • Spring-data-jpa中非常簡單的查詢介面方式與CUBA相結合,簡化CUBA開發人員操作數據的方法,能有效提升代碼質量和交付速度 ...
  • 背景 首先,我們達成以下共識: 一個服務方法,如果入參太多,且基本為非pojo,會給調用方造成不必要的干擾。儘管可以把文檔寫的很完善,但還是建議使用pojo對多個參數合理封裝。 如下示例: 執行方法都應該對入參進行校驗。對於一些 通用的簡單的不涉及業務邏輯 的校驗,比如字元串不為空,數字的範圍限制, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...