日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

阿里云 刷新缓存 java_【从入门到放弃-Java】并发编程-NIO-Buffer

發布時間:2025/4/5 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里云 刷新缓存 java_【从入门到放弃-Java】并发编程-NIO-Buffer 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

上篇【從入門到放棄-Java】并發編程-NIO-Channel中我們學習到channel是雙向通道,數據通過channel在實體(文件、socket)和緩沖區(buffer)中可以雙向傳輸。

本文我們就來學習下buffer

簡介

buffer即緩沖區,實際上是一塊內存,可以用來寫入、讀取數據。是一個線性的、大小有限的、順序承載基礎數據類型的內存塊。

buffer有三個重要的屬性:

capacity:緩沖池大小,是不可變的。當buffer寫滿時,需要先清空才能繼續寫入。

limit:是buffer中不可以被讀或者寫的第一個元素的位置,limit的大小永遠不會超過capacity(在寫模式下,limit等于capacity)

position:是buffer中可以被讀或者寫的第一個元素的位置,position的大小永遠不會超過limit

除了boolean外,每一個基礎數據類型都有對應的buffer。如:ByteBuffer、CharBuffer、LongBuffer等

buffer不是線程安全的,如果要在多線程中使用 需要加鎖控制

接下來以ByteBuffer為例開始學習。

ByteBuffer

allocateDirect

public static ByteBuffer allocateDirect(int capacity) {

//會創建一個容量大小為capacity的DirectByteBuffer(ByteBuffer的子類)

return new DirectByteBuffer(capacity);

}

allocate

public static ByteBuffer allocate(int capacity) {

if (capacity < 0)

throw createCapacityException(capacity);

//會創建一個容量大小為capacity的HeapByteBuffer(ByteBuffer的子類)

return new HeapByteBuffer(capacity, capacity);

}

HeapByteBuffer和DirectByteBuffer的區別:

DirectByteBuffer是直接調用native方法在本機os::malloc()創建堆外內存;HeapByteBuffer是直接在jvm的堆中分配內存。

當buffer中的數據和磁盤、網絡等的交互都在操作系統的內核中發生時,使用DirectByteBuffer能避免從內核態->用戶態->內核態的切換開銷,所有的處理都在內核中進行,性能會比較好

當頻繁創建操作數據量比較小的buffer時,使用HeapByteBuffer在jvm堆中分配內存能抵消掉使用DirectByteBuffer帶來的好處。

wrap

public static ByteBuffer wrap(byte[] array,

int offset, int length)

{

try {

return new HeapByteBuffer(array, offset, length);

} catch (IllegalArgumentException x) {

throw new IndexOutOfBoundsException();

}

}

public static ByteBuffer wrap(byte[] array) {

return wrap(array, 0, array.length);

}

將byte數組包裝成一個ByteBuffer

讀數據

使用get方法從Buffer中讀取數據

從Buffer中讀取數據到Channel即:Channel::write() (從buffer中讀取數據寫入到資源中,所以是write)

寫數據

使用put方法直接設置Buffer中的數據

從Channel中讀取數據到Buffer即:Channel::read() (從資源中讀取數據寫入到buffer中,所以是read)

position

//獲取buffer中當前position的位置

public final int position() {

return position;

}

//設置buffer的position為newPosition,注意newPosition要大于0且小于limit,如果remark大于newPosition則設置為-1

public Buffer position(int newPosition) {

if (newPosition > limit | newPosition < 0)

throw createPositionException(newPosition);

position = newPosition;

if (mark > position) mark = -1;

return this;

}

limit

//獲取buffer中當前limit的位置

public final int limit() {

return limit;

}

//設置buffer的limit為newLimit,注意newLimit要大于0且小于capacity。如果position大于newLimit這設置為newLimit,如果remark大于newLimit則設置為-1

public Buffer limit(int newLimit) {

if (newLimit > capacity | newLimit < 0)

throw createLimitException(newLimit);

limit = newLimit;

if (position > limit) position = limit;

if (mark > limit) mark = -1;

return this;

}

mark

public Buffer mark() {

//標記mark為當前position

mark = position;

return this;

}

將當前位置做標記,在使用reset方法時,可以回到當前mark的位置

reset

public Buffer reset() {

int m = mark;

if (m < 0)

throw new InvalidMarkException();

//設置position為當前mark

position = m;

return this;

}

回到之前設置mark的位置

clear

public Buffer clear() {

//設置position為0

position = 0;

//limit設置為capacity大小

limit = capacity;

//mark設置為-1(初始化)

mark = -1;

return this;

}

讀取完數據后調用clear,即將buffer邏輯上清空了,可以從0開始寫入數據

flip

public Buffer flip() {

//limit設置為當前位置

limit = position;

//position設置為0

position = 0;

//mark設置為-1(初始化)

mark = -1;

return this;

}

將buffer從寫模式設置為讀模式,limit設置為當前position的位置,即只能讀取limit大小的數據

