精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Synchronized 加鎖 This 和Class 的區(qū)別!

開發(fā) 后端
synchronized 是 Java 語言中處理并發(fā)問題的一種常用手段,它也被我們親切的稱之為“Java 內(nèi)置鎖”,由此可見其地位之高。然而 synchronized 卻有著多種用法,當(dāng)它修飾不同對象時(shí),其意義也是不同的,下面我們一起來看。

[[414654]]

本文轉(zhuǎn)載自微信公眾號「Java中文社群」,作者磊哥。轉(zhuǎn)載本文請聯(lián)系Java中文社群公眾號。

synchronized 是 Java 語言中處理并發(fā)問題的一種常用手段,它也被我們親切的稱之為“Java 內(nèi)置鎖”,由此可見其地位之高。然而 synchronized 卻有著多種用法,當(dāng)它修飾不同對象時(shí),其意義也是不同的,下面我們一起來看。

synchronized 用法

synchronized 可以用來修飾普通方法、靜態(tài)方法和代碼塊。

① 修飾普通方法

  1. /** 
  2.  * synchronized 修飾普通方法 
  3.  */ 
  4. public synchronized void method() { 
  5.     // ....... 

當(dāng) synchronized 修飾普通方法時(shí),被修飾的方法被稱為同步方法,其作用范圍是整個(gè)方法,作用的對象是調(diào)用這個(gè)方法的對象。

② 修飾靜態(tài)方法

  1. /** 
  2.  * synchronized 修飾靜態(tài)方法 
  3.  */ 
  4. public static synchronized void staticMethod() { 
  5.     // ....... 

當(dāng) synchronized 修飾靜態(tài)的方法時(shí),其作用的范圍是整個(gè)方法,作用對象是調(diào)用這個(gè)類的所有對象。

③ 修飾代碼塊

為了減少鎖的粒度,我們可以選擇在一個(gè)方法中的某個(gè)部分使用 synchronized 來修飾(一段代碼塊),從而實(shí)現(xiàn)對一個(gè)方法中的部分代碼進(jìn)行加鎖,實(shí)現(xiàn)代碼如下:

  1. public void classMethod() throws InterruptedException { 
  2.     // 前置代碼... 
  3.      
  4.     // 加鎖代碼 
  5.     synchronized (SynchronizedExample.class) { 
  6.         // ...... 
  7.     } 
  8.      
  9.     // 后置代碼... 

以上代碼在執(zhí)行時(shí),被修飾的代碼塊稱為同步語句塊,其作用范圍是大括號“{}”括起來的代碼塊,作用的對象是調(diào)用這個(gè)代碼塊的對象。

但以上代碼,除了可以加鎖 class 之外,還可以加鎖 this,具體示例如下:

  1. public void classMethod() throws InterruptedException { 
  2.     // 前置處理代碼... 
  3.     synchronized (this) { 
  4.         // ...... 
  5.     } 
  6.     // 后置處理代碼... 

那問題來了,使用 synchronized 加鎖 this 和 class 的區(qū)別是什么?不都是加鎖同一個(gè)類嗎?

答案還真不是,加鎖 this 和 class 區(qū)別還是很大的。下面我們通過以下 4 個(gè)示例,來看二者之間的區(qū)別。

1.加鎖 class 共享一個(gè)類實(shí)例

首先,我們創(chuàng)建 5 個(gè)線程,調(diào)用同一個(gè)對象下 synchronized 加鎖的 class 代碼,具體示例如下:

  1. import java.util.Date
  2. import java.util.concurrent.TimeUnit; 
  3.  
  4. public class SynchronizedExample { 
  5.  
  6.     public static void main(String[] args) { 
  7.         // 創(chuàng)建當(dāng)前類實(shí)例 
  8.         final SynchronizedExample example = new SynchronizedExample(); 
  9.         // 創(chuàng)建 5 個(gè)線程執(zhí)行任務(wù) 
  10.         for (int i = 0; i < 5; i++) { 
  11.             new Thread(new Runnable() { 
  12.                 @Override 
  13.                 public void run() { 
  14.                     try { 
  15.                         // 調(diào)用 synchronized 修飾的 class 方法 
  16.                         example.classMethod(); 
  17.                     } catch (InterruptedException e) { 
  18.                         e.printStackTrace(); 
  19.                     } 
  20.                 } 
  21.             }).start(); 
  22.         } 
  23.     } 
  24.  
  25.     /** 
  26.      * synchronized 修飾的 class 方法 
  27.      * @throws InterruptedException 
  28.      */ 
  29.     public void classMethod() throws InterruptedException { 
  30.         synchronized (SynchronizedExample.class) { 
  31.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s"
  32.                     Thread.currentThread().getName(), new Date())); 
  33.             TimeUnit.SECONDS.sleep(1); 
  34.         } 
  35.     } 

以上程序的執(zhí)行結(jié)果如下:

從上述結(jié)果可以看出,這 5 個(gè)線程共享的是同一把鎖。

2.加鎖 class 創(chuàng)建多個(gè)實(shí)例

接下來,我們創(chuàng)建 5 個(gè)線程,調(diào)用不同對象下 synchronized 加鎖的 class 代碼,具體示例如下:

  1. import java.util.Date
  2. import java.util.concurrent.TimeUnit; 
  3.  
  4. public class SynchronizedExample { 
  5.  
  6.     public static void main(String[] args) { 
  7.         // 創(chuàng)建 5 個(gè)線程執(zhí)行任務(wù) 
  8.         for (int i = 0; i < 5; i++) { 
  9.             new Thread(new Runnable() { 
  10.                 @Override 
  11.                 public void run() { 
  12.                     try { 
  13.                         // 創(chuàng)建類實(shí)例 
  14.                         SynchronizedExample example = new SynchronizedExample(); 
  15.                         // 調(diào)用 synchronized 修飾的 class 方法 
  16.                         example.classMethod(); 
  17.                     } catch (InterruptedException e) { 
  18.                         e.printStackTrace(); 
  19.                     } 
  20.                 } 
  21.             }).start(); 
  22.         } 
  23.     } 
  24.      
  25.     /** 
  26.      * synchronized 修飾的 class 方法 
  27.      * @throws InterruptedException 
  28.      */ 
  29.     public void classMethod() throws InterruptedException { 
  30.         synchronized (SynchronizedExample.class) { 
  31.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s"
  32.                     Thread.currentThread().getName(), new Date())); 
  33.             TimeUnit.SECONDS.sleep(1); 
  34.         } 
  35.     } 

以上程序的執(zhí)行結(jié)果如下:

從上述結(jié)果可以看出,雖然是不同的對象,但它們使用的仍然是同一把鎖。

3.加鎖 this 共享一個(gè)類實(shí)例

接下來,我們創(chuàng)建 5 個(gè)線程,調(diào)用 synchronized 加鎖 this 的示例。首先我們這 5 個(gè)線程調(diào)用同一個(gè)對象的加鎖方法,示例代碼如下:

  1. import java.util.Date
  2. import java.util.concurrent.TimeUnit; 
  3.  
  4. public class SynchronizedExample { 
  5.  
  6.     public static void main(String[] args) { 
  7.         // 創(chuàng)建當(dāng)前類實(shí)例 
  8.         final SynchronizedExample example = new SynchronizedExample(); 
  9.         // 創(chuàng)建 5 個(gè)線程執(zhí)行任務(wù) 
  10.         for (int i = 0; i < 5; i++) { 
  11.             new Thread(new Runnable() { 
  12.                 @Override 
  13.                 public void run() { 
  14.                     try { 
  15.                         // 調(diào)用 synchronized 修飾的 this 方法 
  16.                         example.thisMethod(); 
  17.                     } catch (InterruptedException e) { 
  18.                         e.printStackTrace(); 
  19.                     } 
  20.                 } 
  21.             }).start(); 
  22.         } 
  23.     } 
  24.      
  25.     /** 
  26.      * synchronized 修飾的 this 方法 
  27.      * @throws InterruptedException 
  28.      */ 
  29.     public void thisMethod() throws InterruptedException { 
  30.         synchronized (this) { 
  31.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s"
  32.                     Thread.currentThread().getName(), new Date())); 
  33.             TimeUnit.SECONDS.sleep(1); 
  34.         } 
  35.     } 

以上程序的執(zhí)行結(jié)果如下:

從上述結(jié)果可以看出,以上線程使用的都是同一把鎖。

4.加鎖 this 創(chuàng)建多個(gè)類實(shí)例

最后一個(gè)示例最為特殊,我們使用 synchronized 加鎖 this,讓這 5 個(gè)線程調(diào)用各自創(chuàng)建對象的方法,具體示例如下:

  1. import java.util.Date
  2. import java.util.concurrent.TimeUnit; 
  3.  
  4. public class SynchronizedExample { 
  5.  
  6.     public static void main(String[] args) { 
  7.         // 創(chuàng)建 5 個(gè)線程執(zhí)行任務(wù) 
  8.         for (int i = 0; i < 5; i++) { 
  9.             new Thread(new Runnable() { 
  10.                 @Override 
  11.                 public void run() { 
  12.                     try { 
  13.                         // 創(chuàng)建(多個(gè))類實(shí)例 
  14.                         SynchronizedExample example = new SynchronizedExample(); 
  15.                         // 調(diào)用 synchronized 修飾的 this 方法 
  16.                         example.thisMethod(); 
  17.                     } catch (InterruptedException e) { 
  18.                         e.printStackTrace(); 
  19.                     } 
  20.                 } 
  21.             }).start(); 
  22.         } 
  23.     } 
  24.      
  25.     /** 
  26.      * synchronized 修飾的 this 方法 
  27.      * @throws InterruptedException 
  28.      */ 
  29.     public void thisMethod() throws InterruptedException { 
  30.         synchronized (this) { 
  31.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s"
  32.                     Thread.currentThread().getName(), new Date())); 
  33.             TimeUnit.SECONDS.sleep(1); 
  34.         } 
  35.     } 

