java線程的基礎問題講解

2020-12-16 程序猿小白成長記

1.1

並發編程的目的:並發編程是為了讓程序運行得更快,當 並不是啟動更多的線程就能讓程序最大限度地並發執行,受限於死鎖和上下文切換問題。

上下文切換:

CPU通過分配算法循環分配任務,當前任務執行一個時間片後會切換到下一個任務,但是會保存上一個任務的狀態,以便下次切換為這個任務的時候,可以重新加載這個任務,所以任務從保存到加載為一個上下文切換。

所以上下文切換會影響線程的執行速度。

join 的作用

多線程一定比單線程快嗎?

不一定,在測試中並發數量沒超過百萬次的時候,串行比並發速度更快,因為線程有線程的創建和上下文切換的開銷。

如何減少上下文切換?

方法有無鎖並發編程、CAS算法、使用最少線程和使用協程

無鎖並發編程:

多線程競爭鎖時,會引起上下文切換,所以多線程處理數據的時候,可以用一些方法避免使用鎖,如將數據的ID安裝hash算法取模分段,不同線程處理不同段的數據

CAS算法:

java的Atomic包使用CAS算法更新數據,而不需要加鎖

使用最少線程:

避免創建不需要的線程,比如任務很少,但是創建了很多線程來處理,會讓很多線程處理等待狀態

協程

在單線程中實現多任務的調度,並在單線程中維持多個任務的切換。

1.2 死鎖

避免死鎖的幾個方法

避免一個線程獲取多個鎖

避免一個線程在鎖內佔用多個資源,儘量保證每個鎖只佔用一個資源

嘗試使用定時鎖,lock.tryLock()來代替內部鎖機制

對於資料庫鎖,解鎖和加鎖必須連在同一個資料庫中

