淺談Java多線程同步機制之同步塊(方法)——synchronized

在多線程訪問的時候,同一時刻只能有一個線程能夠用 synchronized 修飾的方法或者代碼塊,解決了資源共享。下面代碼示意三個窗口購5張火車票:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 未使用synchronized,存在并發
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             try {
11                 Thread.sleep(500);
12             } catch (InterruptedException e) {
13                 e.printStackTrace();
14             }
15                 if (tickets>0) {
16                     System.out.println("車票: "+tickets--);
17             }
18         }
19         
20     }
21 }
22 
23 public class ThreadTest {
24 
25     public static void main(String[] args) {
26         RunnableDemo r = new RunnableDemo();
27         Thread t1 = new Thread(r);
28         Thread t2 = new Thread(r);
29         Thread t3 = new Thread(r);
30         t1.start();
31         t2.start();
32         t3.start();
33     }
34 
35 }

其中一次的運行結果:

車票: 5
車票: 4
車票: 3
車票: 2
車票: 1
車票: 2

使用synchronized同步塊后:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 使用synchronized塊
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             try {
11                 Thread.sleep(500);
12             } catch (InterruptedException e) {
13                 e.printStackTrace();
14             }
15             synchronized (this) {
16                 if (tickets>0) {
17                     System.out.println("車票: "+tickets--);
18                 }
19             }
20         }
21     }
22 }
23 
24 public class ThreadTest {
25 
26     public static void main(String[] args) {
27         RunnableDemo r = new RunnableDemo();
28         Thread t1 = new Thread(r);
29         Thread t2 = new Thread(r);
30         Thread t3 = new Thread(r);
31         t1.start();
32         t2.start();
33         t3.start();
34     }
35 
36 }

使用synchronized同步方法:

 1 package com.jikexueyuan.thread;
 2 /*
 3  * 使用synchronized同步方法
 4  */
 5 class RunnableDemo implements Runnable{
 6     private int tickets = 5;
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 10; i++) {
10             show();
11         }
12     }
13     public synchronized void show() {
14         if (tickets>0) {
15             System.out.println("車票: "+tickets--);
16         }
17     }
18 }
19 
20 public class ThreadTest {
21 
22     public static void main(String[] args) {
23         RunnableDemo r = new RunnableDemo();
24         Thread t1 = new Thread(r);
25         Thread t2 = new Thread(r);
26         Thread t3 = new Thread(r);
27         t1.start();
28         t2.start();
29         t3.start();
30     }
31 
32 }

無論使用synchronized同步塊還是同步方法,運行結果均為合理結果:

車票: 5
車票: 4
車票: 3
車票: 2
車票: 1


思考:volatile是另一種同步機制,是否可以呢?參考我的鏈接文章:Java理論與實踐:正確使用Volatile變量?http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

轉載于:https://www.cnblogs.com/Miracle-Maker/p/6262123.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284936.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284936.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284936.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]Webpack5(從入門到精通)

這里寫目錄標題 1、webpack 初體驗 全局安裝webpack2.打包樣式資源 創建webpack.config.js文件&#xff08;配置文件&#xff09;3.打包html資源 webpack.config.js文件&#xff08;配置文件&#xff09;4.打包圖片資源 webpack.config.js文件&#xff08;配置文件&#xff09;…

mybatis由淺入深day01_5mybatis開發dao的方法(5.1SqlSession使用范圍_5.2原始dao開發方法)...

5 mybatis開發dao的方法 5.1 SqlSession使用范圍 5.1.1 SqlSessionFactoryBuilder 通過SqlSessionFactoryBuilder創建會話工廠SqlSessionFactory 將SqlSessionFactoryBuilder當成一個工具類使用即可&#xff0c;不需要使用單例管理SqlSessionFactoryBuilder。 在需要創建SqlSes…

做?個?德地圖的 iOS / Android MAUI 控件(上)

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;10分鐘)Microsoft Build 2022 ?會上正式發布了 .NET MAUI , 對于 .NET 開發者可以? C# 完成跨平臺的前端應?開發。對?起 MAUI 的前身 Xamarin , MAUI 除了可以?傳統的原?開發模式外&#xff0c;還?持了 Blazor…

易康eCognition Developer 9.01安裝教程(附eCognition下載地址及中文教程)

eCognition是由德國Definiens Imaging公司2009年推出的智能化影像分析軟件,2010年被美國Trimble公司收購。eCognition是目前所有商用遙感軟件中第一個基于目標信息的遙感信息提取軟件,它采用決策專家系統支持的模糊分類算法,突破了傳統商業遙感軟件單純基于光譜信息進行影像…

[改善Java代碼]不要覆寫靜態方法

建議33&#xff1a; 不要覆寫靜態方法 我們知道在Java中可以通過覆寫&#xff08;Override&#xff09;來增強或減弱父類的方法和行為&#xff0c;但覆寫是針對非靜態方法&#xff08;也叫做實例方法&#xff0c;只有生成實例才能調用的方法&#xff09;的&#xff0c;不能針對…

C語言試題194之實現strcpy函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現st…

ArcGIS實驗教程——實驗四十三:ArcGIS柵格重分類(Reclass)案例詳解

