多線程環(huán)境下的初始化順序保障_第1頁
多線程環(huán)境下的初始化順序保障_第2頁
多線程環(huán)境下的初始化順序保障_第3頁
多線程環(huán)境下的初始化順序保障_第4頁
多線程環(huán)境下的初始化順序保障_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1/1多線程環(huán)境下的初始化順序保障第一部分多線程環(huán)境中初始化順序問題 2第二部分volatile和final關(guān)鍵字的語義保證 4第三部分MemoryModel和happens-before關(guān)系 6第四部分Lock機制和有序初始化 8第五部分線程本地存儲與線程安全單例 10第六部分CAS操作的原子性保障 12第七部分并發(fā)容器的早期初始化優(yōu)化 14第八部分Java內(nèi)存模型中的volatile可見性 16

第一部分多線程環(huán)境中初始化順序問題多線程環(huán)境中的初始化順序問題

在多線程環(huán)境中,當(dāng)多個線程并發(fā)訪問共享資源時,可能會出現(xiàn)初始化順序問題。這是因為線程調(diào)度程序無法保證線程執(zhí)行的順序,因此不同的線程可能會以不同的順序訪問共享資源。

初始化順序反轉(zhuǎn)

初始化順序反轉(zhuǎn)是指在多線程環(huán)境中,一個對象在其所有字段被正確初始化之前被另一個線程訪問。這可能導(dǎo)致數(shù)據(jù)不一致或程序崩潰。

示例

考慮以下代碼示例:

```java

privateintx;//未初始化

privateinty;//未初始化

this.x=x;

this.y=y;

}

}

```

在這個示例中,`x`和`y`字段在構(gòu)造函數(shù)中沒有初始化。如果多個線程同時調(diào)用`setValue`方法,可能會發(fā)生初始化順序反轉(zhuǎn)。例如,線程1可能在初始化`x`字段之前設(shè)置`y`字段,而線程2可能在初始化`y`字段之前設(shè)置`x`字段。這將導(dǎo)致`MyClass`實例中的數(shù)據(jù)不一致。

解決方法

為了防止初始化順序問題,有多種方法可以保障初始化順序。

volatile關(guān)鍵字

`volatile`關(guān)鍵字可以強制線程在訪問共享變量之前刷新其高速緩存并從主內(nèi)存中獲取最新值。它還可以防止指令重排序,這可能導(dǎo)致不正確的初始化順序。

synchronized塊

`synchronized`塊可以強制線程在進入塊之前獲取鎖。這意味著同一時刻只有一個線程可以執(zhí)行塊中的代碼,從而確保初始化順序。

final關(guān)鍵字

`final`關(guān)鍵字可以聲明一個不可變變量,這意味著它只能在構(gòu)造函數(shù)中初始化。這確保了它在對象創(chuàng)建時正確初始化,并且不會被其他線程更改。

構(gòu)造函數(shù)

構(gòu)造函數(shù)可以用來初始化對象的所有字段。通過在構(gòu)造函數(shù)中顯式設(shè)置字段值,可以確保對象在使用之前正確初始化。

其他方法

還有其他方法可以保障初始化順序,例如:

*靜態(tài)初始化程序

*Lazy加載

*雙重檢查鎖定

選擇適當(dāng)?shù)姆椒?/p>

選擇保證初始化順序的最佳方法取決于具體情況。對于需要嚴(yán)格保證初始化順序的共享資源,`volatile`關(guān)鍵字或`synchronized`塊是不錯的選擇。對于不那么關(guān)鍵的資源,構(gòu)造函數(shù)或其他方法可能就足夠了。第二部分volatile和final關(guān)鍵字的語義保證關(guān)鍵詞關(guān)鍵要點volatile和final關(guān)鍵字的語義保證

一、volatile關(guān)鍵字

1.標(biāo)記被修飾的變量在多線程環(huán)境下,每次使用都直接從主內(nèi)存中讀取最新值,寫入主內(nèi)存也直接寫入最新的值。

2.禁止編譯器指令重排序,并插入內(nèi)存屏障,確保對volatile變量的讀寫操作按程序順序執(zhí)行。

3.適用于多線程環(huán)境下共享變量的讀寫,防止臟讀和寫后讀操作不一致的問題。

二、final關(guān)鍵字