相關焦點

  • java基礎|驗證ArrayList的線程不安全
    javaDEMO本網站記錄了最全的各種JavaDEMO ,保證下載,複製就是可用的,包括基礎的, 集合的, spring的, Mybatis的等等各種
  • 大數據基礎:Java多線程入門
    在大數據開發學習當中,Java基礎是非常重要的一部分,打好了Java基礎,才能在後續的大數據框架技術學習階段,也能有所主力。而Java當中的一個重要知識點,就是多線程。今天的大數據基礎分享,我們就主要來講講Java多線程入門基礎。
  • Java基礎知識點面試手冊(線程+JDK8)
    前言本文快速回顧了Java
  • Java多線程並發工具類-信號量Semaphore對象講解
    Java多線程並發工具類-Semaphore對象講解通過前面的學習,我們已經知道了Java多線程並發場景中使用比較多的兩個工具類:做加法的CycliBarrier對象以及做減法的CountDownLatch對象並對這兩個對象進行了比較。我們發現這兩個對象要麼是做加法,要麼是做減法的。那麼有沒有既做加法也做減法的呢?
  • 40個Java多線程問題總結
    這篇文章主要是對多線程的問題進行總結的,因此羅列了40個多線程的問題。這些多線程的問題,有些來源於各大網站、有些來源於自己的思考。可能有些問題網上有、可能有些問題對應的答案也有、也可能有些各位網友也都看過,但是本文寫作的重心就是所有的問題都會按照自己的理解回答一遍,不會去看網上的答案,因此可能有些問題講的不對,能指正的希望大家不吝指教。
  • Java 線程安全問題的本質
    從入門到精通實戰課程分享出現線程安全的問題本質是因為:主內存和工作內存數據不一致性以及編譯器重排序導致。所以理解上述兩個問題的核心,對認知多線程的問題則具有很高的意義;簡單理解CPUCPU除了控制器、運算器等器件還有一個重要的部件就是寄存器。其中寄存器的作用就是進行數據的臨時存儲。
  • java的線程創建方式
    Thread類java語言中的Thread類是一個基本的線程類,用於創建線程、中斷線程、獲取線程的基本信息、運行狀態等。我們首先了解下利用Thread類創建線程實例的二種方式。繼承Thread類創建線程//繼承Thread實現自己的線程類class MyThread extends Thread{//重寫run方法,給線程賦予工作任務 @Override public void run() { //任務內容…… System.out.println("當前線程是:"+Thread.currentThread
  • java多線程之Thread構造函數(源碼分析)
    在上一篇文章中對線程狀態生命周期和常見的線程api進行了一個講解。這篇文章開始著重對其構造方法進行一個說明,也將揭曉為什麼我們調用了start方法就能啟動一個線程。一、守護線程和非守護線程我們獲取線程的id的時候會發現每次都不是0,這是因為在java虛擬機運行一個線程的時候會默認啟動一些其他的線程,來為我們的線程服務。
  • JAVA多線程 集合同步
    LinkedList@See http://sudotutorials.com/tutorials/java/collections/java-linkedlist-class.html6.原文連結:http://www.javamadesoeasy.com/2015/12/how-to-synchronize-arraylist-in-java-to.html幾乎所有的集合非線程安全的?
  • 【堪稱經典】JAVA多線程和並發基礎面試問答
    在多線程程序中,多個線程被並發的執行以提高程序的效率,CPU不會因為某個線程需要等待資源而進入空閒狀態。多個線程共享堆內存(heap memory),因此創建多個線程去執行一些任務會比創建多個進程更好。舉個例子,Servlets比CGI更好,是因為Servlets支持多線程而CGI不支持。3. 用戶線程和守護線程有什麼區別?
  • Java基礎學習心得筆記
    對於很多只會C語言的初學者而言,面對java基礎語法學習,反而感覺很難,其實其中最大的問題不是語法難,而是一種編程思想的轉變。
  • Java 並發編程之美-線程相關的基礎知識
    借用 Java 並發編程實踐中的話:編寫正確的程序並不容易,而編寫正常的並發程序就更難了;相比於順序執行的情況,多線程的線程安全問題是微妙而且出乎意料的
  • Java編寫線程安全類的7個技巧
    在以下示例中,pool和workQueue對於單個工作線程是本地的。另一種實現線程局部變量的方法是使用java.lang.ThreadLocal類來作為你想創建「本地線程」的欄位。這是一個使用java.lang.ThreadLocal的實例變量的例子:在java.lang.ThreadLocal中封裝實例變量的類型。
  • Java多線程synchronized
    本篇主要介紹Java多線程中的同步,也就是如何在Java語言中寫出線程安全的程序,如何在Java語言中解決非線程安全的相關問題。
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    JVM作為java運行的基礎,很難相信對於JVM一點都不了解的人可以把java語言吃得很透。我在面試有超過3年Java經驗的開發者的時候, JVM幾乎就是一個必問的問題了。當然JVM不是唯一決定技術能力好壞的面試問題,但是可以佐證java開發能力的高低。
  • Java多線程並發編程中並發容器第二篇之List的並發類講解
    Java多線程並發編程中並發容器第二篇之List的並發類講解概述本文我們將詳細講解list對應的並發容器以及用代碼來測試ArrayList、vector以及CopyOnWriteArrayList在100個線程向list中添加1000個數據後的比較
  • java基礎複習(集合、泛型、IO流、多線程、Junit 、內省 、Properties、 路徑問題)
    這樣的增刪效率較高但查詢時需要一個一個的遍歷, 所以效率較低 ---|Vector: 和ArrayList原理相同, 但線程安全, 效率略低 和ArrayList實現方式相同, 但考慮了線程安全問題, 所以效率略低 ---|Set: 無存儲順序, 不可重複 ---|HashSet 線程不安全,存取速度快。底層是以哈希表實現的。
  • 使用Lock鎖:java多線程安全問題解決方案之Lock鎖
    今天我們來學習一下Lock鎖,它是java 1.5之後出現的接口 java.util.concurrent.locks.Lock接口LockLock鎖可以提升多個線程的讀寫效率。如何來使用Lock鎖?既然Lock是一個接口,那麼就需要有一個實現類,java.util.concurrent.locks.ReentrantLock implements Lock接口,這個java底層已經提供了給我,ReentrantLock 的意思是 可重入鎖,ReentrantLock和synchronized關鍵字都可以用來實現線程之間的同步互斥
  • Java程式設計師必備基礎:Java代碼是怎麼運行的?
    java 代碼運行主要流程 本文主要講解流程如下: 運行時創建對象 方法調用,執行引擎解釋為機器碼 CPU執行指令 多線程切換上下文 編譯 我們都知道,java代碼是運行在Java虛擬機上的。
  • 面試前必看Java線程面試題
    java.lang.Thread 類的實例就是一個線程但是它需要調用java.lang.Runnable接口來執行,由於線程類本身就是調用的Runnable接口所以你可以繼承java.lang.Thread 類或者直接調用Runnable接口來重寫run()方法實現線程。更多詳細信息請點擊這裡。5. 什麼是線程安全?Vector是一個線程安全類嗎?