tft每日頭條

 > 科技

 > 合格程序員要敲多少行代碼

合格程序員要敲多少行代碼

科技 更新时间:2025-01-15 13:02:05

合格程序員要敲多少行代碼?多線程會共同使用一組計算機上的CPU,而線程數大于給程序分配的CPU數量時,為了各個線程都有執行的機會,就需要輪換使用CPU,不同的線程切換使用CPU發生的切換數據就是上下文切換,下面我們就來說一說關于合格程序員要敲多少行代碼?我們一起去了解并探讨一下這個問題吧!

合格程序員要敲多少行代碼(每日一練進擊大廠)1

合格程序員要敲多少行代碼

文章目錄
  • 一、多線程中的上下文切換
  • 二、死鎖問題
  • 三、如何避免死鎖
  • 四、活鎖
  • 五、饑餓
  • 六、如何停止一個正在運行的線程
  • 七、用戶線程和守護線程的區别
  • 八、線程優先級的理解
  • 九、volatile
  • 十、Synchronized
  • 十一、volatile和synchronized
  • 總結

一、多線程中的上下文切換

多線程會共同使用一組計算機上的CPU,而線程數大于給程序分配的CPU數量時,為了各個線程都有執行的機會,就需要輪換使用CPU,不同的線程切換使用CPU發生的切換數據就是上下文切換。

二、死鎖問題

死鎖是指兩個或兩個以上的線程在執行過程中,因争奪資源而造成的一種互相等待的現象,若無外力作用,它們都無法執行下去。産生死鎖的必要條件:

  1. 互斥條件:線程在某一時間獨占資源。
  2. 請求和保持條件:線程T1已經取得共享資源X,在等待共享資源Y,不釋放共享資源X。
  3. 不可剝奪條件:其他線程不能強行搶占線程T1占有的資源。
  4. 循環等待條件:線程T1等待線程T2占有的資源,線程T2等待線程T1占有的資源。
三、如何避免死鎖
  1. 破壞互斥條件:互斥是無法被破壞的,因為這是互斥鎖的基本約束。
  2. 破壞請求和保持條件:一次性申請所有的資源,這樣就不存在等待了。
  3. 破壞不可剝奪條件:當某進程獲得了部分資源,但得不到其他資源,則釋放已占有的資源,但是隻适用于内存和處理器資源。
  4. 破壞循環等待條件:給系統的所有資源編号,規定進程請求所需資源的順序必須按照資源的編号依次進行。
  5. 設置加鎖的順序:多個線程按照相同的順序來請求鎖,就不會出現循環的加鎖依賴性。
四、活鎖

任務或者執行者都沒有被阻塞,由于某些條件沒有滿足,導緻一直重複嘗試,失敗,嘗試,失敗。活鎖和死鎖的區别在于,處于活鎖的實體是在不斷的改變狀态,而處于死鎖的實體表現為等待,活鎖有可能自行解開,死鎖則不能。

五、饑餓

一個或者多個線程因為種種原因無法獲得所需要的資源,導緻一直無法執行的狀态。導緻饑餓的原因:

  1. 高優先級線程吞噬所有低優先級線程的CPU時間。
  2. 線程被永久堵塞在一個等待進入同步塊的狀态,因為其他線程總是能再它之前持續地對該同步塊進行訪問。
  3. 線程在等待一個本身也處于永久等待完成的對象(比如調用這個對象的wait方法),因為其他線程總是被持續地喚醒。
六、如何停止一個正在運行的線程
  • 使用退出标志,是線程正常退出,也就是當run方法完成後線程終止。
  • 使用stop方法強行終止,但是不推薦這個方法,這個方法已經過期了。
  • 使用interrupt方法中斷線程,這種方法并不是強制中斷,而是告訴正在運行的線程可以停止了,是否要中斷,取決于正在運行的線程,所以它能夠保證線程運行結果的安全性。

