AtomicInteger使用非阻塞算法,實現并發控制多線程實現售票

代碼如下:
public class TicketDemo implements Runnable {private static volatile AtomicInteger ticketSum = new AtomicInteger(20);private static int finalTotal = 0;@Overridepublic void run() {int count;while ((count = ticketSum.decrementAndGet()) >= 0) {System.out.println(Thread.currentThread().getName() + "賣出了第" + ++count + "張票");finalTotal++;}}public static void main(String[] args) {Thread t1 = new Thread(new TicketDemo(), "t1");Thread t2 = new Thread(new TicketDemo(), "t2");Thread t3 = new Thread(new TicketDemo(), "t3");long startTime = System.currentTimeMillis();t1.start();t2.start();t3.start();while (true) {if (!t1.isAlive() && !t2.isAlive() && !t3.isAlive()) {long endTime = System.currentTimeMillis();System.out.println("最終售出:" + finalTotal);System.out.println("最終耗時:" + (endTime - startTime) + "毫秒.");break;}}}
}

總結:

多線程必須加上synchronized,保證不會出現并發線程同時訪問的情況,而在AtomicInteger中卻不用加上synchronized,AtomicInteger是一個提供原子操作的Integer類,通過線程安全的方式操作加減,AtomicInteger是在使用非阻塞算法實現并發控制,在一些高并發程序中非常適合,但并不能每一種場景都適合,不同場景要使用使用不同的數值類。

以上為AtomicInteger中的部分源碼,在這里說下其中的value,這里value使用了volatile關鍵字,volatile在這里可以做到的作用是使得多個線程可以共享變量,但是問題在于使用volatile將使得VM優化失去作用,導致效率較低,所以要在必要的時候使用,因此AtomicInteger類不要隨意使用,要在使用場景下使用。

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

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

相關文章

數據庫:SQLServer 實現行轉列、列轉行用法筆記

在許多的互聯網項目當中,報表開發是整個項目當中很重要的一個功能模塊。其中會有一些比較復雜的報表統計需要行轉列或者列轉行的需求。今天給大家簡單介紹一下在SQLServer當中如何使用PIVOT、UNPIVOT內置函數實現數據報表的行轉列、列轉行。有需要的朋友可以一起學習…

硬件知識:串口通訊的起始、數據、停止位是怎么分配的?

串口是串行接口(serial port)的簡稱,也稱為串行通信接口或COM接口。串口通信是指采用串行通信協議(serial communication)在一條信號線上將數據一個比特一個比特地逐位進行傳輸的通信模式。串口按電氣標準及協議來劃分…

ES5 getter setter

最近在學習vuejs,了解到內部實現使用到了es5的Getters和Setters。之前看高程的時候,沒有重視這塊,今天查看一下文檔,了解了他們的作用,再次記錄一下,可供以后查看和共享。 定義Getters和Setters&#xff1a…

python 調用bat失敗_要想順利通過Python面試,你最起碼需要達到白銀段位!

近幾年 Python 非常熱門,在學術界和產業界的使用率顯著提高。目前學習Python的人數日益增多,Python在近3年的編程語言受歡迎度中一直處于榜首。今天我們就來講講在產業界,需要具備哪些能力才能獲得一個滿意的 Python 相關崗位 Offer。Python基…

多線程售票demo,用ReentrantLock實現