volatile關(guān)鍵字的語義保證

*內(nèi)存可見性保證:volatile變量的每次寫入操作都將立即反映到主內(nèi)存中,并且任何線程對該變量的讀取操作都將看到此最新寫入的值。這確保了多線程環(huán)境中變量值的可見性,消除了因緩存一致性問題而導(dǎo)致的數(shù)據(jù)不一致。

*禁止編譯器優(yōu)化:volatile變量被標(biāo)記為“易失性”,這意味著編譯器不能對這些變量進行優(yōu)化。這樣可以確保變量的每次寫入操作都反映在主內(nèi)存中,而不會被編譯器優(yōu)化掉。

*適用于變量和字段:volatile關(guān)鍵字可以應(yīng)用于實例變量、類變量和局部變量,以確保這些變量的內(nèi)存可見性。

final關(guān)鍵字的語義保證

*不可變性:final變量在初始化后不可更改。一旦final變量被賦值,它就變成了一個常量,任何后續(xù)的賦值操作都會編譯器錯誤。這確保了final變量的值在整個程序運行期間保持不變。

*線程安全:由于final變量不可變,因此在多線程環(huán)境中是線程安全的。多個線程可以同時訪問final變量,而無需擔(dān)心數(shù)據(jù)不一致。

*適用于變量和方法:final關(guān)鍵字可以應(yīng)用于實例變量、類變量和方法。final變量一旦初始化,就無法更改。final方法不能被子類重寫。

volatile和final關(guān)鍵字的比較

*作用:volatile關(guān)鍵字確保變量的內(nèi)存可見性,而final關(guān)鍵字確保變量不可變。

*線程安全性:final變量是線程安全的,而volatile變量僅在寫入操作時是線程安全的。

*適用范圍:volatile關(guān)鍵字適用于變量和字段,而final關(guān)鍵字適用于變量、字段和方法。

具體應(yīng)用場景

*volatile:用于多線程環(huán)境中共享數(shù)據(jù)的內(nèi)存可見性保障,如多線程計數(shù)器、線程標(biāo)志位等。

*final:用于確保變量或方法不可變,如常量定義、線程安全的方法實現(xiàn)等。第三部分MemoryModel和happens-before關(guān)系關(guān)鍵詞關(guān)鍵要點MemoryModel和happens-before關(guān)系

主題名稱:多線程語義和一致性

-多線程程序中,線程并發(fā)執(zhí)行導(dǎo)致了內(nèi)存語義和一致性問題。

-MemoryModel定義了線程之間通信和同步的規(guī)則,以確保程序的正確性。

-happens-before關(guān)系描述了線程之間執(zhí)行順序的偏序關(guān)系,可用于推理線程間操作的可見性和一致性。

主題名稱:JavaMemoryModel

MemoryModel和Happens-Before關(guān)系

MemoryModel

MemoryModel定義了多線程環(huán)境中線程訪問共享內(nèi)存的行為。Java語言規(guī)范定義了兩種MemoryModel:

*串行一致性MemoryModel(SequentialConsistencyMemoryModel):在該模型下,每個操作都按照指定的順序執(zhí)行,并且所有線程都觀察到相同的執(zhí)行順序。這提供了最高級別的內(nèi)存可見性保證。

*弱一致性MemoryModel(WeakConsistencyMemoryModel):在該模型下,線程可以重排序內(nèi)存操作,只要最終結(jié)果與串行執(zhí)行相同即可。這允許編譯器和處理器進行優(yōu)化,但可能會導(dǎo)致線程對共享內(nèi)存的可見性問題。

Java虛擬機采用弱一致性MemoryModel。

Happens-Before關(guān)系

Happens-Before關(guān)系定義了多線程環(huán)境中事件之間的部分順序。如果事件Ahappens-before事件B,則保證B在A發(fā)生后才會發(fā)生。Happen-Before關(guān)系存在于以下情況:

*程序順序規(guī)則:同一個線程中,后面的語句happens-before前面的語句。

*監(jiān)視器鎖定規(guī)則:一個線程獲取鎖,其后的所有動作happens-before其他線程釋放該鎖。

*volatile變量規(guī)則:寫入volatile變量的寫操作happens-before后續(xù)對該變量的任何讀操作。

