線程 進程 鎖

什麼是進程?
當一個程序開始運行時,它就是一個進程,進程包括運行中的程序和程序所使用到的內存和系統資源。
而一個進程又是由多個線程所組成的。


什麼是線程?
線程是程序中的一個執行流,每個線程都有自己的專有寄存器(棧指針、程序計數器等),但代碼區是共享的,
即不同的線程可以執行同樣的函數。

 

什麼是多線程?
多線程是指程序中包含多個執行流,即在一個程序中可以同時運行多個不同的線程來執行不同的任務,
也就是說允許單個程序創建多個並行執行的線程來完成各自的任務。


多線程的好處:
可以提高CPU的利用率。在多線程程序中,一個線程必須等待的時候,CPU可以運行其它的線程而不是等待,
這樣就大大提高了程序的效率。 

 

多線程的不利方面:
線程也是程序,所以線程需要佔用內存,線程越多佔用內存也越多; 
多線程需要協調和管理,所以需要CPU時間跟蹤線程; 
線程之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題;
線程太多會導致控制太複雜,最終可能造成很多Bug;


多線程與單線程的區別
生活舉例
你早上上班,正要打卡的時候,手機響了。。你如果先接了電話,等接完了,在打卡,就是單線程。
如果你一手接電話,一手打卡。就是多線程。
2件事的結果是一樣的。。你接了電話且打了卡。

 

多線程處理的優點
同步應用程序的開發比較容易,但由於需要在上一個任務完成後才能開始新的任務,所以其效率通常比多線程應用程序低。如果完成同步任務所用的時間比預計時間長,應用程序可能會不響應。多線程處理可以同時運行多個過程。例如,文字處理器應用程序在您處理文檔的同時,可以檢查拼寫(作爲單獨的任務)。由於多線程應用程序將程序劃分成獨立的任務,因此可以在以下方面顯著提高性能: 
多線程技術使程序的響應速度更快,因爲用戶界面可以在進行其他工作的同時一直處於活動狀態。 
當前沒有進行處理的任務可以將處理器時間讓給其他任務。 
佔用大量處理時間的任務可以定期將處理器時間讓給其他任務。 
可以隨時停止任務。 
可以分別設置各個任務的優先級以優化性能。 

是否需要創建多線程應用程序取決於多個因素。在以下情況下,最適合採用多線程處理:
耗時或大量佔用處理器的任務阻塞用戶界面操作。 
各個任務必須等待外部資源(如遠程文件或 INTERNET 連接)。 

例如,用於跟蹤 WEB 頁上的鏈接並下載滿足特定條件的文件的 INTERNET 應用程序“ROBOT”。這種應用程序可以依次同步下載各個文件,也可以使用多線程同時下載多個文件。多線程方法比同步方法的效率高很多,因爲即使在某些線程中遠程 WEB 服務器的響應非常慢,也可以下載文件。

下面是多線程的例子
還在DOS時代,人們就在尋求一種多任務的實現。於是出現了TSR類型的後臺駐留程序,比較有代表性的有SIDE KICK、VSAFE等優秀的TSR程序,這類程序的出現和應用確實給用戶使用計算機帶來了極大的方便,比如SIDE KICK,們編程可以在不用進編輯程序的狀態下,一邊編輯源程序,一邊編譯運行,非常方便。但是,DOS單任務操作系統的致命缺陷註定了在DOS下不可能開發出真正的多任務程序。進入WINDOWS3.1時代,這種情況依然沒有根本的改變,一次應用只能做一件事。比如數據庫查詢,除非應用編得很好,在查詢期間整個系統將不響應用戶的輸入。
 進入了WINDOWS NT和WINDOWS 9X時代,情況就有了徹底的改觀,操作系統從真正意義上實現了多任務(嚴格地說,WIN9X還算不上)。一個應用程序,在需要的時候可以有許多個執行線程,每個線程就是一個小的執行程序,操作系統自動使各個線程共享CPU資源,確保任一線程都不能使系統死鎖。這樣,在編程的時候,可以把費時間的任務移到後臺,在前臺用另一個線程接受用戶的輸入。對那些對實時性要求比較高的編程任務,如網絡客戶服務、串行通信等應用時,多線程的實現無疑大大地增強了程序的可用性和穩固性。

================================================================================================

壞處:增加了調度和管理的開銷,帶來了一些不確定性,需要複雜的同步機制,避免死鎖等等。
好處:一定程度上提高響應速度,在多核的情況下還是更能充分利用CPU資源的。

================================================================================================

如果線程出現死鎖,唯一能證明的就是應用程序有問題,這並不是線程的缺點。

 

線程與進程比較

線程相對於進程的優點
1、開銷小
2、資源共享性好。

線程相對於進程的缺點
1、共享資源需要耗費一定的鎖資源,同步相對複雜。
2、一個線程崩潰可能導致整個進程崩潰,這個當然是自己的應用程序有問題

轉載於:單線程與多線程的區別

 

================================================================================================

 

public class ThreadTest {

    private static Integer n1 = 0;

    private static Integer n2 = 0;

    private static Integer n3 = 0;

    private static AtomicInteger integer1 = new AtomicInteger();

    private static Lock lock = new ReentrantLock();

    private static Object obj = new Object();

    public static void main(String[] args) throws InterruptedException {
        final int[] a = { 0 };

        for (int i = 0; i < 5000; i++) {
            new Thread() {
                @Override
                public void run() {

                    //方法裏的變量
                    a[0]++;

                    //鎖:synchronized基於JVM層面實現的
                    synchronized (obj) {
                        n1++;
                    }

                    //鎖:Lock基於JDK層面實現的
                    lock.lock();
                    n2++;
                    lock.unlock();

                    n3++;

                    integer1.getAndIncrement();
                }
            }.start();
        }

        Thread.sleep(5000);

        System.out.println("a:" + a[0]);
        System.out.println("n1:" + n1);
        System.out.println("n2:" + n2);
        System.out.println("n3:" + n3);
        System.out.println("integer:" + integer1.get());
    }

說到線程就要用到鎖

synchronize原理

深入理解ReentrantLock

說到鎖就要了解

MySQL 樂觀鎖&悲觀鎖 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章