1. 程式人生 > >併發元件中的size()方法導致cpu狂飆

併發元件中的size()方法導致cpu狂飆

import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue;

public class AsyncEventSender {

	private static final long MAX_BUFFER_SIZE = 10000000;
	
	private ConcurrentLinkedQueue<String> bufferQueue = new ConcurrentLinkedQueue<String>();
	
	public void sendEventAsync(String event){
		int size = bufferQueue.size();
		if(size < MAX_BUFFER_SIZE){
			bufferQueue.add(event);
		}
	}
	
	public static void main(String[] args){
		AsyncEventSender sender = new AsyncEventSender();
		long start = new Date().getTime();
		for(int i=0;i<1000000;i++){
			if(i % 5000 == 0){
				System.out.println(i+"XXXX"+(new Date().getTime()-start));
				start = new Date().getTime();
			}
			sender.sendEventAsync(i+"");
		}
	}
}

隨著佇列中元素的不斷增加,size()方法越來越耗時,長期佔用cpu,導致負載狂飆。

Concurrent系列的集合類使用分桶的策略減少集合的執行緒競爭,在獲取其整體大小時需要進行統計,而不是直接返回一個預先儲存的值,獲取的時間複雜度是o(n)。隨著元素增加越來越多,統計越來越慢。

相關推薦

併發元件size()方法導致cpu狂飆

import java.util.Date; import java.util.concurrent.ConcurrentLinkedQueue; public class AsyncEventSender { private static final long MAX

自定義控制元件draw()方法基線的計算

Canvas.drawText(String text, float x, float y,Paint paint)方法 第一個引數 text 是需要繪製的文字 第二個引數 x 是文字開始的位置 第三個引數 y 是基線的位置 第四個引數 paint 傳畫筆 其中第三個引數基線的位置計算方

vue專案構建——父子元件呼叫方法的執行順序

需求場景: 使用vue-cli建立的專案,父元件LeftMainmenu.vue裡通過<router-view>載入了子元件,父元件與子元件的methods裡各自有方法,初始化的時候在mounted裡進行了呼叫。預設的想法是想在父元件LeftMainmenu.vue的方法裡把axio

Android-RecyclerView元件setLayoutManager方法的使用,使RecyclerView更有趣

在我的部落格中有講到RecyclerView的使用,當中只是簡單的描述了一下程式碼中的setLayoutManager需要設定,那麼這個方法到底有什麼功能呢,下面我就和大家分享一下,大牛請繞過…… 原始碼是用我部落格中RecyclerView自定義佈局裡面的原始碼修改的

Vue入門-父元件向子傳值與子元件呼叫父元件方法

Vuex是什麼?一般用於中大型專案,管理元件中的傳值方式,相當於angular中的全域性服務,裡面有store宣告的屬性可以共享,每個元件都可以繫結。想要改變值,可以向store提交一個突變,方法便會執行一次。父向子傳值1、child子元件對desc屬性繫結的是sString

Java什麼方法導致執行緒阻塞

一、為什麼引入執行緒阻塞機制?為了解決對共享儲存區的訪問衝突,Java 引入了同步機制,現在讓我們來考察多個執行緒對共享資源的訪問,顯然同步機制已經不夠了,因為在任意時刻所要求的資源不一定已經準備好了被訪問,反過來,同一時刻準備好了的資源也可能不止一個。為了解決這種情況下的訪

vue 2.0 父元件呼叫子元件方法

父元件: <editUser ref="editUser"></editUser> /** * 編輯會員 */ handleEdit(row) { v

asp.net使用者自定義控制元件呼叫另外一個使用者自定義控制元件方法

昨天同事問我一個問題,說是在一個頁面中有二個使用者自定義控制元件,他現在想在其中一個使用者自定義控制元件中呼叫另外一個使用者自定義控制元件的一個方法。當時感覺很奇怪,為什麼要這樣呢。可是他說他要完成這樣一個功能,所以我就簡單的用一個反射的功能來完成它。試了一下,還行功能可以實

元件如何呼叫父元件方法和屬性

方法一:子元件:<template> <button @click="submit">提交</button> </template> <script> export default { methods:

vue2 子元件呼叫父元件方法

父元件: <!--編輯會員--> <editUser ref="editUser" v-on:childMethod="parentMethod"></editUse

分頁控制元件的數字按鈕計算方法

計算思想: 以當前頁碼為標杆,使用卡尺的思想,左移,右移,再左移,最後得到起始、結束位置的按鈕頁碼。 @{ var param = new { Page = 18, //當前頁 NumberButton = 5,//數字按鈕的個數

Pytorch,MaxUnpool2dsize操作方法

    下圖所示為最大值的去池化操作,主要包括三個引數,kernel_size: 卷積核大小(一般為3,即3x3的卷積核), stride:步,還有一個新的size。     從圖中可以看出,它將維度4x4的去池化結果變為5x5

Vue 子元件觸發父元件方法

父元件中: <子元件名 @close="close"></子元件名> methods: { close(id) { this.$confirm('此操作將永久刪除該檔案, 是否繼續?', '提示', { confir

從 LongAdder 窺見併發元件的設計思路

原文地址 最近在看阿里的 Sentinel 的原始碼的時候。發現使用了一個類 LongAdder 來在併發環境中計數。這個時候就提出了疑問,JDK 中已經有 AtomicLong 了,為啥還要使用 LongAdder ? AtomicLong 已經是基於 CAS 的無鎖結構,已經有很好的並

淺談vuestyle的scoped屬性(修改特定Element元件樣式的方法

在單頁.vue檔案中,為了保證各元件間的css樣式不衝突,很可能會使用到區域性css,也就是給<style>標籤加上一個scoped屬性(當然也可以用各種命名規則來規避這個問題)。 一開始用的時候感覺很神奇,於是看程式碼查資料瞭解了一下原理。 所謂的區域性css,就是通過vue-lo

理解 Python 併發程式設計的 join 方法

程式碼清單 - 1: from multiprocessing import Process from time import ctime, sleep def clock(interval): while True: print("

element-ui 的el-button元件新增自定義顏色和圖示的實現方法

這篇文章主要介紹了element-ui 的el-button元件中新增自定義顏色和圖示的實現方法,目前的解決方案是:新增一個自定義全域性指令,同時在element-ui原始碼中,加入對應的元件。需要的朋友跟隨小編一起看看吧 我使用的element-ui的版本是V1.4.13。 如上圖所示,如果使用el

VS程式設計,WPF,後臺更改 telerik:RadGridView 控制元件各列寬度的一種方法

有時為了顯示的美觀,需要將GridView控制元件中每一列,或者是某一列的寬度進行後臺動態的修改。 這裡提供了一種方法。 例如:此GridView含有6列,使得每一列的寬度平均分配。   1、

在工具類靜態方法使用Spring的元件

/** * @author Dongguabai * @date 2018/9/27 10:14 */ @Component public class VwOrgSupport { /** * 可顯示最低級別orgType */ p

標籤控制元件顯示對話框出現的問題及解決方法

問題描述: 1.整體對話框出現時,理應出現在標籤控制元件當中的對話方塊飛出去了,沒有在標籤控制元件當中; 2.標籤控制元件切換的時候有問題,並不是所有的標籤選項都可以切換到。 解決方法: 1.飛出去的解決方法: 過程:在查詢標籤控制元件所在的螢幕座標系和客戶區座標