*final字段規(guī)則:對final字段的寫入操作happens-before后續(xù)對該字段的任何讀操作。

*線程啟動規(guī)則:一個線程的start()方法執(zhí)行happens-before其他線程的run()方法執(zhí)行。

*線程終止規(guī)則:一個線程終止happens-before其他線程檢測到它的終止。

初始化順序保障

Happen-Before關(guān)系對于保證多線程環(huán)境下的初始化順序至關(guān)重要。Java語言規(guī)范通過以下規(guī)則確保初始化的順序:

*final字段:final字段在構(gòu)造函數(shù)完成之前被初始化,并且happens-before所有對該字段的后續(xù)讀操作。

*volatile變量:volatile變量在寫入操作完成之前被初始化,并且happens-before所有對該變量的后續(xù)讀操作。

*靜態(tài)初始化程序:靜態(tài)初始化程序在類被加載之前執(zhí)行,并且happens-before類中的所有其他初始化。

*實例初始化程序:實例初始化程序在構(gòu)造函數(shù)完成之前執(zhí)行,并且happens-before構(gòu)造函數(shù)的其余部分。

這些規(guī)則確保了在多線程環(huán)境中,所有線程都能以一致的方式觀察到對象的初始化狀態(tài)。如果沒有這些保障,可能會導(dǎo)致線程訪問未初始化或部分初始化的對象,從而導(dǎo)致不確定的行為。第四部分Lock機制和有序初始化關(guān)鍵詞關(guān)鍵要點【Lock機制】

1.Lock機制通過對共享資源進行同步訪問,確保多線程環(huán)境下的數(shù)據(jù)一致性和原子性。

2.Lock可以分為互斥鎖和讀寫鎖,互斥鎖保證同一時刻只允許一個線程訪問共享資源,而讀寫鎖允許多個線程同時讀取共享資源,但只允許一個線程寫入。

3.Lock機制的引入可以有效避免多線程并發(fā)訪問導(dǎo)致的數(shù)據(jù)競爭和死鎖問題。

【有序初始化】

Lock機制

在多線程環(huán)境中,Lock(鎖)機制是一種用于協(xié)調(diào)線程訪問共享資源的技術(shù)。當(dāng)一個線程獲取一個鎖時,它將獨占訪問該資源,直到它釋放鎖為止。這確保了線程之間的互斥訪問,從而防止數(shù)據(jù)競爭和一致性問題。

有序初始化

有序初始化是指在多線程環(huán)境中以特定順序初始化對象或變量。這是為了防止由于線程競爭而導(dǎo)致數(shù)據(jù)不一致或程序崩潰??梢允褂靡韵录夹g(shù)實現(xiàn)有序初始化:

構(gòu)造函數(shù)保護

在對象的構(gòu)造函數(shù)中使用Lock機制。當(dāng)一個線程嘗試初始化對象時,它將獲取該對象的Lock。如果Lock已被另一個線程獲取,則當(dāng)前線程將等待,直到Lock被釋放。這確保了只有一個線程在任何給定時刻初始化對象。

靜態(tài)初始化

在類中聲明靜態(tài)變量并使用Lock保護靜態(tài)構(gòu)造函數(shù)。靜態(tài)構(gòu)造函數(shù)將在類被加載時調(diào)用,并且只有在所有靜態(tài)變量都被初始化后才會釋放Lock。這確保了靜態(tài)變量在所有線程中以預(yù)期的順序初始化。

volatile關(guān)鍵字

volatile關(guān)鍵字可用于確保變量在多線程環(huán)境中按預(yù)期更新。當(dāng)一個線程修改一個volatile變量時,編譯器將強制在更改發(fā)生后立即更新主內(nèi)存。這防止了其他線程讀取該變量的舊值。

原子操作

原子操作是單個、不可分割的操作,無法被線程中斷。使用原子操作可以確保在多線程環(huán)境中對共享變量進行原子更新。這消除了數(shù)據(jù)競爭的可能性。

示例

考慮以下示例代碼:

```java

privateintcount;

privatefinalLocklock=newReentrantLock();

lock.lock();

return++count;

lock.unlock();

}

}

}

```

