成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java信號量模型實際應(yīng)用手冊

開發(fā) 后端
Java信號量模型在使用中會有很多問題,在不斷的學(xué)習(xí)中各種問題都會迎刃而解,下面我們就看看如何才能將Java信號量模型使用好。

Java信號量模型需要我們不斷的進(jìn)行學(xué)習(xí),在學(xué)習(xí)的時候會有不少的問題阻礙著我們。下面我們就來看看同步鎖模型只是最簡單的同步模型。同一時刻,只有一個線程能夠運行同步代碼。

有的時候,我們希望處理更加復(fù)雜的同步模型,比如生產(chǎn)者/消費者模型、讀寫同步模型等。這種情況下,同步鎖模型就不夠用了。我們需要一個新的模型。這就是我們要講述的Java信號量模型。#t#

 

Java信號量模型的工作方式如下:線程在運行的過程中,可以主動停下來,等待某個Java信號量模型的通知;這時候,該線程就進(jìn)入到該信號量的待召(Waiting)隊列當(dāng)中;等到通知之后,再繼續(xù)運行。

 

很多語言里面,同步鎖都由專門的對象表示,對象名通常叫Monitor。同樣,在很多語言中,Java信號量模型通常也有專門的對象名來表示,比如,Mutex,Semphore。

 

Java信號量模型要比同步鎖模型復(fù)雜許多。一些系統(tǒng)中,信號量甚至可以跨進(jìn)程進(jìn)行同步。另外一些信號量甚至還有計數(shù)功能,能夠控制同時運行的線程數(shù)。

 

我們沒有必要考慮那么復(fù)雜的模型。所有那些復(fù)雜的模型,都是最基本的模型衍生出來的。只要掌握了最基本的信號量模型——“等待/通知”模型,復(fù)雜模型也就迎刃而解了。

 

我們還是以Java語言為例。Java語言里面的同步鎖和Java信號量模型概念都非常模糊,沒有專門的對象名詞來表示同步鎖和信號量,只有兩個同步鎖相關(guān)的關(guān)鍵字——volatile和synchronized。

 

這種模糊雖然導(dǎo)致概念不清,但同時也避免了Monitor、Mutex、Semphore等名詞帶來的種種誤解。我們不必執(zhí)著于名詞之爭,可以專注于理解實際的運行原理。

 

在Java語言里面,任何一個Object Reference都可以作為同步鎖。同樣的道理,任何一個Object Reference也可以作為Java信號量模型。

 

Object對象的wait()方法就是等待通知,Object對象的notify()方法就是發(fā)出通知。

 

具體調(diào)用方法為

 

(1)等待某個Java信號量模型的通知

 

public static final Object signal = new Object();

 