rewind

public Buffer rewind() {

position = 0;

mark = -1;

return this;

}

將position設置為0,即從頭開始讀取

remaining

public final int remaining() {

return limit - position;

}

返回buffer中還有多少byte是未讀的

hasRemaining

public final boolean hasRemaining() {

return position < limit;

}

是否已讀完

compact

public ByteBuffer compact() {

System.arraycopy(hb, ix(position()), hb, ix(0), remaining());

position(remaining());

limit(capacity());

discardMark();

return this;

}

將position和limit直接的數據copy到byteBuffer的起始處,將已讀數據清空,并將新的position設置為當前未讀數據的末尾。這樣能避免clear方法會將未讀數據也清空的問題

slice

public ByteBuffer slice() {

return new HeapByteBufferR(hb,

-1,

0,

this.remaining(),

this.remaining(),

this.position() + offset);

}

ByteBuffer slice(int pos, int lim) {

assert (pos >= 0);

assert (pos <= lim);

int rem = lim - pos;

return new HeapByteBufferR(hb,

-1,

0,

rem,

rem,

pos + offset);

}

新創建一個ByteBuffer,將緩存區分片,設置一個子緩沖區,實際上內存還是共享的,數據發生改變,兩個緩沖區讀取的數據都會是改變后的。

總結

Buffer最重要的三個屬性:position、limit、capacity。牢記這三個屬性的含義及讀寫切換時,設置值是如何變化的,Buffer的核心知識點就掌握了。

原文鏈接

本文為云棲社區原創內容,未經允許不得轉載。

總結

以上是生活随笔為你收集整理的阿里云 刷新缓存 java_【从入门到放弃-Java】并发编程-NIO-Buffer的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久九九 | 黄色在线免费播放 | 最新中文字幕在线播放 | 风韵多水的老熟妇 | 黑人玩弄人妻一区二区绿帽子 | 国产第一网站 | 亚洲国产欧美自拍 | 91一区二区三区 | 久久久久久久久久久福利 | 捆绑黑丝美女 | 怡红院成人网 | 成人免费在线电影 | 久久精品人人爽 | 日日夜夜一区二区 | 成人音影 | 操操综合 | 人人人超碰 | 日本精品一区二区三区在线观看 | 中文字幕精品一区二区三区视频 | 亚洲偷拍一区 | 在线中文字幕日韩 | 手机看片国产日韩 | 求av网址 | 亚洲综合一区二区 | 国产一级内谢 | 欧美在线视频免费播放 | 伊人久久亚洲 | bbbbbbbbb毛片大片按摩 | 日本在线加勒比 | 精品欧美一区二区三区久久久 | 男ji大巴进入女人视频 | 偷拍青青草 | 总裁憋尿呻吟双腿大开憋尿 | 久久精品国产熟女亚洲AV麻豆 | wwwxxxx国产 | 色婷婷av一区二区三 | 欧美一级久久久 | eeuss一区二区三区 | 亚洲AV无码一区二区伊人久久 | 91极品身材尤物theporn | 亚洲一区二区三区在线看 | 国产一国产二 | 色哟哟视频在线 | 亚洲成人精品av | 亚洲一区二区三区四区五区六区 | 欧美 日韩 国产一区 | 91网站永久免费看nba视频 | 国产成人无码www免费视频播放 | 极品尤物一区二区 | 青青草视频免费 | 日本公与丰满熄 | 91浏览器在线观看 | 国产精品丝袜黑色高跟鞋 | 影音先锋中文字幕资源 | 日韩精品电影一区 | 欧洲免费av| 日韩乱码人妻无码中文字幕 | 黄色av大全 | 国产精彩视频一区 | 91精品久久久久久久久久久 | 日本性爱视频在线观看 | 日韩影视一区二区三区 | 大奶子情人| 噼里啪啦国语版在线观看 | 中国一级特黄毛片 | 伊人久久大香线蕉成人综合网 | 国产精品成人免费 | 亚洲第一视频网站 | 每日更新在线观看av | 中国吞精videos露脸 | 日韩大片免费观看 | 中文字幕影院 | 影音先锋在线播放 | 床戏高潮做进去大尺度视频 | 成人av电影在线播放 | 欧美日韩经典 | 亚洲国产成人一区二区精品区 | 一区二区日韩精品 | 在线观看a级片 | 青在线视频 | 金鱼妻日剧免费观看完整版全集 | 日本一级黄色录像 | 在线精品一区二区三区 | 香蕉久久视频 | 亚洲国内在线 | 色就是欧美 | 又色又爽又黄无遮挡的免费视频 | 日韩在线视屏 | 日韩69 | 黄色网入口 | 免费a网| 欧美日本不卡 | 国产精品亚洲成在人线 | 武林美妇肉伦娇喘呻吟 | 91夜色视频 | av丝袜天堂| 欧美一级免费 | 亚洲国产成人精品女人久久久 | 精品人妻无码一区二区性色 |