成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

線程安全之Synchronized關鍵字

開發 前端
之前我講了關于 線程基礎方面的相關知識,本篇文章將會帶著大家來學習下線程安全相關的知識。

 之前我講了關于 線程基礎方面的相關知識,本篇文章將會帶著大家來學習下線程安全相關的知識。

[[286256]]

1 多線程下為什么會存在線程安全問題

線程的合理使用能夠提升程序的處理性能,一是能夠利用多核 CPU 來實現線程的并行執行,二是線程的異步化執行能夠提高系統的吞吐量。

雖然線程有這些優點,但同時也帶來了很多問題。比如說:

1.1 共享變量帶來的安全性問題

先來看個圖:

 

 

 

 

一個變量 i ,如果線程 A 或者線程 B 單獨訪問并且修改變量 i 的值沒有任何問題,那如果并行的修改變量 i ,那就會有安全性問題。

然后用代碼來模擬一下這種場景,為了更好的看到效果,我用100個線程:

 

  1. public class ThreadDemo1 { 
  2.  
  3.     private static int i = 0; 
  4.  
  5.     public static void inc() { 
  6.         try { 
  7.             Thread.sleep(1); 
  8.         } catch (InterruptedException e) { 
  9.             e.printStackTrace(); 
  10.         } 
  11.         i++; 
  12.     } 
  13.  
  14.     public static void main(String[] args) throws InterruptedException { 
  15.         for (int i = 0; i < 100; i++) { 
  16.             new Thread(() -> ThreadDemo1.inc()).start(); 
  17.         } 
  18.         Thread.sleep(1000); 
  19.         System.out.println("運行結果" + i); 
  20.     } 

輸出結果:

88

這個輸出結果是不固定的,第一次可能是 88 ,第二次可能是 87 ,這個結果就和我們預期的結果不一致(預期結果是100),所以一個對象是否是線程安全的,取決于它是否會被多個線程訪問,以及程序中是如何去使用這個對象的。如果 多個線程訪問同一個共享對象,在不需額外的同步以及調用端代碼不用做其他協調的情況下,這個共享對象的狀態 依然是正確的(正確性意味著這個對象的結果與我們預期 規定的結果保持一致),那說明這個對象是線程安全的。

對于線程安全性,本質上是管理對于數據狀態的訪問,而且這個這個狀態通常是共享的、可變的。共享:是指這個 數據變量可以被多個線程訪問;可變:指這個變量的值在 它的生命周期內是可以改變的。

2.如何保證線程并行的數據安全性-Synchroinzed

針對上面那種情況,我們該如何解決這種問題呢?首先想到的就是加鎖,并且這種鎖必須是互斥的。比如上面的圖片的例子,如果線程A在修改 i 的值時,線程 B 就不能去修改 i 的值。也就是說并行去修改共享變量的值會有線程安全性問題,那么我們不讓你并行,不就解決了這個問題嘛。所以java提供了 Synchroinzed 關鍵字。

2.1 Synchroinzed 的基本認識

Synchroinzed 很早就有了,只是之前是重量級鎖,所以很好有人使用。在 javaSE 1.6 對Synchroinzed進行了優化引入了偏向鎖和輕量級鎖。所以在并發量不高的情況還是推薦使用 Synchroinzed 來加鎖。為什么是并發量不高的情況推薦使用,因為并發量高的情況 Synchroinzed 會升級為重量級鎖。

2.2 Synchroinzed 的三種加鎖方式

  1. 修飾實例方法,鎖是當前實例對象 ,進入同步代碼前要獲得當前實例的鎖
  2. 修飾靜態方法,鎖是當前類的class對象 ,進入同步代碼前要獲得當前類對象的鎖
  3. 修飾代碼塊,鎖是括號里面的對象,對給定對象加鎖,進入同步代碼庫前要獲得給定對象的鎖。

看下簡單的代碼

 

  1. public class SynchroinzedDemo { 
  2.  
  3.     /** 
  4.      * 對靜態方法加鎖 
  5.      */ 
  6.     public static synchronized void test(){} 
  7.     /** 
  8.      * 對實例方法加鎖 
  9.      */ 
  10.     public synchronized void test1(){} 
  11.     /** 
  12.      * 對代碼塊加鎖 
  13.      */ 
  14.     public void test2(){ 
  15.         synchronized(this){} 
  16.     } 

然后我們將上面的例子實現 synchronized 加鎖:

 

  1. public class ThreadDemo1 { 
  2.  
  3.     private static int i = 0; 
  4.  
  5.     public static void inc() { 
  6.         synchronized (ThreadDemo1.class){ 
  7.             try { 
  8.                 Thread.sleep(1); 
  9.             } catch (InterruptedException e) { 
  10.                 e.printStackTrace(); 
  11.             } 
  12.             i++; 
  13.         } 
  14.     } 
  15.  
  16.     public static void main(String[] args) throws InterruptedException { 
  17.         for (int i = 0; i < 100; i++) { 
  18.             new Thread(() -> ThreadDemo1.inc()).start(); 
  19.         } 
  20.         Thread.sleep(1000); 
  21.         System.out.println("運行結果" + i); 
  22.     } 

運行結果:

運行結果100

完美的解決共享變量并行修改帶來的線程安全問題。

3 總結

本文帶著大家了解了一下線程的安全性問題和解決線程安全性問題的 synchronized 關鍵字的用法。后面的并發編程系列會講解更多的解決線程安全性的方法。敬請期待!

責任編輯:華軒 來源: Java極客技術
相關推薦

2017-05-27 20:59:30

Java多線程synchronize

2021-08-15 08:11:54

AndroidSynchronize關鍵字

2024-03-15 15:12:27

關鍵字底層代碼

2021-03-10 15:59:39

JavaSynchronize并發編程

2022-01-26 00:03:00

關鍵字線程JVM

2009-06-29 18:26:11

Java多線程Synchronize同步類

2021-01-12 09:22:18

Synchronize線程開發技術

2024-11-20 15:55:57

線程Java開發

2009-08-12 13:37:01

Java synchr

2009-12-18 11:37:54

Ruby關鍵字yiel

2023-11-10 09:29:30

MySQLExplain

2024-03-15 11:52:03

C++關鍵字編程

2009-06-29 18:14:23

Java多線程volatile關鍵字

2019-10-29 19:49:48

Java線程安全

2011-03-09 14:36:44

synchronizevolatile

2023-05-15 09:39:10

Java監視器鎖

2011-06-27 15:08:15

SEO

2009-08-21 14:58:56

C# this關鍵字

2013-01-30 10:12:14

Pythonyield

2018-04-20 15:56:09

Pythonglobal關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文在线亚洲 | 国产又爽又黄的视频 | 久久久国产精品网站 | 成人综合视频在线观看 | 成人av电影在线 | 国产区在线视频 | 婷婷中文在线 | 免费视频一区 | 欧产日产国产精品视频 | 亚洲精品在线播放 | 欧美一区二不卡视频 | 日韩不卡视频在线观看 | 91免费版在线观看 | 日韩成年人视频在线 | 国产日韩精品在线 | 97精品国产一区二区三区 | 亚洲一区久久 | 亚洲午夜精品 | 欧美日一区 | 欧洲一区二区视频 | 最新中文在线视频 | 国产精品无码永久免费888 | 免费av一区二区三区 | 精品91| 4hu最新网址 | 成人国产精品久久久 | 亚洲免费视频播放 | 国产一区二区三区四区三区四 | 毛片久久久 | 中文字幕日韩欧美 | 中文av在线播放 | 日韩av在线一区 | 亚洲一区二区免费视频 | 91精品国产色综合久久不卡98口 | 国产成人网 | 亚洲天堂av在线 | 精品久久久久久久久久久久 | 亚洲精品久久 | 久久国产福利 | 中文字幕第7页 | 亚洲一区欧美一区 |