… f1() {

synchronized(singal) { // 首先我們要獲取這個信號量。這個信號量同時也是一個同步鎖

 

// 只有成功獲取了signal這個信號量兼同步鎖之后,我們才可能進(jìn)入這段代碼

signal.wait(); // 這里要放棄信號量。本線程要進(jìn)入signal信號量的待召(Waiting)隊列

 

// 可憐。辛辛苦苦爭取到手的Java信號量模型,就這么被放棄了

// 等到通知之后,從待召(Waiting)隊列轉(zhuǎn)到就緒(Ready)隊列里面

// 轉(zhuǎn)到了就緒隊列中,離CPU核心近了一步,就有機會繼續(xù)執(zhí)行下面的代碼了。

 

// 仍然需要把signal同步鎖競爭到手,才能夠真正繼續(xù)執(zhí)行下面的代碼。命苦啊。

 

 

需要注意的是,上述代碼中的signal.wait()的意思。signal.wait()很容易導(dǎo)致誤解。signal.wait()的意思并不是說,signal開始wait,而是說,運行這段代碼的當(dāng)前線程開始wait這個signal對象,即進(jìn)入signal對象的待召(Waiting)隊列。

(2)發(fā)出某個Java信號量模型的通知

… f2() {

 

synchronized(singal) { // 首先,我們同樣要獲取這個信號量。同時也是一個同步鎖。

 

// 只有成功獲取了signal這個信號量兼同步鎖之后,我們才可能進(jìn)入這段代碼

signal.notify(); // 這里,我們通知signal的待召隊列中的某個線程。

 

// 如果某個線程等到了這個通知,那個線程就會轉(zhuǎn)到就緒隊列中

// 但是本線程仍然繼續(xù)擁有signal這個同步鎖,本線程仍然繼續(xù)執(zhí)行

 

// 嘿嘿,雖然本線程好心通知其他線程,

 

// 但是,本線程可沒有那么高風(fēng)亮節(jié),放棄到手的同步鎖

 

// 本線程繼續(xù)執(zhí)行下面的代碼

需要注意的是,signal.notify()的意思。signal.notify()并不是通知signal這個對象本身。而是通知正在等待signal信號量的其他線程。

以上就是Object的wait()和notify()的基本用法。

實際上,wait()還可以定義等待時間,當(dāng)線程在某Java信號量模型的待召隊列中,等到足夠長的時間,就會等無可等,無需再等,自己就從待召隊列轉(zhuǎn)移到就緒隊列中了。

 

另外,還有一個notifyAll()方法,表示通知待召隊列里面的所有線程。這些細(xì)節(jié)問題,并不對大局產(chǎn)生影響。

 

 

責(zé)任編輯:張浩 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2010-03-12 08:59:40

Python代碼

2021-04-13 09:20:15

鴻蒙HarmonyOS應(yīng)用開發(fā)

2010-04-21 16:50:31

Unix信號量

2020-11-05 09:59:24

Linux內(nèi)核信號量

2010-04-21 16:25:13

Unix信號量

2021-09-07 07:53:42

Semaphore 信號量源碼

2010-04-21 16:42:48

Unix信號量

2010-04-21 15:37:38

Unix信號量

2020-09-25 07:34:40

Linux系統(tǒng)編程信號量

2019-11-19 09:00:38

JavaAND信號量

2010-03-16 17:52:27

Java多線程信號量

2024-10-29 15:23:45

Python線程安全

2009-12-08 12:14:43

2010-07-15 15:32:10

Perl線程

2010-04-21 17:10:25

Unix信號量

2016-11-23 16:08:24

Python處理器分布式系統(tǒng)

2017-05-11 14:05:25

Consul分布式信號量

2021-02-03 20:10:29

Linux信號量shell

2020-11-10 15:25:26

SemaphoreLinux翻譯

2025-04-16 08:50:00

信號量隔離線程池隔離并發(fā)控制
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 99这里只有精品 | 欧美中文在线 | 亚洲精品久久久一区二区三区 | 成人三级视频在线观看 | 亚洲日本视频 | 色www精品视频在线观看 | 久久久一区二区 | 日韩一区二区福利视频 | 欧美三区 | 国产欧美日韩一区二区三区 | 欧美一区二区在线免费观看 | 狠狠色香婷婷久久亚洲精品 | 国产日韩欧美二区 | 亚洲国产欧美一区 | 亚洲视频二区 | 亚洲视频区 | 久优草| 日韩欧美福利视频 | 亚洲久久一区 | 一级亚洲| 久久综合狠狠综合久久综合88 | 日本久久一区二区三区 | 久久99精品久久久水蜜桃 | av电影一区| 精品欧美一区二区精品久久久 | 欧产日产国产精品视频 | 97伦理电影 | 日韩中文一区 | 国产一区二区三区高清 | 久久久精品国产 | 日本久久精 | 亚洲一区二区视频在线观看 | 精品国产乱码久久久久久丨区2区 | 精品久久久久久亚洲综合网站 | 日本网站免费观看 | 中文字幕电影在线观看 | 亚洲精品久久久久久久久久久久久 | 久久这里只有精品首页 | 超碰伊人久久 | 欧美久久一区二区三区 | 国产九九九九 |