柚子快報(bào)邀請碼778899分享:9.26日工作學(xué)習(xí)記錄
柚子快報(bào)邀請碼778899分享:9.26日工作學(xué)習(xí)記錄
List
CopyOnWriteArrayList 是 Java java.util.concurrent 包中的一個(gè)線程安全的變體 ArrayList。
在多線程環(huán)境中,當(dāng)一個(gè)線程在迭代列表的同時(shí),另一個(gè)線程可以修改列表(添加或刪除元素),CopyOnWriteArrayList 能夠保證迭代器不會(huì)拋出 ConcurrentModificationException。這是通過創(chuàng)建底層數(shù)組的一個(gè)快照來實(shí)現(xiàn)的,迭代器將只看到快照版本,而不會(huì)受到并發(fā)修改的影響。
迭代器(Iterator)是一種設(shè)計(jì)模式,它提供了一種遍歷集合(如列表、集合)元素的方法,而不需要暴露其底層的結(jié)構(gòu)。在 Java 中,迭代器模式通常通過 Iterator 接口實(shí)現(xiàn),該接口定義了遍歷集合的基本操作,如 hasNext()、next() 和 remove()。
ConcurrentModificationException 是 Java 中的一種運(yùn)行時(shí)異常,它通常在單線程環(huán)境中拋出,當(dāng)你在迭代一個(gè)集合(如 ArrayList、LinkedList)的過程中,嘗試修改集合的結(jié)構(gòu)(添加、刪除元素)而不使用迭代器的 remove 方法時(shí),就會(huì)拋出這個(gè)異常。
這里的關(guān)鍵點(diǎn)是“迭代過程中的修改”。Java 的 ArrayList 和 LinkedList 等集合類在迭代時(shí)提供了一種檢測機(jī)制,用于識(shí)別是否在迭代過程中有其他方式(非迭代器自身)修改了集合。如果檢測到這種情況,就會(huì)拋出 ConcurrentModificationException 來防止不可預(yù)知的行為。
CopyOnWriteArrayList?是如何解決這個(gè)問題的?
CopyOnWriteArrayList 通過創(chuàng)建底層數(shù)組的快照來解決這個(gè)問題。當(dāng)?shù)鞅粍?chuàng)建時(shí),它獲取了底層數(shù)組的一個(gè)副本,而不是直接引用原始數(shù)組。這樣,即使另一個(gè)線程修改了原始數(shù)組,迭代器仍然可以安全地迭代它的快照版本,而不會(huì)被這些修改影響。
2.
CountDownLatch latch = new CountDownLatch(list.size());
`CountDownLatch` 是 Java 并發(fā)編程中的一種同步輔助工具,它允許一個(gè)或多個(gè)線程等待一組操作完成。這個(gè)類位于 `java.util.concurrent` 包中。
當(dāng)你創(chuàng)建一個(gè) `CountDownLatch` 實(shí)例時(shí),你需要傳遞一個(gè)計(jì)數(shù)器的初始值,這個(gè)值表示需要等待的操作的數(shù)量。每次一個(gè)操作完成時(shí),計(jì)數(shù)器的值就會(huì)減少,通過調(diào)用 `CountDownLatch` 的 `countDown()` 方法來實(shí)現(xiàn)。
3. **`new CountDownLatch(list.size())`**:創(chuàng)建一個(gè) `CountDownLatch` 實(shí)例,其計(jì)數(shù)器的初始值設(shè)置為 `list` 的大小。這意味著,在所有 `list` 中的元素對應(yīng)的操作完成之前,任何調(diào)用 `latch.await()` 的線程都將被阻塞。
### 使用場景
`CountDownLatch` 通常用于以下場景:
- **線程協(xié)調(diào)**:當(dāng)你有多個(gè)線程并行執(zhí)行任務(wù),并且你需要等待所有任務(wù)都完成后才能繼續(xù)執(zhí)行下一步操作時(shí)。
### 舉個(gè)例子
假設(shè)你有一個(gè)任務(wù)列表,你想要并行地處理這些任務(wù),并且只有在所有任務(wù)都完成后,你才想要執(zhí)行某些后續(xù)操作:
List
// 假設(shè)我們有一些任務(wù)需要提交
for (int i = 0; i < 5; i++) {
? ? tasks.add(() -> {
? ? ? ? // 執(zhí)行一些工作
? ? ? ? return null;
? ? });
}
CountDownLatch latch = new CountDownLatch(tasks.size());
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (Callable
? ? executorService.submit(() -> {
? ? ? ? try {
? ? ? ? ? ? task.call();
? ? ? ? } finally {
? ? ? ? ? ? latch.countDown(); // 任務(wù)完成后調(diào)用countDown
? ? ? ? }
? ? });
}
latch.await(); // 等待所有任務(wù)完成
System.out.println("所有任務(wù)已完成");
executorService.shutdown();
在這個(gè)例子中,我們創(chuàng)建了一個(gè) `CountDownLatch`,其計(jì)數(shù)器的初始值等于任務(wù)的數(shù)量。每個(gè)任務(wù)完成后,都會(huì)調(diào)用 `countDown()` 方法,將計(jì)數(shù)器的值減一。主線程調(diào)用 `latch.await()`,將會(huì)等待直到計(jì)數(shù)器的值達(dá)到零,這意味著所有的任務(wù)都已完成。
### 注意事項(xiàng)
- `CountDownLatch` 一旦計(jì)數(shù)器的值達(dá)到零,就不能再被重置。如果你需要重復(fù)使用類似的同步邏輯,可能需要?jiǎng)?chuàng)建新的 `CountDownLatch` 實(shí)例。 - `await()` 方法可以帶超時(shí)參數(shù),允許你指定等待的時(shí)間長度。 - `CountDownLatch` 是一次性的,它的計(jì)數(shù)器只能遞減,不能遞增。如果需要可以重置的計(jì)數(shù)器,可以考慮使用 `CyclicBarrier` 或 `Semaphore`。
3.
applicationContext.publishEvent(new ApartmentEvent(this, list));
這行代碼看起來是Java語言中Spring框架的一部分,用于發(fā)布一個(gè)事件。下面是這行代碼的解釋:
1. `applicationContext`:這是一個(gè)Spring的`ApplicationContext`對象,它負(fù)責(zé)管理Spring容器中的bean。
2. `publishEvent`:這是`ApplicationContext`的一個(gè)方法,用于發(fā)布事件。在Spring框架中,事件驅(qū)動(dòng)模型是一種設(shè)計(jì)模式,它允許應(yīng)用程序的不同部分之間進(jìn)行松耦合通信。
3. `new ApartmentEvent(this, list)`:這是創(chuàng)建一個(gè)新的事件對象。`ApartmentEvent`可能是一個(gè)自定義的事件類,它繼承自`ApplicationEvent`。這個(gè)構(gòu)造函數(shù)接受兩個(gè)參數(shù):`this`指的是當(dāng)前對象的引用,`list`可能是一個(gè)包含公寓信息的列表。
4. `this`:在構(gòu)造函數(shù)中,`this`通常指的是當(dāng)前對象的引用,它可能被用來傳遞當(dāng)前的上下文或者狀態(tài)信息。
5. `list`:這是一個(gè)參數(shù),可能是一個(gè)包含公寓信息的對象列表。這個(gè)列表將作為事件的一部分被發(fā)布,這樣監(jiān)聽這個(gè)事件的監(jiān)聽器就可以獲取到這些信息。
總的來說,這行代碼的作用是在Spring應(yīng)用程序中發(fā)布一個(gè)包含公寓信息列表的事件。任何注冊為監(jiān)聽這個(gè)事件的監(jiān)聽器都會(huì)接收到這個(gè)事件,并可以對它做出響應(yīng)。這通常用于實(shí)現(xiàn)事件驅(qū)動(dòng)的應(yīng)用程序,例如,當(dāng)公寓信息發(fā)生變化時(shí)通知其他系統(tǒng)組件。 ?
柚子快報(bào)邀請碼778899分享:9.26日工作學(xué)習(xí)記錄
相關(guān)閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。