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

synchronized 加鎖 this 和 class 的區(qū)別!

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

[[419166]]

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

synchronized 用法

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

① 修飾普通方法 

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

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

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

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

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

③ 修飾代碼塊

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

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

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

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

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

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

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

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

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

  1. import java.util.Date;  
  2. import java.util.concurrent.TimeUnit;  
  3. public class SynchronizedExample {  
  4.     public static void main(String[] args) {  
  5.         // 創(chuàng)建當(dāng)前類實(shí)例  
  6.         final SynchronizedExample example = new SynchronizedExample();  
  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.                         // 調(diào)用 synchronized 修飾的 class 方法  
  14.                         example.classMethod();  
  15.                     } catch (InterruptedException e) {  
  16.                         e.printStackTrace();  
  17.                     }  
  18.                 } 
  19.             }).start();  
  20.         }  
  21.     }  
  22.     /**  
  23.      * synchronized 修飾的 class 方法  
  24.      * @throws InterruptedException  
  25.      */  
  26.     public void classMethod() throws InterruptedException {  
  27.         synchronized (SynchronizedExample.class) {  
  28.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s",  
  29.                     Thread.currentThread().getName(), new Date()));  
  30.             TimeUnit.SECONDS.sleep(1);  
  31.         }  
  32.     }  

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

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

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

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

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

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

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

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

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

  1. import java.util.Date;  
  2. import java.util.concurrent.TimeUnit;  
  3. public class SynchronizedExample {  
  4.     public static void main(String[] args) {  
  5.         // 創(chuàng)建當(dāng)前類實(shí)例  
  6.         final SynchronizedExample example = new SynchronizedExample(); 
  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.                         // 調(diào)用 synchronized 修飾的 this 方法  
  14.                         example.thisMethod();  
  15.                     } catch (InterruptedException e) {  
  16.                         e.printStackTrace();  
  17.                     }  
  18.                 }  
  19.             }).start();  
  20.         }  
  21.     }     
  22.     /**  
  23.      * synchronized 修飾的 this 方法  
  24.      * @throws InterruptedException  
  25.      */  
  26.     public void thisMethod() throws InterruptedException {  
  27.         synchronized (this) {  
  28.             System.out.println(String.format("當(dāng)前執(zhí)行線程:%s,執(zhí)行時(shí)間:%s",  
  29.                     Thread.currentThread().getName(), new Date()));  
  30.             TimeUnit.SECONDS.sleep(1);  
  31.         }  
  32.     }  

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

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

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

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

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

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

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

總結(jié)

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

 

 

責(zé)任編輯:龐桂玉 來(lái)源: Hollis
相關(guān)推薦

2021-08-02 07:57:03

SynchronizeJava語(yǔ)言

2024-02-26 07:36:09

lockJava語(yǔ)言

2022-04-24 07:59:53

synchronizJVMAPI

2023-02-01 07:15:16

2020-03-10 10:25:38

volatileJava編程語(yǔ)言

2021-02-01 14:10:16

JavaClass.forNaClassLoader

2022-11-09 10:46:18

AQS加鎖機(jī)制

2021-08-31 06:37:35

Java 語(yǔ)言 Java 基礎(chǔ)

2020-09-23 09:08:05

typescript

2009-10-10 14:40:03

C++中struct

2010-08-30 10:52:39

CSSclassid

2010-08-23 14:16:17

DIVclassid

2021-01-14 08:58:12

Synchronize鎖操作

2009-08-27 15:48:40

interfaceabstract cl

2009-08-27 16:22:58

interfaceabstract cl

2010-08-23 10:57:14

CSSclassid

2017-12-06 16:28:48

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

2021-03-04 08:26:17

synchronizeReentrantLojava

2025-01-02 12:59:55

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

2020-07-07 07:47:07

Java無(wú)鎖技術(shù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 日韩av大片免费看 | 精品无码久久久久久国产 | 国产精品123区 | 久久久国产精品 | 欧美精品中文字幕久久二区 | 天天躁日日躁性色aⅴ电影 免费在线观看成年人视频 国产欧美精品 | 男女免费视频网站 | 午夜精品福利视频 | 狠狠热视频 | 亚洲视频一区 | 伊人免费在线观看 | a级毛片毛片免费观看久潮喷 | 日韩免费在线视频 | 欧美精品网 | 国产一级一级国产 | 精产国产伦理一二三区 | chengrenzaixian| 亚洲精品久久久一区二区三区 | 中文字幕的av | 99久久国产免费 | 羞羞视频网站在线观看 | 超碰免费在| 国产亚洲精品久久午夜玫瑰园 | 日韩中文欧美 | 久久久精品一区 | 国产一区二区精品自拍 | 久视频在线观看 | 亚洲精品中文在线 | 国产精品久久久亚洲 | 国产良家自拍 | 欧美综合在线视频 | 欧美一级免费 | 久久久久久久久久久久亚洲 | 国产一级在线 | 在线亚洲人成电影网站色www | 国产成人精品视频在线观看 | 日本精品视频一区二区 | 久久手机视频 | 可以看黄的视频 | 91精品久久久久久久 | 免费观看一级特黄欧美大片 |