在這個示例中,increment()方法使用Lock機制來確保線程之間的互斥訪問。在任何給定時刻,只有一個線程可以遞增count變量,從而防止數(shù)據(jù)競爭和不一致性。第五部分線程本地存儲與線程安全單例線程本地存儲(TLS)

線程本地存儲(TLS)是一種機制,用于為每個線程創(chuàng)建和維護一個獨立的存儲區(qū)域。該區(qū)域可以存儲每個線程的私有數(shù)據(jù),其他線程無法訪問這些數(shù)據(jù)。TLS變量的初始化是線程安全的,因為它們只對創(chuàng)建它們的線程可見。

實現(xiàn)方式:

TLS變量存儲在每個線程的線程控制塊(TCB)中。TCB是一個內(nèi)核數(shù)據(jù)結(jié)構(gòu),包含有關(guān)線程執(zhí)行狀態(tài)和資源的信息。TLS變量通過一個線程局部變量表(TLV)進行訪問,該表存儲在TCB中。每個線程都有一個唯一的TLV,其中包含該線程的所有TLS變量。

優(yōu)勢:

*線程安全性:TLS變量只對創(chuàng)建它們的線程可見,因此它們是線程安全的。

*效率:TLS變量的訪問非常高效,因為它們存儲在線程的TCB中,與其他線程的存儲區(qū)域隔離。

*可伸縮性:TLS變量不會導(dǎo)致線程間爭用,因此它們可以輕松地擴展到多線程環(huán)境中。

線程安全單例

線程安全單例是一種設(shè)計模式,用于確保在多線程環(huán)境中只有一個單例類的實例存在。這種模式依賴于TLS和雙重檢查鎖定(DCL)來實現(xiàn)線程安全性。

實現(xiàn)方式:

1.定義TLS變量:首先,為單例類定義一個TLS變量。這個變量將存儲單例類的實例,如果不存在,則為NULL。

2.DCL算法:在訪問單例類時,使用DCL算法來檢查TLS變量是否為NULL。如果不是,則返回存儲的實例。如果是,則使用同步代碼塊(例如互斥鎖)來保護實例的創(chuàng)建。

3.初始化實例:如果TLS變量為NULL,則在同步代碼塊中創(chuàng)建單例類的實例。

4.存儲實例:將新創(chuàng)建的實例存儲在TLS變量中。

優(yōu)勢:

*線程安全性:TLS和DCL算法共同確保在多線程環(huán)境中只有一個單例類實例存在。

*延遲初始化:單例類實例只有在需要時才會創(chuàng)建,從而提高了性能。

*靈活性:線程安全單例可以輕松地擴展到不同的多線程環(huán)境。

總之,線程本地存儲(TLS)提供了一種為每個線程創(chuàng)建和維護私有存儲區(qū)域的機制,而線程安全單例利用TLS和雙重檢查鎖定(DCL)來確保在多線程環(huán)境中只有一個單例類的實例存在。這些技術(shù)在多線程編程中至關(guān)重要,有助于防止數(shù)據(jù)競爭和保證代碼的正確執(zhí)行。第六部分CAS操作的原子性保障關(guān)鍵詞關(guān)鍵要點CAS操作的原子性保障

主題名稱:CAS操作的原理

1.CAS(CompareAndSwap)是一種原子操作,它允許線程在比較一個位置的值是否等于預(yù)期值時進行替換。

2.如果比較成功(值相等),CAS操作將執(zhí)行替換,并返回true。

3.如果比較失?。ㄖ挡幌嗟龋珻AS操作將不執(zhí)行替換,并返回false。

主題名稱:CAS操作的原子性實現(xiàn)

CAS操作的原子性保障

在多線程環(huán)境下,比較并交換(CAS)操作提供了一種原子性地更新內(nèi)存中變量值的方法。原子性是指操作要么完全執(zhí)行,要么完全不執(zhí)行,中間不會被中斷。CAS操作通常以以下形式執(zhí)行:

```

CAS(V,E,N)

```

其中:

*V:要更新的變量

*E:預(yù)期的值

*N:要設(shè)置的新值

CAS操作檢查V的當(dāng)前值是否等于E。如果相等,它將V的值更新為N。否則,它不做任何操作并返回false。

CAS操作的原子性是由硬件提供的?,F(xiàn)代處理器架構(gòu)通常包含專門的原子性指令,例如Intelx86架構(gòu)中的LOCK前綴或ARM架構(gòu)中的LDREX/STREX指令。這些指令確保操作不會被其他處理器或線程中斷。

