【從入門到起飛】JavaSE—多線程(3)(生命周期,線程安全問題,同步方法)

🎊專欄【JavaSE】
🍔喜歡的詩句:路漫漫其修遠兮,吾將上下而求索。
🎆音樂分享【如愿】
🎄歡迎并且感謝大家指出小吉的問題🥰

文章目錄

  • 🍔生命周期
  • 🎄線程的安全問題
    • 🏳??🌈原因
    • ?改進方法
  • 🌺同步代碼塊
    • ?細節
  • 🌺同步方法

在這里插入圖片描述

🍔生命周期

在這里插入圖片描述

🎄線程的安全問題

在這里插入圖片描述
發現有兩個問題,相同的票出現了多次,出現了超出范圍的票

🏳??🌈原因

首先線程被線程一搶走了
線程一執行到了sleep,會休眠10ms,然后ticket+1,變為了1
然后線程被線程二搶走了
線程二執行到了sleep,會休眠10ms,然后ticket+1,變為了2
然后線程被線程三搶走了
線程三執行到了sleep,會休眠10ms,然后ticket+1,變為了3
現在ticket是3,就會打印3次ticket=3的結果
這就是重復票和超出范圍的原因
在這里插入圖片描述

?改進方法

我們把下面的代碼給框起來,設置一個線程執行完這個代碼塊后,其他線程才能執行
在這里插入圖片描述

🌺同步代碼塊

把操作共享數據的代碼給鎖起來

synchronizd(){操作共享數據的代碼
}
  • 鎖默認打開,有一個線程進去了,鎖自動關閉
  • 里面的代碼全部執行完畢,線程出來,鎖自動打開

我們把之前的代碼塊用鎖包圍起來康康效果如何

在這里插入圖片描述

運行成功

MyThread.java


public class MyThread extends Thread {//表示這個類的所有對象,都共享ticket數據static int ticket = 0;//0~99//鎖的對象,一定要是唯一的static Object obj=new Object();@Overridepublic void run() {while (true) {synchronized (obj) {if (ticket < 100) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(getName() + "正在賣第" + ticket + "張票");} else {break;}}}}
}

Demo1.java