文章目錄 一、重分類1. 新值替代2. 將值組合到一起3. 按相同等級對一組柵格的值進行重分類4. 將特定值設置為NoData 或者為 NoData像元設置某個值二、查找表三、分割四、使用表重分類五、使用ASCI文件重分類重分類就是對原有柵格像元值重新分類從而得到一組新值并輸出。重分類工…

[中文版] 可視化 CSS References 文檔

本文分享了我將可視化 CSS References 文檔翻譯成中文版的介紹&#xff0c;翻譯工作還在陸續進行中&#xff0c;供學習 CSS 參考。 1. 可視化 CSS References 文檔介紹 許多 CSS 的文檔都是屬性的介紹&#xff0c;而開源項目 css-reference 并沒有提供中文版&#xff0c;而當我…

對比 C# 聊聊 C++ 中幾類特殊成員函數

一&#xff1a;背景 在 C# 中要說類默認給我們定義的特殊成員函數&#xff0c;莫過于 構造函數&#xff0c;但在 C 中這樣的特殊函數高達 6 種&#xff0c;有必要整合一下聊一聊。二&#xff1a;特殊成員函數 1. 默認構造函數和 C# 一樣&#xff0c;很多書中都說&#xff0c;如…

Js 枚舉定義Layer Icon

layer的icon有7種樣式&#xff1a;1-7 [圖片來自&#xff1a;https://blog.csdn.net/beauxie/article/details/60959971] 有時候常常記不住 &#x1f623;&#xff0c;不防自己定義一哈&#xff1a; var layerIcon {//無none: -1,//成功success: 1,//失敗error: 2,//提問、疑…

前端進階之路: 前端架構設計(2)-流程核心

可能很多人和我一樣, 首次聽到"前端架構"這個詞, 第一反應是: "前端還有架構這一說呢?" 在后端開發領域, 系統規劃和可擴展性非常關鍵, 因此架構師備受重視, 早在開發工作啟動之前, 他們就被邀請加入到項目中, 而且他們會跟客戶討論即將建成的平臺的架構要…

C語言試題195之實現strnchr函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現strnchr函數功能 函數名稱:在字符串中查找字符 函數原型:char *strnchr(cons…

8.2設備文件及磁盤分區

2019獨角獸企業重金招聘Python工程師標準>>> 概覽&#xff1a; 設備文件的創建 權限 設備名 類型 主設備號 次設備號 mknod [-m MODE] NAME type [MAJOR MINOR] 創建時&#xff0c;先查看是否存在設備號的沖突 零磁道零扇區是MBR&#xff1a;Maste…

【ArcGIS風暴】ArcGIS求一個矢量圖層中多個圖斑的“四至點”坐標案例教程

如圖所示,為ArcGIS軟件自帶的全球矢量數據,怎樣求取每個大洲(圖斑)的四至坐標(xmin、ymin、xmax、ymax)呢? 參考閱讀:【ArcGIS遇上Python】python批量獲取柵格數據四至(top,bottom,left,right)坐標代碼 文章目錄 1. 矢量數據加載2. 四至計算結果3. 四至計算過程1.…

一個關于導出excel模板的實例

1 首先jsp頁面 點擊模板下載&#xff0c;會自動下載模板&#xff45;&#xff58;&#xff43;&#xff45;&#xff4c;&#xff0c;效果如下 讓我們看源碼&#xff1a; &#xff11; &#xff4a;&#xff53;&#xff50;頁面 <div class"tab-pane" id"p…

騰訊視頻VIP會員,周卡特價9.5元!

今天給大家推薦特價充值騰訊視頻VIP會員的平臺——幻海優品&#xff0c;騰訊視頻在線直充&#xff0c;VIP會員實時生效&#xff01;騰訊視頻VIP會員特價充值周卡&#xff1a;原價12元&#xff0c;特價9.5元月卡&#xff1a;原價30元&#xff0c;特價22元季卡&#xff1a;原價68…

解決安裝SQL Server 2005開發版時,出現“SQL Server 服務無法啟動 ”點擊重試或取消的解決方法

問題描述&#xff1a; 安裝SQL Server 2005開發版時&#xff0c;提示SQL Server服務無法啟動&#xff0c;有關詳細信息&#xff0c;請參閱SQL Server聯機叢書中的主題如何查看SQL Server 2005安裝日志文件和手動啟動SQL Server&#xff0c;如下圖所示。 此時&#xff0c;如果點…

C語言試題196之實現strstr函數功能

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目: 實現strstr函數功能 C 庫函數 char *strstr(const char *haystack, const char *nee…

svnsync實現版本庫的同步備份

svnsync實現版本庫的同步備份 實驗環境&#xff1a;A&#xff0c;172.17.201.243&#xff08;主&#xff09;B&#xff0c;172.17.201.88&#xff08;備&#xff09;項目需求&#xff0c;生產環境要求svn服務器實現熱備機制&#xff0c;于是就想到了svn自帶的svnsync機制&#…

關于數據結構(二)

文章目錄[點擊展開](?)[] 一UI返回功能思路分析實現方法二當前正在CD技能接著上文<<關于數據結構(一)>>&#xff0c;關于數據結構&#xff0c;在實際的開發中或多或少都有涉及到&#xff0c;只是看自己平時沒有積累到。下面是我在項目中的幾個實例&#xff1a; 一…