CAS操作的原子性對于多線程編程中的許多場景非常重要。例如:

*鎖的實現(xiàn):CAS操作可以用來實現(xiàn)自旋鎖,這是一種無阻塞的鎖機制。自旋鎖使用CAS操作來原子性地獲取鎖,避免了其他線程在訪問臨界區(qū)時阻塞。

*無鎖數(shù)據(jù)結(jié)構(gòu)的更新:CAS操作可以用來原子性地更新無鎖數(shù)據(jù)結(jié)構(gòu),例如無鎖隊列或無鎖棧。這確保了數(shù)據(jù)結(jié)構(gòu)的完整性和一致性。

*多線程計數(shù)器:CAS操作可以用來原子性地更新多線程計數(shù)器,確保計數(shù)器的值始終準(zhǔn)確。

CAS操作的局限性

雖然CAS操作提供了原子性保障,但它也存在一些局限性:

*ABA問題:如果V的值在CAS操作執(zhí)行之前從E更改為其他值A(chǔ),然后又更改回E,則CAS操作將更新V的值為N,即使V的實際值已經(jīng)發(fā)生了變化。這被稱為ABA問題。

*不能處理多個變量:CAS操作一次只能更新一個變量。如果需要原子性地更新多個變量,需要使用更復(fù)雜的機制,例如事務(wù)內(nèi)存。

結(jié)論

CAS操作是多線程編程中一種重要的同步原語,它提供了原子性保障。它廣泛用于實現(xiàn)各種并發(fā)數(shù)據(jù)結(jié)構(gòu)和算法。了解CAS操作的原子性保障及其局限性對于設(shè)計和實現(xiàn)健壯和高效的多線程程序至關(guān)重要。第七部分并發(fā)容器的早期初始化優(yōu)化關(guān)鍵詞關(guān)鍵要點【并發(fā)容器的早期初始化優(yōu)化】

1.初始化延遲:并發(fā)容器在實際使用前才進行初始化,這可能會導(dǎo)致性能下降。

2.并發(fā)訪問安全性:早期初始化可以防止在容器使用前發(fā)生并發(fā)訪問錯誤。

3.單例模式支持:早期初始化有助于實現(xiàn)并發(fā)容器的單例模式,確保只有一個實例被初始化。

【容器特定優(yōu)化】

并發(fā)容器的早期初始化優(yōu)化

并發(fā)容器是一種經(jīng)過專門設(shè)計的容器,可以在多線程環(huán)境中執(zhí)行并發(fā)的讀寫操作。為了提高性能,這些容器通常采用延遲初始化策略,其中只有在第一個線程訪問容器時才會初始化容器。

但是,在某些情況下,早期初始化可能更可取。例如,在以下場景中,早期初始化可以顯著提高性能:

*頻繁訪問的容器:如果容器預(yù)計會被頻繁訪問,則延遲初始化的開銷可能會很昂貴。在這種情況下,早期初始化可以避免導(dǎo)致性能下降的反復(fù)初始化。

*大容器:對于包含大量元素的大型容器,初始化操作可能是耗時的。早期初始化允許應(yīng)用程序在應(yīng)用程序啟動時進行初始化,而不是在第一個訪問時,從而避免了對性能的重大影響。

*特定初始化要求:某些并發(fā)容器可能需要在使用前執(zhí)行特定的初始化步驟。早期初始化確保在訪問容器之前完成這些步驟,從而避免了潛在的競爭條件或異常行為。

為了實現(xiàn)早期初始化,并發(fā)容器可以使用以下技術(shù):

*靜態(tài)初始化:容器類可以聲明為靜態(tài),這意味著它在應(yīng)用程序啟動時初始化。

*顯式初始化:應(yīng)用程序可以顯式調(diào)用指定用于初始化容器的方法。

*延遲單例初始化:容器可以實現(xiàn)延遲單例模式,其中只有在第一次訪問時才會初始化容器。但是,與常規(guī)延遲初始化相比,它使用額外的鎖定機制來確保線程安全。

以下是一些常見的并發(fā)容器在早期初始化方面的實現(xiàn):

