Java多執行緒之synchronized的小介紹

2021-09-11 12:58:40 字數 1688 閱讀 1909

首先先看看下面的**:

public class checksynchronized extends thread

@override

public void run

() }

public static void main(string args) throws interruptedexception

}複製**

執行上述**,你會發現大部分情況下i的最終值都會小於2000000的

這是因為volatile只保證可見性,不保證原子性

關鍵字synchronized的作用就是實現執行緒間的同步問題,它能將同步區的**進行加鎖,一次只能允許一條執行緒進入同步區,以保證同步區中的執行緒安全問題。 下面就來測試下該關鍵字的作用:

public class checksynchronized extends thread

static volatile int i = 0;

public static void increase

() @override

public void run

() }

}public static void main(string args) throws interruptedexception

}複製**

大家可以看到在run()方法裡加了synchronized,並且指定了鎖物件。

執行結果:i : 2000000

public static void main(string args) throws interruptedexception 

複製**

這段**表示出各自執行緒最終使用了各自的鎖,執行緒安全是無法保證的。

public class checksynchronized implements runnable

@override

public void run

() }

public static void main(string args) throws interruptedexception

}複製**

上述**的synchronized作用在例項方法上,鎖為當前例項。所以在main方法中只例項了乙個checksynchronized例項,因為鎖只需要乙個、多了就會出現安全問題。

如果例項了兩個物件,則會出現安全問題(鎖多了和不加鎖就沒啥區別了),如下述**:

public static void main(string args) throws interruptedexception 

複製**

public static synchronized void increase()這樣鎖就作用在類方法上了。當執行緒要執行該同步方法時是請求當前類的鎖並非例項的鎖,所以再多的例項執行緒之間依舊能正確同步。

synchronized不僅用於執行緒同步、確保執行緒安全問題外,還能保證執行緒之間的可見性和有序性問題。相當於是volatile的公升級版。但被synchronized限制的多執行緒之間是序列執行的,所帶來的效能消耗是很大的。

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...

java 多執行緒 之 Excutor

excutor介面 提供了一種將任務提交和任務執行機制相分離的方法 excutorservice介面 提供了excutor的管理介面,以及可為跟蹤乙個或多個非同步任務狀態而生成future的方法 scheduledexcutorservice介面 提供了可以安排在給定的延遲後執行或定時執行的命令 方...