以上程序的執(zhí)行結(jié)果如下:

從上述結(jié)果可以看出,當(dāng)使用 synchronized 加鎖 this 時(shí),如果線程調(diào)用的不是同一個(gè)對象,那么這些線程之間使用的鎖都是自己獨(dú)立的鎖,這個(gè)結(jié)果就和 synchronized 加鎖 class 的結(jié)果完全不同了。

總結(jié)

通過以上 4 個(gè)示例我們可以得出結(jié)論,當(dāng)使用 synchronized 加鎖 class 時(shí),無論共享一個(gè)對象還是創(chuàng)建多個(gè)對象,它們用的都是同一把鎖,而使用 synchronized 加鎖 this 時(shí),只有同一個(gè)對象會使用同一把鎖,不同對象之間的鎖是不同的。

 

責(zé)任編輯:武曉燕 來源: Java中文社群
相關(guān)推薦

2021-08-24 10:25:19

thisclassJava

2024-02-26 07:36:09

lockJava語言

2022-04-24 07:59:53

synchronizJVMAPI

2023-02-01 07:15:16

2020-03-10 10:25:38

volatileJava編程語言

2021-02-01 14:10:16

JavaClass.forNaClassLoader

2022-11-09 10:46:18

AQS加鎖機(jī)制

2025-09-09 07:05:51