package IODemo6;public class Demo1 {public static void main(String[] args) throws InterruptedException {//創建線程對象MyThread t1=new MyThread();MyThread t2=new MyThread();MyThread t3=new MyThread();//起名字t1.setName("窗口一");t2.setName("窗口二");t3.setName("窗口三");//開啟線程t1.start();t2.start();t3.start();}
}

?細節

  1. 鎖必須要寫到循環里面
  2. 鎖對象必須唯一

🌺同步方法

就是把synchronized關鍵字加到方法上

修飾符 synchronized 返回值類型 方法名(方法參數){......
}

在這里插入圖片描述
MyRunnable.java


public class MyRunnable implements Runnable{int ticket=0;@Overridepublic void run() {while (true){//同步方法if (method()) break;}}public synchronized boolean method(){//共享數據 到了末尾if (ticket==100){return true;}else {//共享數據 沒有到末尾try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}ticket++;System.out.println(Thread.currentThread().getName()+"在賣第"+ticket+"張票!!!");}return false;}
}

ThreadDemo.java

public class ThreadDemo {public static void main(String[] args) {MyRunnable mr=new MyRunnable();Thread t1=new Thread(mr);Thread t2=new Thread(mr);Thread t3=new Thread(mr);t1.setName("窗口1");t2.setName("窗口2");t3.setName("窗口3");t1.start();t2.start();t3.start();}
}

在這里插入圖片描述

如果大家有不明白的知識點,歡迎在評論區進行討論

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

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

相關文章

【Leetcode合集】1410. HTML 實體解析器

1410. HTML 實體解析器 1410. HTML 實體解析器 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 ""…

YOLOv7獨家改進: Inner-IoU基于輔助邊框的IoU損失,高效結合 GIoU, DIoU, CIoU,SIoU 等 | 2023.11

??????本文獨家改進:Inner-IoU引入尺度因子 ratio 控制輔助邊框的尺度大小用于計算損失,并與現有的基于 IoU ( GIoU, DIoU, CIoU,SIoU )損失進行有效結合 推薦指數:5顆星 新穎指數:5顆星 收錄: YOLOv7高階自研專欄介紹: http://t.csdnimg.cn/tYI0c …

開發抖音小游戲什么技術

開發抖音小游戲&#xff0c;使用以下技術可能會相對簡單&#xff1a; HTML5&#xff1a;HTML5 是一種用于創建網頁和應用程序的標準標記語言。它具有豐富的功能和靈活性&#xff0c;可以在各種設備和平臺上運行&#xff0c;包括移動設備和瀏覽器。HTML5 提供了許多游戲開發所需…

大模型AI Agent 前沿調研

前言 大模型技術百花齊放&#xff0c;越來越多&#xff0c;同時大模型的落地也在緊鑼密鼓的進行著&#xff0c;其中Agent智能體這個概念可謂是火的一灘糊涂。 今天就分享一些Agent相關的前沿研究&#xff08;僅限基于大模型的AI Agent研究&#xff09;&#xff0c;包括一些論…

完美解決AttributeError: module ‘numpy‘ has no attribute ‘typeDict‘

文章目錄 前言一、完美解決辦法安裝低版本1.21或者1.19.3都可以總結 前言 這個問題從表面看就是和numpy庫相關&#xff0c;所以是小問題&#xff0c;經過來回調試安裝numpy&#xff0c;發現是因為目前的版本太高&#xff0c;因此我們直接安裝低版本numpy。也不用專門卸載目前的…

Qt全球峰會2023中國站 參會概要

Qt全球峰會2023中國站 參會概要 前言峰會議程簽到 & Demo 演示開場致辭Qt Group 產品總監演講&#xff08;產品開發的趨勢-開放的軟件、工具和框架&#xff09;產品戰略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定義AI個人看法 Qt 在券商數字化轉型和信…

【MySQL】內連接和外連接

內連接和外連接 前言正式開始內連接外連接左外連接右外連接 前言 前一篇講多表查詢的時候講過笛卡爾積&#xff0c;其實笛卡爾積就算一種連接&#xff0c;不過前一篇講的時候并沒有細說連接相關的內容&#xff0c;本篇就來詳細說說表的連接有哪些。 本篇博客中主要用到的還是…

快速去除Word文檔密碼,全面解決你的困擾

如果你忘記了Word文檔密碼&#xff0c;或者想解密和去除Word文檔密碼&#xff0c;下面是簡單步驟&#xff1a;第一步&#xff0c;百度搜索【密碼帝官網】找到官方網站&#xff1b;第二步&#xff0c;點擊“立即開始”&#xff0c;進入用戶中心&#xff0c;上傳需要解密的文件。…

中部A股第一城,長沙如何贏商?

文|智能相對論 作者|范柔絲 長沙的馬路&#xff0c;都很有故事。 一條解放西路&#xff0c;是全國人民都爭相打卡的娛樂地標&#xff1b;一條太平街&#xff0c;既承載了歷史的厚重又演繹著現代的鮮活...... 但如果來到河西的桐梓坡路&#xff0c;風景會變得截然不同。 沿…

應用軟件安全編程--28SSL 連接時要進行服務器身份驗證

當進行SSL 連接時&#xff0c;服務器身份驗證處于禁用狀態。在某些使用SSL 連接的庫中&#xff0c;默認情況下不 驗證服務器證書。這相當于信任所有證書。 對 SSL 連接時要進行服務器身份驗證的情況&#xff0c;示例1給出了不規范用法(Java 語言)示例。示例2 給出了規范用法(J…

安裝MySQL搭建論壇

課前默寫&#xff1a; 1、nginx配置文件的區域有哪些 ①全局區域 ②events區域 ③http區域 2、區域模塊的作用 全局區域模塊主要是用戶和工作進程 events區域模塊配置最大連接數時需先配置:vim /etc/limits.conf 因為系統默認最大是1024 http區域模塊&#xff1a;代理地…

BUUCTF [HBNIS2018]excel破解 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 得到的 flag 請包上 flag{} 提交。來源&#xff1a; https://github.com/hebtuerror404/CTF_competition_warehouse_2018 密文&#xff1a; 下載附件&#xff0c;得到一個attachment.xls文件。 解題思路&#xff…

計算機視覺的應用19-基于pytorch框架搭建卷積神經網絡CNN的衛星地圖分類問題實戰應用

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下計算機視覺的應用19-基于pytorch框架搭建卷積神經網絡CNN的衛星地圖分類問題實戰應用。隨著遙感技術和衛星圖像獲取能力的快速發展&#xff0c;衛星圖像分類任務成為了計算機視覺研究中一個重要的挑戰。為了促進這一…

git的用法

目錄 一、為什么需要git 二、git基本操作 2.1、初始化git倉庫 2.2、配置本地倉庫的name和email 2.3、認識工作區、暫存區、版本庫 三、git的實際操作 3.1 提交文件 3.2 查看git狀態以及具體的修改 3.3 git版本回退 git reset 3.1 撤銷修改 四、git分支管理 4.…

vue el-table (固定列+滾動列)【橫向滾動條】確定滾動條是在列頭還是列尾

效果圖&#xff1a; 代碼實現&#xff1a; html&#xff1a; <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…

【數據結構】樹如何定義 | 如何存儲 | 實際應用

前言 如上圖&#xff0c;A中的孩子的個數是不固定的。我們無法精確的每個不同的根結點有多少個孩子。所以并不能精確知道需要定義多少個孩子節點。 struct TreeNode {int val;struct TreeNode* child1;struct TreeNode* child2;struct TreeNode* child3;//...//這樣顯然是不能…

springboot 攔截器中使用@Value注解為null

攔截器中獲取配置參數為null 代碼如下&#xff1a; 解決方式一&#xff1a; 檢查你的WebMvcConfigurer實現類&#xff0c;比如我的是CCBWebMvcConfig 將攔截器以bean的形式注入&#xff1a; 我之前的寫法是new 一個放進去的&#xff0c;這種會導致Value為null AutowiredJSCCB…

2014年10月6日 Go生態洞察:Go在Google I/O和Gopher SummerFest的應用

&#x1f337;&#x1f341; 博主貓頭虎&#xff08;&#x1f405;&#x1f43e;&#xff09;帶您 Go to New World?&#x1f341; &#x1f984; 博客首頁——&#x1f405;&#x1f43e;貓頭虎的博客&#x1f390; &#x1f433; 《面試題大全專欄》 &#x1f995; 文章圖文…

《微信小程序開發從入門到實戰》學習二十七

3.4 開發參與投票頁面 3.4.2 借用偽造數據開發功能 為了便于開發&#xff0c;新建一個編譯模式&#xff1a; 之前沒看文章&#xff0c;每次都習慣性填完投票創建的信息提交再跳轉看效果。好累。 添加變異模式開發真方便。 另外&#xff0c;點擊提交后沒跳轉到投票頁面&#…

xorm源碼學習

文章目錄 XORM源碼淺析及實踐ORMORM vs. SQLXORM軟件架構 ORM 引擎 Engine——DBM*core.DB Golang&#xff1a;database/sql 源碼基本結構連接復用&#xff0c;提高性能。增加數據庫連接池數量連接管理 database/sql主要內容&#xff1a;sql.DB創建數據庫連接sql.Open()DB.conn…