代碼: public class TicketReentLockDemo implements Runnable {private int ticketTotal 100;private Lock lock new ReentrantLock();Overridepublic void run() {while (ticketTotal > 0) {try {lock.lock();if (ticketTotal > 0) {try {TimeUnit.MILLISECONDS.sle…

在linux安裝不了apache,Apache 不能安裝在linux?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓官網下載了tar.gz的文件, 然后tar解壓, 可是走到 ./configureprefix/usr/local/apache/ 的時候就開始出現一些“NO”我怕這樣make會有問題, 請問大家碰到出現"no"的選項嘛?…

andriod sqlite 詳解轉載

SQLite簡介 Google為Andriod的較大的數據處理提供了SQLite,他在數據存儲、管理、維護等各方面都相當出色,功能也非常的強大。SQLite具備下列特點: 1.輕量級 使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而…

數據庫:SQLServer中in和 exists函數用法筆記

今天給大家分享一下SQLServer中in和 exists 用法,希望能對大家有所幫助。一、IN 用法確定指定的值是否與子查詢或列表中的數據相匹配。1.1 語法格式test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )1.2 參數說明test_expression為任意有…

什么是m叉樹_不懂數據庫索引的底層原理?那是因為你心里沒點b樹

前幾天下班回到家后正在處理一個白天沒解決的bug,廁所突然傳來對象的聲音: 對象:xx,你有《時間簡史》嗎? 我:我去!妹子,你這啥癖好啊,我有時間也不會去撿屎啊&#xff01…

可重入鎖是什么和demo

可重入鎖 reentrantlock是獨占鎖且可重入的 synchronized 也可以重入 可重入意思就是這個線程已經獲取鎖了,你再獲取該鎖還能獲取 獲取的還是原來的鎖 不會出現問題 可以降低編程難度 代碼如下: new Thread(new Runnable() {Overridepublic void run() {synchr…

linux 安裝python 3.x,Linux 安裝python3.x步驟

本文轉發自博客園非真的文章,內容略有改動linux系統本身默認安裝有2.x版本的python,版本x根據不同版本系統有所不同,通過python --V 或 python --version 查看系統自帶的python版本。有一些系統命令時需要用到python2,不能卸載&am…

數據庫:SQLServer中游標的用法筆記

一、游標的概念知識游標可以理解為SQL Server的一種數據訪問機制,它允許用戶訪問數據的維度是數據行。用戶可以對每一行數據進行單獨處理,從而降低系統開銷和潛在的阻隔情況,游標主要用于存儲過程,觸發器和 T_SQL復雜的腳本中&…

BZOJ_1009_[HNOI2008]_GT考試_(動態規劃+kmp+矩陣乘法優化+快速冪)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id1009 字符串全部由0~9組成,給出一個串s,求一個長度為n的串,不包含s的種類有多少. 分析 第一眼以為是組合.然后更滑稽的是用錯誤的方法手算樣例居然算出來是對的...我數學是有多差... 題解也是看了好半天,有點難理解. 感覺…

智慧政務解決方案(28頁)pdf_【金眾電子】智慧政務解決方案

智慧政務解決方案立式黨建廣告機廣告機簡介:KC-立式政務廣告機(室內/室外可選)液晶屏幕特別賣點:安裝簡易、亮度調節、實時更新、傳輸安全應用場所:各種需要文化傳播的政務機構、政府機關、會議場所等。雙立柱政務文化欄/宣傳欄文化欄簡介&am…

笨辦法學linux dhcp,了解網關、DNS、子網掩碼、MAC地址、DHCP

原標題:了解網關、DNS、子網掩碼、MAC地址、DHCP什么是網關、DNS、子網掩碼,它有什么作用,確實,我們平時在網絡中總是在不斷的提到網關,卻很少真正的去了解它。一、什么是網關1、什么是網關網關是一種充當轉換重任的計…

數據庫:SQLServer Stuff 函數用法筆記

今天小編給大家分享一下自己整理一下SQLServer Stuff函數用法技巧和常用示例,有需要的朋友可以學習一下。一、Stuff函數的作用1.1官方解釋STUFF 函數將字符串插入到另一個字符串中。 它從第一個字符串的開始位置刪除指定長度的字符;然后將第二個字符串插…

自定義注解,aop實現注解鎖

多線程環境下,會出現線程不安全的問題,所以要對某些方法加鎖以保證線程安全 但是如果方法過多,每個方法前后都加這么一句,有點麻煩了,而且代碼可讀性也會差一些。可以使用aop切面編程,對某些加有特定注解&…

Android——實現歡迎界面的自動跳轉(轉)

Android實現歡迎界面的自動跳轉,就是打開某一個安卓手機應用,出現的歡迎界面停留幾秒鐘,自動進入應用程序的主界面。在網上看到很多種實現辦法,但是感覺這種方法還是比較簡單的。 在onCreate里設置個Timer,然后建立Int…

手機端刷recovery工具_MIUI/REDMIN手機玩機匯集

愿你刷機半生歸來仍是MIUI1解鎖篇解鎖Bootloader準備工作:1.手機備份數據2.手機進入開發者模式①進入“設置 -> 我的設備 -> 全部參數"中連續點擊MIUI版本,進入”開發者模式“②進入“設置 -> 開發者選項 -> 設備解鎖狀態”中綁定賬號和…

數據結構基礎:線性表學習筆記

1、線性表定義線性表是指n個元素的有限序列(n>0),通常用(a1,a2,a3...,an),來表示。2、線性表特點1、存在唯一的一個首元素2、存在唯一一個尾元素3、除第首元素外,每個元素只有一個直接前驅。4、除尾元素外,每個元素只有一個直接后繼。3、線性表的存儲…