2021-08-31 06:37:35

Java 語言 Java 基礎(chǔ)

2020-09-23 09:08:05

typescript

2010-08-30 10:52:39

CSSclassid

2010-08-23 14:16:17

DIVclassid

2009-10-10 14:40:03

C++中struct

2021-01-14 08:58:12

Synchronize鎖操作

2010-08-23 10:57:14

CSSclassid

2009-08-27 15:48:40

interfaceabstract cl

2009-08-27 16:22:58

interfaceabstract cl

2017-12-06 16:28:48

Synchronize實(shí)現(xiàn)原理

2025-01-02 12:59:55

Python面向?qū)ο缶幊?/a>type

2021-03-04 08:26:17

synchronizeReentrantLojava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

日本特黄久久久高潮| vam成人资源在线观看| av中文一区二区三区| 性欧美激情精品| 日韩人妻一区二区三区| 99欧美精品| 亚洲午夜久久久久中文字幕久| 精品无人区一区二区三区竹菊| 69xxxx国产| 欧美va天堂在线| 亚洲欧美国产另类| 国产三级精品三级在线| 国产在线精彩视频| 中文字幕一区二区5566日韩| 国产精品视频福利| 亚洲天堂网在线视频| 国产综合精品一区| 国产一区二区黄| 四虎永久免费观看| 日本综合视频| 五月婷婷久久丁香| 99久久久无码国产精品性色戒| 四虎在线观看| 国产精品亚洲第一| 国产日本欧美在线观看| 日韩黄色一级大片| 国产精品免费在线视频| 日本免费中文字幕在线| 99麻豆久久久国产精品免费| 国产精品视频xxxx| 九九九在线观看| 欧美日韩亚洲一区| 久久精品国产精品| 成熟人妻av无码专区| 久久久久97| 日韩一区二区三区电影在线观看 | 午夜精品久久久久久久| 一区二区成人国产精品 | 一区二区三区| 91国偷自产一区二区三区成为亚洲经典 | 久久理论片午夜琪琪电影网| 中文乱码字幕高清一区二区| 国产精品一国产精品| 日韩av综合网站| 高清中文字幕mv的电影| 欧美视频二区欧美影视| 欧美区视频在线观看| 国产一级做a爰片久久| 二区三区不卡| 欧美午夜片欧美片在线观看| 久久精品国产sm调教网站演员| 亚洲区欧洲区| 亚洲人成在线观看一区二区| 亚洲永久激情精品| 日韩伦理在线电影| 中文字幕中文字幕一区二区| 神马影院我不卡| 一级免费黄色录像| 成人激情视频在线播放| 男女一区二区三区| 91麻豆精品国产91久久久久推荐资源| 欧美一区二区三区性视频| 超碰在线公开97| 黄色日韩网站| 欧美日本乱大交xxxxx| jizzzz日本| 国产成人午夜性a一级毛片| 91福利区一区二区三区| 欧美精品成人网| 国产精品美女午夜爽爽| 欧美日韩视频不卡| 亚洲黄色av片| 日韩精品视频中文字幕| 欧美xxx久久| 怡红院一区二区| 日韩美脚连裤袜丝袜在线| 国产视频精品va久久久久久| av女人的天堂| 欧美一级淫片| 久久精品夜夜夜夜夜久久| 午夜国产福利一区二区| 黄页网站一区| 欧美在线免费观看| 中文字字幕在线中文乱码| 久久91精品国产91久久小草| 91在线精品观看| 午夜性色福利影院| 久久久精品免费网站| 中文字幕日韩一区二区三区不卡 | 久久精品一区中文字幕| 麻豆亚洲av熟女国产一区二| 一区二区毛片| 国产日韩精品入口| 国产黄a三级三级看三级| 99精品一区二区| 亚洲成人网上| 黑人玩欧美人三根一起进 | 亚洲精品国产欧美在线观看| 九色综合狠狠综合久久| 国产精品久久亚洲| eeuss影院www在线观看| 亚洲自拍偷拍av| 玩弄japan白嫩少妇hd| 999色成人| 精品丝袜一区二区三区| 日韩三级久久久| 国产欧美欧美| 亚洲最大av网| 国产九九在线| 亚洲在线视频网站| 青青草精品视频在线观看| 999精品视频在这里| 在线日韩第一页| 99精品视频99| 国产一区在线观看麻豆| 欧美一区1区三区3区公司 | 国产盗摄xxxx视频xxx69| 99视频在线观看免费| 国产亚洲人成网站| 免费毛片网站在线观看| 91成人福利社区| 亚洲视频在线视频| 国产乡下妇女做爰| 国产综合成人久久大片91| 日韩影视精品| 性孕妇free特大另类| 日韩欧美在线一区二区三区| 午夜国产福利视频| 老司机精品导航| 精品一区二区三区视频日产| av电影高清在线观看| 欧美三级电影网站| 天天躁夜夜躁狠狠是什么心态| 激情文学一区| av免费观看久久| 高清免费电影在线观看| 欧美亚洲日本一区| 亚洲第一香蕉网| 91久久视频| 成人动漫在线观看视频| 黄色在线免费网站| 欧美日韩日本视频| 91麻豆精品国产91久久综合| 久久久久国产精品一区二区| 精品一区二区三区自拍图片区 | 亚洲一区二区三区中文字幕| 亚洲妇熟xx妇色黄蜜桃| 色欧美自拍视频| 国产日本欧美一区二区三区在线 | 欧美理论片在线观看| 一级做a爱片久久毛片| 国产精品水嫩水嫩| 777视频在线| 色97色成人| 91久热免费在线视频| 免费a级人成a大片在线观看| 欧美片在线播放| 永久av免费网站| 久久91精品久久久久久秒播| 中文字幕成人一区| 国产高清亚洲| 色综合久久精品亚洲国产| 亚洲欧美另类一区| 五月婷婷综合网| 女~淫辱の触手3d动漫| 久久午夜精品| 五月天亚洲综合情| 四虎精品永久免费| 久久精品人人做人人爽| 精品人妻伦一二三区久久| 亚洲综合激情网| 中文文字幕文字幕高清| 亚洲深爱激情| 深夜福利成人| 日韩在线观看中文字幕| 午夜精品视频在线| 国产中文字幕在线观看| 欧美日韩另类一区| 日本a级片视频| av成人动漫在线观看| 国产精品免费入口| 久久理论电影| 99电影网电视剧在线观看| 国产三级电影在线播放| 亚洲性线免费观看视频成熟| 一卡二卡三卡在线观看| 亚洲一二三四在线| 国产特黄级aaaaa片免| 久久精品国产第一区二区三区| 青青视频免费在线| 日韩美脚连裤袜丝袜在线| 国产精品无码专区在线观看| 成人ww免费完整版在线观看| 亚洲国产精品大全| 日韩xxx视频| 亚洲午夜电影在线观看| 亚洲人成人无码网www国产| 激情图片小说一区| 无码人妻丰满熟妇区96| 99久久综合| 久久久人人爽| 久久综合给合| 日本欧美在线视频| 在线电影福利片| 国产亚洲福利一区| 国精品人妻无码一区二区三区喝尿| 欧美性xxxx极品高清hd直播| 2018天天弄| 欧美高清在线一区二区| 91成人在线观看喷潮蘑菇| 天堂久久久久va久久久久| 免费网站永久免费观看| 成人亚洲一区| 蜜桃成人免费视频| 亚洲国产欧美国产第一区| 国产精品老女人精品视频| free性m.freesex欧美| 久久精品国产一区二区三区| 欧美在线观看在线观看| 日韩精品中文字幕在线一区| 亚洲天堂2021av| 日韩欧美中文字幕在线播放| 真实国产乱子伦对白在线| 国产午夜精品美女毛片视频| 在线视频 日韩| 国产高清亚洲一区| 五月激情五月婷婷| 日本在线不卡视频| 丰满爆乳一区二区三区| 好看的亚洲午夜视频在线| 樱空桃在线播放| 色喇叭免费久久综合网| 欧洲一区二区日韩在线视频观看免费 | 日本中文字幕在线视频| 亚洲欧美制服第一页| 无码精品人妻一区二区三区影院| 日韩午夜在线观看视频| 97在线视频人妻无码| 欧美亚一区二区| 91青青草视频| 色噜噜久久综合| 免费视频久久久| 欧美小视频在线| 日韩 欧美 综合| 午夜电影一区二区| 久久午夜无码鲁丝片午夜精品| 亚洲日韩欧美一区二区在线| 久久精品在线观看视频| 中文字幕在线不卡国产视频| 中文字幕精品亚洲| 中文字幕av免费专区久久| av小说在线观看| 国产人伦精品一区二区| 欧美性受xxxx黑人| 中文字幕第一区第二区| www亚洲色图| 国产精品妹子av| 2014亚洲天堂| 亚洲精品成人精品456| 久久国产一级片| 亚洲香蕉伊在人在线观| 日韩av片在线播放| 精品久久久久久久久久ntr影视| 成人免费区一区二区三区| 精品国产福利视频| 久久久精品福利| 欧美性感一类影片在线播放| 成人黄色三级视频| 欧美色视频在线观看| 国产乱码精品一区二三区蜜臂 | 色男人天堂av| 福利一区在线观看| 麻豆国产精品一区| 国产片一区二区| 日本高清不卡免费| 亚洲国产精品久久艾草纯爱| 国产精品999在线观看| 色久优优欧美色久优优| 亚洲天堂aaa| 欧美精品一区二区三区在线| 日本一区高清| xxxxx成人.com| heyzo高清国产精品| 国产91精品网站| 成人51免费| 九九久久99| 99视频精品全国免费| www.av蜜桃| 奇米影视一区二区三区| 手机看片国产精品| 91蜜桃在线免费视频| 国产黄a三级三级| 亚洲一区二区黄色| 中文字幕激情视频| 欧美xfplay| jizz亚洲| 97视频在线观看免费高清完整版在线观看 | 加勒比av中文字幕| 91一区二区在线| 国产午夜精品理论片| 精品国产91久久久久久老师| 亚洲一级视频在线观看| 亚洲精品97久久| 国产三区视频在线观看| 日本精品视频在线| 伊人久久影院| 在线成人性视频| 蘑菇福利视频一区播放| 黄色a级三级三级三级| 国产亚洲综合在线| 国产无码精品在线播放| 538在线一区二区精品国产| 亚洲欧美日本在线观看| 欧美成人久久久| 久久久加勒比| 欧美日韩一区二区视频在线观看| 午夜日韩av| 中文字幕在线视频精品| 国产婷婷一区二区| 日韩成人在线免费视频| 日韩一区二区三区免费观看 | 欧美高清视频一区二区| 88xx成人网| 欧美日韩一区二区三| 亚洲精选91| 蜜桃色一区二区三区| 中文字幕一区二区三区蜜月| 国产午夜无码视频在线观看| 亚洲精品福利资源站| 波多野结衣中文字幕久久| 亚洲一区二区三区xxx视频| 成人直播大秀| 青青草av网站| 久久精品欧美日韩| 五月天激情国产综合婷婷婷| 精品国产污污免费网站入口| 国产在线二区| 91久久中文字幕| 婷婷成人基地| 手机免费看av网站| 亚洲视频一区二区在线| 91 中文字幕| 俺去亚洲欧洲欧美日韩| 美女久久久久久| 亚洲午夜精品一区二区三区| 三级久久三级久久| 国产小视频自拍| 色呦呦国产精品| 黄网在线免费| 国产精品视频不卡| 欧美freesextv| 黄色aaaaaa| 一区二区三区丝袜| 亚洲成人一二三区| 久久久欧美一区二区| 嫩草国产精品入口| 国产乱子伦农村叉叉叉| 91色porny| 中文字幕理论片| 色七七影院综合| 午夜精品久久久久久毛片| 国产系列第一页| 国产999精品久久| 日韩精品一卡二卡| 精品视频在线播放| 草莓视频成人appios| 致1999电视剧免费观看策驰影院| 精品一区二区久久久| 成人涩涩小片视频日本| 精品国产乱码久久久久久浪潮| 国产不卡123| 日韩av电影免费观看| 久久国产综合精品| 欧美人妻精品一区二区三区 | 亚洲黄色三级| 性少妇bbw张开| 欧美日产国产精品| 女同视频在线观看| 欧美日韩精品免费观看视一区二区| 日韩在线卡一卡二| 成人免费精品动漫网站| 精品国产乱码久久久久久1区2区| 欧亚av在线| 亚洲一区二区三区免费观看| 懂色av一区二区三区免费看| 无码人妻精品一区二区三区9厂| 中文一区二区视频| 亚洲第一二区| 日日摸天天爽天天爽视频| 亚洲视频狠狠干| 同心难改在线观看| 成人福利在线观看| 国产农村妇女毛片精品久久莱园子 | 日本精品免费在线观看| 国产精品视频一二三| 亚洲精品视频91| 国产精品美女呻吟| 亚洲黄色一区| 精品人妻伦九区久久aaa片| 精品一区二区三区四区|