*ConcurrentHashMap:ConcurrentHashMap使用延遲初始化,但它還提供了`ConcurrentHashMap(intinitialCapacity,floatloadFactor,intconcurrencyLevel)`構(gòu)造函數(shù),允許顯式指定初始容量、加載因子和并發(fā)級別,從而實現(xiàn)提前初始化。

*CopyOnWriteArrayList:CopyOnWriteArrayList使用延遲初始化,但它還提供了`CopyOnWriteArrayList(List<?extendsE>list)`構(gòu)造函數(shù),允許復(fù)制指定列表的內(nèi)容,從而實現(xiàn)早期初始化。

*ConcurrentLinkedQueue:ConcurrentLinkedQueue使用延遲初始化,但它還提供了`ConcurrentLinkedQueue(Collection<?extendsE>c)`構(gòu)造函數(shù),允許復(fù)制指定集合的內(nèi)容,從而實現(xiàn)早期初始化。

早期初始化并發(fā)容器需要權(quán)衡。雖然它可以提高性能,但它也可能增加內(nèi)存開銷,因為容器即使在不使用時也會被初始化。因此,在應(yīng)用早期初始化之前,考慮應(yīng)用程序的特定需求非常重要。第八部分Java內(nèi)存模型中的volatile可見性Java內(nèi)存模型中的volatile可見性

Java內(nèi)存模型(JMM)定義了多線程環(huán)境中變量可見性和同步行為。volatile關(guān)鍵字是一種Java語言修飾符,用于聲明變量應(yīng)具有可見性和強制刷新。

可見性保障

volatile變量在不同線程中具有可見性,這意味著一個線程對volatile變量的更新對其他線程立即可見。這消除了緩存一致性問題,確保了在所有線程中都能看到對volatile變量的最新值。

JMM通過使用內(nèi)存屏障來強制執(zhí)行可見性。寫入屏障用于阻止處理器將寫入操作重新排序到內(nèi)存屏障之后。讀取屏障用于阻止處理器將讀取操作重新排序到內(nèi)存屏障之前。寫入屏障和讀取屏障共同確保對volatile變量的寫入和讀取按程序順序發(fā)生。

強制刷新

volatile變量在每個寫操作后都會強制刷新到主內(nèi)存。這與非volatile變量不同,非volatile變量可能會被處理器緩存,從而導(dǎo)致一個線程看不到另一個線程對同一變量所做的更新。

通過強制將對volatile變量的寫入刷新到主內(nèi)存,JMM確保了所有線程都可以看到對volatile變量所做的最新更改。這對于在多線程環(huán)境中進行可靠的通信至關(guān)重要。

volatile的限制

volatile可見性提供了基本的可見性保障,但它并不提供原子性或線程安全性。這意味著:

*多個線程可以同時寫入同一volatile變量,這可能會導(dǎo)致值損壞。

*volatile變量不能用于同步或鎖機制。

volatile的正確使用

volatile應(yīng)該謹(jǐn)慎使用,僅用于需要可見性而不需要原子性或線程安全性的情況。以下是使用volatile的一些常見場景:

*多線程環(huán)境中的布爾標(biāo)志,用于指示某個事件的發(fā)生。

*在一個線程中更新并在另一個線程中讀取的計數(shù)器。

*用作鎖的標(biāo)志,以防止多個線程同時進入臨界區(qū)。

示例

以下示例展示了volatile的使用:

```java

privatevolatilebooleanflag=false;

flag=value;

}

returnflag;

}

}

```

在該示例中,flag變量被聲明為volatile,以確保在不同線程中對flag的訪問是可見的。這意味著一個線程對flag的更新將立即對其他線程可見。關(guān)鍵詞關(guān)鍵要點主題名稱:線程間共享數(shù)據(jù)的可見性問題

關(guān)鍵要點:

-線程間共享數(shù)據(jù)可能出現(xiàn)可見性問題,即某個線程對共享數(shù)據(jù)的修改不會被其他線程及時感知到。

-這是由于線程的本地內(nèi)存中會緩存最近訪問過的數(shù)據(jù),而這些緩存可能與其他線程的不同步。

-為了保證共享數(shù)據(jù)的可見性,需要使用內(nèi)存屏障或鎖機制等同步機制。

主題名稱:線程間資源競爭

關(guān)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論