成人免费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

2024-03-15 11:52:03

C++關鍵字編程

2023-11-10 09:29:30

MySQLExplain

2009-06-29 18:14:23

Java多線程volatile關鍵字

2011-03-09 14:36:44

synchronizevolatile

2023-05-15 09:39:10

Java監視器鎖

2011-06-27 15:08:15

SEO

2019-10-29 19:49:48

Java線程安全

2009-09-17 09:30:00

Linq LET關鍵字

2022-01-04 16:35:42

C++Protected關鍵字

2009-09-02 09:24:03

C# this關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.久久久久久久久久久 | 日韩在线精品强乱中文字幕 | 久久精品这里精品 | 在线播放国产一区二区三区 | 黄色成人在线 | 国产免费一区二区三区网站免费 | 亚洲视频免费观看 | 野狼在线社区2017入口 | 精品视频一区二区三区在线观看 | 精品久久香蕉国产线看观看亚洲 | 免费精品 | 亚洲第一区久久 | 在线看中文字幕 | 中文字幕亚洲视频 | 玖玖综合在线 | 91精品国产99| 免费在线黄色av | 欧美黄色免费网站 | 午夜欧美一区二区三区在线播放 | 久久新 | 精品国产一区二区三区久久 | 亚洲大片在线观看 | 国产日韩在线观看一区 | 特一级黄色毛片 | 亚洲一区视频在线 | 精品一区二区电影 | 欧美中文字幕一区二区三区亚洲 | 成人av电影天堂 | 国产乱码高清区二区三区在线 | 久久久久无码国产精品一区 | 情侣酒店偷拍一区二区在线播放 | 岛国av一区二区 | 国产精品美女一区二区 | 高清黄色 | 亚洲精彩视频在线观看 | 国产精品亚洲成在人线 | 中文字幕视频在线观看 | 亚洲免费影院 | 精品日韩一区 | 操久久| 欧美精品中文字幕久久二区 |