搜尋
首頁Javajava教程什麼是synchronized?如何使用synchronized?

synchronized

前言

相信大家都聽說過線程安全問題,在學習作業系統的時候有一個知識點是臨界資源,簡單的說就是一次只能讓一個行程操作的資源,但是我們在使用多執行緒的時候是並發操作的,並不能控制同時只對一個資源的存取和修改,想要控制那麼有幾種操作,今天我們就來講講第一種方法:執行緒同步區塊或執行緒同步方法(synchronized)

實例

  1. 下面舉個範例說明synchronized關鍵字的使用

執行緒同步方法

public class Sychor {public void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
##其中輸出結果為下圖

什麼是synchronized?如何使用synchronized?

從上面的結果可以看出這裡的兩個執行緒是同時執行

insert()方法的,下面我們在原有的程式碼上加入synchronized關鍵字看看效果如何,程式碼如下:

public class Sychor {public synchronized void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
上面程式的運行結果我就不列出來,自己可以試試,總之就是加上了

synchronized關鍵字使得執行緒是一個一個的執行的,只有先執行完一個執行緒才能執行了另外一個執行緒。

執行緒同步區塊

當然上面的我們使用的是執行緒同步方法,我們可以使用執行緒同步區塊,這兩個相比執行緒同步區塊更加靈活,只需要將需要同步的程式碼放在同步區塊中即可,程式碼如下;

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
            
        }
        

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
從上面的程式碼可以看出這種方式更加靈活,只需要將需要同步的程式碼方法在同步區塊中,不需要同步的程式碼放在外面

詳細原因

    ##我們知道
  1. 每個物件都有一把鎖

    ,當我們使用執行緒同步方法或執行緒同步區塊的時候實際上獲得是物件的唯一的一把鎖,當一個執行緒獲得了這唯一的鎖,那麼其他的線程只能拒之門外了,注意這裡我們說是一個對象,也就是說是同一個對象,如果是不同的對象,那麼就不起作用了,因為不同對像有不同的對象鎖,比如我們將上面的程式改成如下:

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
        }

    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor sychor = new Sychor();   //在run() 方法中创建一个对象sychor.insert(Thread.currentThread());
            };
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor sychor = new Sychor();  //创建另外的一个对象sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
從上面的結果可知,此時執行緒同步區塊根本不起作用,因為他們呼叫的是
不同物件

的insert方法,得到鎖是不一樣的

    #上面我們已經說過一個物件有一把鎖,線程同步方法和線程同步區塊實際獲得的是物件的鎖,因此線程同步區塊的括號中填入的是
  1. this

    ,我們都知道this在一個類別中的意義

  1. 一個類別也有唯一的鎖

    #,我們前面說的是使用物件呼叫成員方法,現在如果我們要呼叫類別中的靜態方法,那麼我們可以使用執行緒同步方法或同步區塊來獲得類別中的唯一一把鎖,那麼對於多個執行緒同時呼叫同一個類別中的靜態方法就可以實現控制了,程式碼如下:

public class Sychor {// 静态方法public static synchronized void insert(Thread thread)  
    {for(int i=0;i<10;i++)
        {
            System.out.println(thread.getName()+"输出     "+i);
        }
    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());  //直接使用类调用静态方法};
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());   //直接使用类调用静态方法};
        };

        t1.start();
        t2.start();
    }
}
注意

##要想實作執行緒安全性和同步控制,如果執行的是非
    static
  1. 同步方法或其中的同步區塊,那麼一定要使用同一個對象,如果調用的是static同步方法或其中的同步區塊那麼一定要使用同一個類別去調用

如果一個執行緒存取的是
    static
  1. 同步方法,而另一個執行緒存取的是非static的同步方法,此時這兩個是不會發生衝突的,因為一個是類別的鎖,一個是物件的鎖

如果使用執行緒同步區塊,那麼同步區塊中的程式碼是控制存取的,但是外面的程式碼是所有執行緒都可以存取的
當一個正在執行同步程式碼區塊的執行緒出現了異常,那麼
    jvm
  1. 會自動釋放目前執行緒所佔用的鎖,因此不會出現由於異常導致死鎖的現象

  2. #參考文章

以上是什麼是synchronized?如何使用synchronized?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具