public class InterruptThreadDemo { public static void main(String[] args) throws InterruptedException { MyThreadDemo myThreadDemo = new MyThreadDemo(); System.out.println("==============="); Thread thread = new Thread(myThreadDemo); thread.start(); Thread.sleep(3000); System.out.println("Interrupt thread.." thread.getName()); thread.interrupt(); Thread.sleep(3000); System.out.println("stopping....."); } }

七、用戶線程和守護線程的區别

守護線程都是為JVM中所有非守護線程的運行提供便利服務,隻要當前JVM實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作,隻有當最後一個非守護線程結束時,守護線程才會随着JVM一同結束工作。那麼如何創建守護線程呢?任何線程都可以設置為守護線程和用戶線程,通過下列方法,true則是把該線程設置為守護線程,false則是用戶線程,該方法必須在start()方法之前調用,否則運行時會抛出異常。守護線程相當于後台管理者,比如進行内存回收,垃圾清理工作。

MyThreadDemo myThreadDemo1 = new MyThreadDemo(); Thread thread1 = new Thread(myThreadDemo1); thread1.setDaemon(true); thread1.start();

八、線程優先級的理解

每一個線程都是有優先級的,一般來說,高優先級的線程在運行時會具有優先權,但這依賴于線程調度的實現,這個實現是和操作系統相關的,可以定義線程的優先級,但是這并不能保證高優先級的線程會在低優先級的線程前執行,線程優先級是一個int變量從1-10,1代表最低優先級,10代表最高優先級,默認優先級是5;下面的方法是設置優先級的方法

Thread thread1 = new Thread(myThreadDemo1); thread1.setPriority(7);

九、volatile
  • 保證了不同線程對這個變量進行操作時的可見性,即一個線程修改了某個變量的值,這新值對其他線程來說是立即可見的。
  • 通過增加内存屏障防止多個指令之間的重排序(禁止指令重排序)。
十、Synchronized

Synchronized關鍵字解決的是多個線程之間訪問資源的同步性,Synchronized關鍵字可以保證它修飾的方法或者代碼塊在任意時刻隻能有一個線程執行。

  • 修飾實例方法:作用相當于當前對象實例加鎖,進入同步代碼前要獲得當前對象實例的鎖。
  • 修飾靜态方法:也就是給當前類加鎖,會作用于類的所有對象實例,因為靜态成員不屬于任何一個實例對象,是類成員。所以如果線程A調用一個實例對象的非靜态Synchronized方法,而線程B需要調用這個實例對象所屬類的靜态Synchronized方法,是不會發生互斥現象的。靜态的Synchronized方法占用的鎖是當前類的鎖,非靜态Synchronized方法占用的鎖是當前實例對象的鎖。
  • 修飾代碼塊:指定加鎖對象,對給定對象加鎖,進入同步代碼塊前要獲得給定對象的鎖。

//類鎖 修飾加鎖的類 void demo4(){ //類鎖 synchronized (SynchronizedDemo.class){ System.out.println(Thread.currentThread().getName() "demo4執行"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } //類鎖 靜态方法 synchronized static void demo2(){ System.out.println(Thread.currentThread().getName() "demo2執行"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } //鎖的是同一個對象 修飾代碼塊,指定對象 void demo3(){ //this 代表實例 同一個實例會被鎖住 synchronized (this){ System.out.println(Thread.currentThread().getName() "demo3執行"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } //普通方法 synchronized void demo1(){ System.out.println(Thread.currentThread().getName() "demo1執行"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } }

十一、volatile和synchronized
  • volatile本質是在告訴JVM當前變量在寄存器中的值是不确定的,需要從主存中讀取;synchronized則是鎖定當前變量,隻是當前線程可以訪問該變量,其他線程被阻塞。
  • volatile僅能在變量級别;synchronized則可以使用在變量、方法、類級别。
  • volatile僅能實現變量的修改可見性,并不能保證原子性;synchronized則可以保證變量的修改可見性和原子性。
  • volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。
  • volatile标記的變量不會被編輯器優化;synchronized标記的變量可以被編譯器優化。

總結

等等,我還有句話想說,你累嗎?我覺得今天有點累,但是累證明我還活着,說明我再上坡!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved