震驚!ConcurrentHashMap裏面也有死循環,作者留下的“彩蛋”了解一下?

JDK BUG

這篇文章,聊一下我最近才知道的一個關於 JDK 8 的 BUG 吧。

首先說一下我是怎麼發現這個 BUG 的呢?

大家都知道我對 Dubbo 有一定的關注,前段時間 Dubbo 2.7.7 發布后我看了它的更新點,就是下面這個網址: https://github.com/apache/dubbo/releases/tag/dubbo-2.7.7

其中有 Bugfixes 這一部分:

每一個我都去簡單的看了一下,其他的 Bugfixes 或多或少都和 Dubbo 框架有一定的關聯性。但是上面紅框框起來的部分完全就是 JDK 的 Bug 了。

所以可以單獨拎出來說。

這個 Bug 我也是看到了這個地方才知道的,但是研究的過程中我發現,這個怎麼說呢:我懷疑這根本就不是 Bug ,這就是 Doug Lea 老爺子在釣魚執法。

為什麼這樣的說呢,大家看完本文就知道了。

Bug 穩定復現

點擊 Dubbo 裏面的鏈接,我們可以看到具體的描述就是一個鏈接:

打開這個鏈接:

https://bugs.openjdk.java.net/browse/JDK-8062841

我們可以看到:這個 Bug 是位於大名鼎鼎的 concurrent 包裏面的 computeIfAbsent 方法。

這個 Bug 在 JDK 9 裏面被修復了,修復人是 Doug Lea。

而我們知道 ConcurrentHashMap 就是 Doug Lea 的大作,可以說是“誰污染誰治理”。

要了解這個 Bug 是怎麼回事,就必須先了解下面這個方法是幹啥的:

java.util.concurrent.ConcurrentHashMap#computeIfAbsent

從這個方法的第二個入參 mappingFunction 我們可以知道這是 JDK 8 之後提供的方法了。

該方法的含義是:當前 Map 中 key 對應的值不存在時,會調用 mappingFunction 函數,並且將該函數的執行結果(不為 null)作為該 key 的 value 返回。

比如下面這樣的:

初始化一個 ConcurrentHashMap ,然後第一次去獲取 key 為 why 的 value,沒有獲取到,直接返回 null。

接着調用 computeIfAbsent 方法,獲取到 null 后調用 getValue 方法,將該方法的返回值和當前的 key 關聯起來。

所以,第二次獲取的時候拿到了 “why技術”。

其實上面的代碼的 17 行的返回值就是 “why技術”,只是我為了代碼演示,再去調用了一次 map.get() 方法。

知道這個方法干什麼的,接下來就帶大家看看 Bug 是什麼。

我們直接用這個問題裏面給的測試用例,地址:

https://bugs.openjdk.java.net/secure/attachment/23985/Main.java

我只是在第 11 行和第 21 行加入了輸出語句:

正常的情況下,我們希望方法正常結束,然後 map 裏面是這樣的:{AaAa=42,BBBB=42}

但是你把這個代碼拿到本地去跑(需要 JDK 8 環境),你會發現,這個方法永遠不會結束。因為它在進行死循環。

這就是 Bug。

提問的藝術

知道 Bug 了,按理來說就應該開始分析源碼,了解為啥出現了會出現這個 Bug。

但是我想先插播一小節提問的藝術。因為這個 Bug 就是一個活生生的示例呀。

這個鏈接,我建議你打開看看,這裏面還有 Doug Lea 老爺子的親自解答:

https://bugs.openjdk.java.net/browse/JDK-8062841

首先我們看提出問題的這個人對於問題的描述(可以先不用細看,反正看着也是懵逼的):

通常情況下,被提問的人分為兩類人:

1.遇到過並知道這個問題的人,可以看的明白你在說什麼。

2.雖然沒有碰見過這個問題,但感覺是自己熟悉的領域,可能知道答案,但是看了你的問題描述,也不知道你在說什麼。

這個描述很長,我第一次看的時候很懵逼,很難理解他在說什麼。我就是屬於第二類人。

而且在大多數的問題中,第二類人比第一類人多很多。

但是當我了解到這個 Bug 的來龍去脈的時候,再看這個描述,其實寫的很清楚了,也很好理解。我就變成第一類人了。

但是變成第一類人是有前提的,前提就是我已經了解到了這個地方 Bug 了。可惜,現在是提問,而被提問的人,還對這個 Bug 不是特別了解。

即使,這個被提問的人是 Doug Lea。

可以看到,2014 年 11 月 04 日 Martin 提出這個問題后, Doug Lea 在不到一個小時內就進行了回復,我給大家翻譯一下,老爺子回復的啥:

首先,你說你發現了 ConcurrentHashMap 的問題,但是我沒有看到的測試用例。那麼我就猜測一下是不是有其他線程在計算值的時候被卡住了,但是從你的描述中我也看不到相應的點。

簡單來說就是:Talk is cheap. Show me the code.(屁話少說,放碼過來。)

於是另一個哥們 Pardeep 在一個月後提交了一個測試案例,就是我們前面看到的測試案例:

Pardeep 給 Martin 回復到下面這段話:

他開門見山的說:我注意這個 bug 很長時間了,然後我還有一個測試用例。

可以說這個測試案例的出現,才是真正的轉折點。

然後他提出了自己的看法,這段描述簡短有力的說出了問題的所在(後面我們會講到),然後他還提出了自己的意見。

不到一個小時,這個回到得到了 Doug Lea 的回復:

他說:小伙子的建議還是不錯的,但是現在還不是我們解決這個問題的時候。我們也許會通過代碼改進死鎖檢查機制,以幫助用戶 debug 他們的程序。但是目前而言,這種機制就算做出來,工作效率也是非常低下的,比如在當前的這個案例下。但是現在我們至少清楚的知道,是否要實現這種機制是不能確定的。

總之一句話:問題我知道了,但是目前我還沒想到好的解決方法。

但是,在 19 天以後,老爺子又回來處理這個問題了:

這次的回答可謂是峰迴路轉,他說:請忽略我之前的話。我們發現了一些可行的改進方法,這些改進可以處理更多的用戶錯誤,包括本報告中所提供的測試用例,即解決在 computeIfAbsent 中提供的函數中進行遞歸映射更新導致死鎖這樣的問題。我們會在 JDK 9 裏面解決這個問題。

所以,回顧這個 Bug 被提出的過程。

首先是 Martin 提出了這個問題,並進行了詳細的描述。可惜的是他的描述很專業,是站在你已經了解了這個 Bug 的立場上去描述的,讓人看的很懵逼。

所以 Doug Lea 看到后也表示這啥呀,沒搞懂。

然後是 Pardeep 跟進這個問題,轉折點在於他拋出的這個測試案例。而我相信,既然 Martin 能把這個問題描述的很清楚,他一定是有一個自己的測試案例的,但是他沒有展現出來。

所以,朋友們,測試案例的重要性不言而喻了。問問題的時候不要只是拋出異常,你至少給段對應的代碼,或者日誌,或者一次性描述清楚,寫在文檔裏面發出來也行呀。

Bug 的原因

導致這個 Bug 的原因也是一句話就能說清楚,前面的 Pardeep 老哥也說了:

問題在於我們在進行 computeIfAbsent 的時候,裏面還有一個 computeIfAbsent。而這兩個 computeIfAbsent 它們的 key 對應的 hashCode 是一樣的。

你說巧不巧。

當它們的 hashCode 是一樣的時候,說明它們要往同一個槽放東西。

而當第二個元素進來的時候,發現坑位已經被前一個元素佔領了,可能就是這樣的畫風:

接下來我們就解析一下 computeIfAbsent 方法的工作流程:

第一步是計算 key 對應的 hashCode 應該放到哪個槽裏面。

然後是進入1649 行的這個 for 循環,而這個 for 循環是一個死循環,它在循環體內部判斷各種情況,如果滿足條件則 break 循環。

首先,我們看一下 “AaAa” 和 “BBBB” 經過 spread 計算(右移 16 位高效計算)后的 h 值是什麼:

哇塞,好巧啊,從框起來的這兩部分可以看到,都是 2031775 呢。

說明他們要在同一個槽裏面搞事情。

先是 “AaAa” 進入 computeIfAbsent 方法:

在第一次循環的時候 initTable,沒啥說的。

第二次循環先是在 1653 行計算出數組的下標,並取出該下標的 node。發現這個 node 是空的。於是進入分支判斷:

在標號為 ① 的地方進行 cas 操作,先用 r(即 ReservationNode)進行一個佔位的操作。

在標號為 ② 的地方進行 mappingFunction.apply 的操作,計算 value 值。如果計算出來不為 null,則把 value 組裝成最終的 node。

在標號為 ③ 的東西把之前佔位的 ReservationNode 替換成標號為 ② 的地方組裝成的node 。

問題就出現標號為 ② 的地方。可以看到這裏去進行了 mappingFunction.apply 的操作,而這個操作在我們的案例下,會觸發另一次 computeIfAbsent 操作。

現在 “AaAa” 就等着這個 computeIfAbsent 操作的返回值,然後進行下一步操作,也就是進行標號為 ③ 的操作了。

接着 “BBBB” 就來了。

通過前面我們知道了 “BBBB” 的 hashCode 經過計算后也是和 “AaAa” 一樣。所以它也要想要去那個槽裏面搞事情。

可惜它來晚了一步。

帶大家看一下對應的代碼:

當 key 為 “BBBB” 的時候,算出來的 h 值也是 2031775。

它也會進入 1649 行的這個死循環。然後進行各種判斷。

接下來我要論證的是:

在本文的示例代碼中,當運行到 key 為 “BBBB” 的時候,進入 1649 行這個死循環后,就退不出來了。程序一直在裏面循環運行。

在標號為 ① 的地方,由於這個時候 tab 已經不為 null 了,所以不會進入這個分支。

在標號為 ② 的地方,由於之前 “AaAa” 已經扔了一個 ReservationNode 進去佔位置了,所以不等於 null。所以,也就不會進入這個分支。

怕你懵逼,給你配個圖,真是暖男作者石錘了:

接下來到標號為 ③ 的地方,裏面有一個 MOVED,這個 MOVED 是幹啥的呢?

表示當前的 ConcurrentHashMap 是否是在進行擴容。

很明顯,現在還沒有到該擴容的時候:

第 1678 行的 f 就是之前 “AaAa” 扔進去的 ReservationNode ,這個 Node 的 hash 是 -3,不等於MOVED(-1)。

所以,不會進入這個分支判斷。

接下來,能進的只有標號為 ④ 的地方了,所以我們只需要把這個地方攻破,就徹底了解這個 Bug 了。

走起:

通過前面的分析我們知道了,當前案例情況下,只會進入 1672 行這個分支。

而這個分支裏面,還有四個判斷。我們一個個的攻破:

標號為 ⑤ 的地方,tabAt 方法取出來的對象,就是之前 “AaAa” 放進去的佔位的 ReservationNode ,也就是這個 f 。所以可以進入這個分支判斷。

標號為 ⑥ 的地方,fh >=0 。而 fh 是當前 node 的 hash 值,大於 0 說明當前是按照鏈表存儲的數據。之前我們分析過了,當前的 hash 值是 -3。所以,不會進入這個分支。

標號為 ⑦ 的地方,判斷 f 節點是否是紅黑樹存儲。當然不是的。所以,不會進入這個分支。

標號為 ⑧ 的地方,binCount 代表的是該下標裏面,有幾個 node 節點。很明顯,現在一個都沒有。所以當前的 binCount 還是 0 。所以,不會進入這個分支。

完了。分析完了。

Bug 也就出來了,一次 for 循環結束后,沒有 break。苦就苦在這個 for 循環還是個死循環。

再來一個上帝視角,看看當 key 為 “BBBB” 的時候發生了什麼事情:

進入無限循環內:

①.經過 “AaAa” 之後,tab 就不為 null 了。

②.當前的槽中已經被 “AaAa” 先放了一個 ReservationNode 進行佔位了,所以不為 null。

③.當前的 map 並沒有進行擴容操作。

④.包含⑤、⑥、⑦、⑧。

⑤.tabAt 方法取出來的對象,就是之前 “AaAa” 放進去的佔位的 ReservationNode,所以滿足條件進入分支。

⑥.判斷當前是否是鏈表存儲,不滿足條件,跳過。

⑦.判斷當前是否是紅黑樹存儲,不滿足條件,跳過。

⑧.判斷當前下標裏面是否放了 node,不滿足條件(“AaAa” 只有個佔位的Node ,並沒有初始完成,所以還沒有放到該下標裏面),進入下一次循環。

然後它就在死循環裏面出不來了!

我相信現在大家對於這個 Bug 的來路了解清楚了。

如果你是在 idea 裏面跑這個測試用例,也可以這樣直觀的看一眼:

點擊這個照相機圖標:

從線程快照裏面其實也是可以看到端倪的,大家可以去分析分析。

有的觀點說的是由於線程安全的導致的死循環,經過分析我覺得這個觀點是不對的。

它存在死循環,不是由於線程安全導致的,純粹是自己進入了死循環。

或者說,這是一個“彩蛋”?

或者……自信點,就說這事 Bug ,能穩定復現的那種。

那麼我們如果是使用 JDK 8 怎麼避免踩到這個“彩蛋”呢?

看看 Dubbo 裏面是怎麼解決的:

先調用了 get 方法,如果返回為 null,則調用 putIfAbsent 方法,這樣就能實現和之前一樣的效果了。

如果你在項目中也有使用 computeIfAbsent 的地方,建議也這樣去修改。

說到 ConcurrentHashMap get 方法返回 null,我就想起了之前討論的一個面試題了:

答案都寫在這個文章裏面了,有興趣的可以了解一下《這道面試題我真不知道面試官想要的回答是什麼》

Bug 的解決 其實徹底理解了這個 Bug 之後,我們再來看一下 JDK 9 裏面的解決方案,看一下官方源碼對比:

http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/src/main/java/util/concurrent/ConcurrentHashMap.java?r1=1.258&r2=1.259&sortby=date&diff_format=f

就加了兩行代碼,判斷完是否是紅黑樹節點后,再判斷一下是否是 ReservationNode 節點,因為這個節點就是個佔位節點。如果是,則拋出異常。

就這麼簡單。沒有什麼神秘的。

所以,如果你在 JDK 9 裏面執行文本的測試用例,就會拋出 IllegalStateException。

這就是 Doug Lea 之前提到的解決方案:

了解了這個 Bug 的來龍去脈后,特別是看到解決方案后,我們就能輕描淡寫的說一句:

害,就這?沒聽說過!

另外,我看 JDK 9 修復的時候還不止修復了一個問題:

http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/6dd59c01f011/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java

你去翻一翻。發現,啊,全是知識點啊,學不動了。

釣魚執法

為什麼我在文章的一開始就說了這是 Doug Lea 在釣魚執法呢?

因為在最開始提問的藝術那一部分,我相信,Doug Lea 跑完那個測試案例之後,心裏也有點數了。

大概知道問題在哪了,而且從他的回答和他寫的文檔中我也有理由相信,他寫的這個方法的時候就知道可能會出問題。

而且,Pardeep 的回復中提到了文檔,那我們就去看看官方文檔對於該方法的描述是怎樣的:

https://docs.oracle.com/javase/8/docs/api/

文檔中說函數方法應該簡短,簡單。而且不能在更新的映射的時候更新映射。就是說不能套娃。

套娃,用程序說就是recursive(遞歸),按照文檔說如果存在遞歸,則會拋出 IllegalStateException 。

而提到遞歸,你想到了什麼?

我首先就想到了斐波拉契函數。我們用 computeIfAbsent 實現一個斐波拉契函數如下:

public class Test {

static Map<Integer, Integer> cache = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        System.out.println("f(" + 14 + ") =" + fibonacci(14));
    }

    static int fibonacci(int i) {
        if (i == 0)
            return i;
        if (i == 1)
            return 1;
        return cache.computeIfAbsent(i, (key) -> {
            System.out.println("Slow calculation of " + key);
            return fibonacci(i - 2) + fibonacci(i - 1);
        });
    }
}

這就是遞歸調用,我用 JDK 1.8 跑的時候並沒有拋出 IllegalStateException,只是程序假死了,原因和我們前面分析的是一樣一樣的。我理解這個地方是和文檔不符的。

所以,我懷疑是 Doug Lea 在這個地方釣魚執法。

CHM一定線程安全嗎?

既然都說到 currentHashMap(CHM)了,那我說一個相關的注意點吧。

首先 CHM 一定能保證線程安全嗎?

是的,CHM 本身一定是線程安全的。但是,如果你使用不當還是有可能會出現線程不安全的情況。

給大家看一點 Spring 中的源碼吧:

org.springframework.core.SimpleAliasRegistry

在這個類中,aliasMap 是 ConcurrentHashMap 類型的:

在 registerAlias 和 getAliases 方法中,都有對 aliasMap 進行操作的代碼,但是在操作之前都是用 synchronized 把 aliasMap 鎖住了。

為什麼?為什麼我們操作 ConcurrentHashMap 的時候還要加鎖呢?

這個是根據場景而定的,這個別名管理器,在這裏加鎖應該是為了避免多個線程操作 ConcurrentHashMap 。

雖然 ConcurrentHashMap 是線程安全的,但是假設如果一個線程 put,一個線程 get,在這個代碼的場景裏面是不允許的。

如果覺得不太好理解的話我舉一個 redis 的例子。

redis 的 get、set 方法都是線程安全的吧。但是你如果先 get 再 set,那麼在多線程的情況下還是會有問題的。

因為這兩個操作不是原子性的。所以 incr 就應運而生了。

我舉這個例子的是想說線程安全與否不是絕對的,要看場景。給你一個線程安全的容器,你使用不當還是會有線程安全的問題。

再比如,HashMap 一定是線程不安全的嗎?

說不能說的這麼死吧。它是一個線程不安全的容器。但是如果我的使用場景是只讀呢?

在這個只讀的場景下,它就是線程安全的。

總之,看場景。道理,就是這麼一個道理。

最後說兩句(求關注)

所以點個“贊”吧,周更很累的,不要白嫖我,需要一點正反饋。

才疏學淺,難免會有紕漏,如果你發現了錯誤的地方,還請你留言指出來,我對其加以修改。

感謝您的閱讀,我堅持原創,十分歡迎並感謝您的關注。

我是 why,一個被代碼耽誤的文學創作者,不是大佬,但是喜歡分享,是一個又暖又有料的四川好男人。

歡迎關注我的微信公眾號:why技術。在這裏我會分享一些java技術相關的知識,用匠心敲代碼,對每一行代碼負責。偶爾也會荒腔走板的聊一聊生活,寫一寫書評、影評。感謝你的關注,願你我共同進步。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!

口罩繩易纏動物 動保籲丟棄前先剪掉

摘錄自2020年9月24日公視報導

英國陸續發現有海鷗的雙腳被口罩繩纏住,就像戴了腳鐐一樣。根據統計,全球目前每個月消耗1000多億個拋棄式口罩和手套,對環境造成很大的負擔;動保團體呼籲民眾在丟掉口罩之前,至少先把繩子剪掉,以免傷害無辜的動物。

南韓環境運動聯合會白娜媛說:「一次性口罩是塑料做的,因此幾乎不能分解,因為無法回收,所以不是焚化就是掩埋,這對自然造成巨大負擔。」

英國皇家防止虐待動物協會10號指出,疫情爆發僅半年,他們就救援900多隻因廢棄口罩或塑膠垃圾受困的動物,呼籲大眾丟口罩前先剪斷鬆緊繩,以免纏住動物。

生物多樣性
國際新聞
口罩
海鷗

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

中國承諾2060年實現碳中和 外媒提五大疑問

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

亂棄口罩掀生態災難 企鵝誤吞N95口罩伏屍巴西沙灘

摘錄自2020年9月25日蘋果新聞報導

近日巴西聖保羅有企鵝伏屍沙灘,經驗屍發現牠胃內藏有一個無法消化的N95口罩,當地保育組織斥人類不當棄置廢物會導致海洋動物傷亡。

當地海洋保育組織Instituto Argonauta解剖時發現,企鵝的胃部有一個完整的N95口罩,相信令企鵝無法消化致死。組織又指出,自4月起在聖保羅北部沿岸已撿到多達113個棄置口罩,當中包括企鵝伏屍的沙灘。組織斥企鵝之死反映不當棄置廢物可導致海洋動物傷亡。

世界自然基金會(WWF)在7月亦警告過不當棄置口罩等個人防護設備(PPE),恐會對環境造成威脅。即使僅有1%的口罩未有妥善處理,已可導致每月有1000萬個棄置口罩流出大自然。

生物多樣性
國際新聞
巴西
企鵝
口罩
誤食

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

日本群馬縣養豬場爆發豬瘟 將撲殺5400頭豬隻

摘錄自2020年09月27日中央通訊社日本報導

日本農林水產省26日宣布,群馬縣高崎市一座養豬場發現豬隻感染家畜傳染病豬瘟(CSF),縣當局將依法撲殺養豬場內全部約5400頭豬隻。

時事通信社報導,這座養豬場為預防感染豬瘟,曾為豬隻接種疫苗,但確診感染的小豬並未接種疫苗。

這是時隔約半年,日本國內養豬場再度爆發豬瘟疫情,也是自2018年日本國內睽違26年首度爆發豬瘟疫情以來,群馬縣內養豬場首度確認感染。

群馬縣當局於發現野生野豬感染豬瘟後,從去年10月起,著手為養豬場接種疫苗。

生物多樣性
循環經濟
國際新聞
日本
豬瘟
經濟動物

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

※推薦評價好的iphone維修中心

最後生還者!澳洲擱淺領航鯨110頭獲救 360具鯨屍將拋海上

摘錄自2020年9月27日自由時報報導

澳洲塔斯馬尼亞州一座偏遠海港附近,上週約有470頭長肢領航鯨(long-finned pilot whale)擱淺,是澳洲史上最大規模的鯨魚擱淺紀錄,在救援人員積極搶救後,最後一頭還殘喘鯨魚在今(27)日被送回大海,讓倖存鯨魚數量達到110頭,政府將把重點轉向處理約360具鯨屍。

綜合外媒報導,在麥格理港(Macquarie Harbour)發現領航鯨擱淺後,100多名救援人員過去幾天不斷在寒冷的海水中搶救生還者,週日在數百具鯨屍中又發現了一頭還活著的鯨魚。塔斯馬尼亞州環境部門發言人說,這「完全不簡單」,並提到這頭鯨魚已被帶回大海中。

當地政府今日將重點從搜救轉為處理大批鯨屍,有數艘船今天將約200具屍體拖離港口,官方希望在週三天氣惡化前將處理完剩餘的死亡鯨魚。官方警告說,該地區可能會發現更多的鯨魚,因為有些鯨魚可能會二次擱淺。巴克也說,一些鯨魚屍體可能會漂回該地區的海灘。

海洋
國際新聞
澳洲
鯨豚擱淺
鯨魚
鯨魚擱淺

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

共同社:全球再生能源發電量 首次超越核能

摘錄自2020年9月27日聯合報報導

日本共同社報導,法國、日本和英國等研究團隊日前報告稱,全球再生能源發電量在去年首次超越核電核電。太陽能和風力發電增加,但核能因先進國家反應爐相繼報廢而明顯停滯,僅略超過去年發電量。

今年出版的世界核能產業現狀報告顯示,去年啟用的核能發電廠分別是俄國3座、中國大陸2座及南韓1座,發電量為2兆6570億度,較上年增加3.7%。今年上半年沒有核電廠啟動,法國、德國和美國等國去年決定關閉的核電廠有5座,今年上半年為3座。

報告還稱,涉及放射性物質發電的核能與其他發電方式相比,新冠肺炎疫情蔓延導致核電廠相關設備檢查延遲對安全性影響更大。

能源轉型
國際新聞
再生能源
核能

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

全球最大零售商 Walmart 宣布,旗下所有物流車輛全面電動化

摘錄自2020年9月25日科技新報報導

全球最大零售商 Walmart(沃爾瑪)近日宣布,將在 2040 年前達成全車隊碳排放歸零目標,比巴黎協定的 2050 年碳中和提前10年。

身為全球最賺錢的公司之一,Walmart 世界各國分店多達 1萬1200 家,全天候 24 小時不間斷物流,每年合計里程數高達 11 億公里,這些里程數如果全都改成純電動車輛運送,將會顯著降低道路的碳排放量。

車隊全面電動化不只是車輛改成電動車這麼簡單,Walmart 也是美國最大充電服務商之一 Electrify America 的主要合作夥伴,目前提供 120 個快速充電站讓電動車使用,這將會成為他們拓展電動物流網絡的基石。

Walmart 除了讓車隊電動化,為了進一步提升減碳效果,也計畫 2035 年前,完成全廠房綠電目標,因此將在今年開始,全球範圍內擴大建設(或購買)風力、太陽能和其他再生能源設備。

能源轉型
國際新聞
美國
零售商
沃爾瑪
電動車

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

※教你寫出一流的銷售文案?

戴姆勒與旗下美國賓士 將為排放測試作弊賠上15億美元

環境資訊中心外電;姜唯 翻譯;林大利 審校;稿源:ENS

美國和加州政府與德國汽車大廠戴姆勒及其美國子公司美國賓士達成和解,戴姆勒與美國賓士因出廠柴油車在排放測試上作弊,違反《乾淨空氣法(Clean Air Act)》和加州法律,必須支付8.75億美元的民事賠償金,以及大約7,030萬美元的其他罰金,創下《乾淨空氣法》生效以來第二高的民事賠償金額。若再加上召回計畫和聯邦補救措施,戴姆勒總共要付出約15億美元(約新台幣438億元)來達成此次和解。

戴姆勒與美國賓士因出廠柴油車在排放測試上作弊,違反《乾淨空氣法(Clean Air Act)》和加州法律,需支付高額賠償金。照片來源:Alesha(CC BY-NC 2.0)

達成和解後 戴姆勒須召回2009至2016年的賓士柴油車

美國環保署、司法部和加州空氣資源委員會(CARB)於9月14日在華盛頓特區美國哥倫比亞特區地方法院遞交和解協議,戴姆勒必須召回2009年至2016年間在美國銷售的所有賓士柴油車,修理其排放系統,涉及約25萬輛輕型和中型柴油車,即2009-2016年款的小客車和Sprinter廂型車。

戴姆勒也必須延長這些車輛中某些零件的保修期限,設法使車輛減少排放會產生過量臭氧的氮氧化物(NOx),並實施可防堵排放作弊的新內部稽核流程。

環保署表示,車輛排放的氮氧化物是地面臭氧產生的關鍵,損害人體健康。吸入臭氧會損害肺組織,加重心臟病和肺部疾病,如氣喘、肺氣腫和支氣管炎。

此次召回計畫和聯邦補救措施預計將使戴姆勒花費約4.36億美元。戴姆勒將再出1.1億美元資助加州的補救措施。也就是說,為達成此次和解,戴姆勒總共要付出約15億美元(約新台幣438億元)。

「我們傳達出明確的訊息,環保署會落實執法、保護環境和公共健康。若試圖欺騙體制、誤導大眾,將會被逮到。」美國環保署官員惠勒(Andrew Wheeler)說,「為了追求利潤而背叛大眾信任者將兩者盡失。」

2010年賓士Sprinter2500型廂型車。照片來源:
維基百科(CC BY-SA 2.0)

戴姆勒聲明 公司是為了避免冗長的訴訟才和解

戴姆勒否認當局的指控以及原告的集體訴訟,也不承認對美國、加州、原告或其他任何一方負有責任。

該和解協議解決了戴姆勒正在與美國當局進行的民事訴訟,但未針對戴姆勒柴油車是否有減效裝置做出任何判決。戴姆勒的聲明指出,該公司結束訴訟程序,是為了避免冗長的訴訟,並承擔相應的法律和財務風險。

《乾淨空氣法》和聯邦法規要求車輛製造商在美國銷售新型號的車輛之前,必須向EPA申請並獲得合格證書。製造商必須證明車輛符合排放標準,並向EPA揭露所有輔助排放控制裝置(AECD)以及車輛中安裝的所有減效裝置。

美國和CARB在2020年9月14日分別提起民事訴訟指控,2009年至2016年期間,戴姆勒製造、進口和銷售了超過25萬輛柴油廂型車和小客車,但未揭露AECD和減效裝置。

減效裝置使車輛在排放測試期間可產生合格的結果。但是在一般使用時,減效裝置的效率可能會變差,導致NOx排放量增加到容許水準以上。

戴姆勒步入福斯汽車的作弊醜聞後塵

繼福斯汽車的測試作弊醜聞之後,聯邦和州政府在密西根州安娜堡國家車輛和燃油排放實驗室和加州埃爾蒙特CARB測試實驗室發現了戴姆勒汽車中的減效裝置。

2017年4月,美國聯邦法官判福斯汽車公司因操弄柴油動力汽車,欺騙政府的排放測試,必須賠償28億美元。截至2020年6月1日,這起醜聞共使福斯汽車繳出333億美元的罰金、罰款、財務和解和回購成本。

依照和解協議,戴姆勒必須實施召回和維修計畫,幫消費者免費清除受影響車輛中的減效裝置,並使車輛符合《乾淨空氣法》規定的排放標準。

為避免受到嚴厲的處罰,戴姆勒必須在兩年內修理好至少85%的受影響小客車,三年內至少85%的廂型車。

此外,戴姆勒還必須用污染更低的新發動機替換掉15台發動機,以抵消其車輛排放的過量氮氧化物。

Daimler to Pay $1.5 Billion for Fake Emissions Tests WASHINGTON, DC, September 15, 2020 (ENS)

The U.S. and California governments have proposed a settlement with German automaker Daimler AG and its American subsidiary Mercedes-Benz USA that would resolve alleged violations of the Clean Air Act and California law associated with diesel emissions cheating in about 250,000 cars and vans.

The proposed settlement with the U.S. Environmental Protection Agency (EPA), the U.S. Department of Justice, and the California Air Resources Board (CARB) was lodged on September 14 in Washington, DC with the U.S. District Court for the District of Columbia. It requires Daimler to recall and repair the emissions systems in Mercedes-Benz diesel vehicles sold in the United States between 2009 and 2016.

The settlement covers approximately 250,000 light- and medium-duty diesel vehicles; these are passenger cars and Sprinter vans from model years 2009-2016.

Daimler and Mercedes-Benz must pay $875 million in civil penalties and roughly $70.3 million in other penalties. The civil penalty of $875 million is the second-largest civil penalty in the history of the Clean Air Act.

The company will also extend the warranty period for certain parts in the repaired vehicles, perform projects to mitigate excess ozone-creating nitrogen oxides (NOx) emitted from the vehicles, and implement new internal audit procedures designed to prevent future emissions cheating.

NOx emissions from vehicles play a key role in ground-level ozone production and negatively impact human health, the EPA said. Breathing ozone can damage lung tissue, worsen heart disease and lung conditions like asthma, emphysema, and bronchitis.

The recall program and federal mitigation project are expected to cost Daimler about $436 million. The company will pay another $110 million to fund mitigation projects in California. Altogether, the settlement is valued at about $1.5 billion (€1.27 billion).

“The message we are sending today is clear. We will enforce the law. We will protect the environment and public health. And if you try to cheat the system and mislead the public, you will be caught,” said U.S. EPA Administrator Andrew Wheeler. “Those that violate public trust in pursuit of profits will forfeit both.”

Daimler denies the authorities’ allegations as well as the class action plaintiffs’ claims and does not admit any liability to the United States, California, plaintiffs, or otherwise.

The settlement resolves the company’s pending civil proceedings with the U.S. authorities without reaching any determinations as to whether functionalities in Daimler’s vehicles are defeat devices. By concluding the proceedings, Daimler said in a statement, the company “avoids lengthy court actions with respective legal and financial risks.”

Vehicle manufacturers are required by the Clean Air Act and federal regulations to apply for and receive a certificate of conformity from EPA before selling a new model year vehicle in the United States. Manufacturers must demonstrate that a vehicle meets emissions standards and disclose to EPA all auxiliary emission control devices (AECDs) and any defeat devices installed in the vehicle.

This settlement addresses allegations made in separate civil complaints filed by the United States and CARB on September 14, 2020, that, from 2009 to 2016, Daimler manufactured, imported, and sold more than 250,000 diesel Sprinter vans and passenger cars with undisclosed AECDs and defeat devices programmed into the vehicles’ complex emissions control software.

The defeat devices cause vehicles to produce compliant results during emissions testing. But when not being tested, the emissions controls can perform less effectively, resulting in an increase in NOx emissions above compliant levels.

The federal and state agencies discovered the defeat devices in Daimler’s vehicles in the wake of the Volkswagen emissions cheating scandal through testing conducted at the National Vehicle and Fuel Emissions Laboratory in Ann Arbor, Michigan and at CARB’s testing laboratory in El Monte, California.

In April 2017, a U.S. federal judge ordered Volkswagen to pay a $2.8 billion criminal fine for “rigging diesel-powered vehicles to cheat on government emissions tests.” As of June 1, 2020, the scandal had cost VW $33.3 billion in fines, penalties, financial settlements and buyback costs.

The Daimler settlement requires the company to implement a recall and repair program to remove all defeat devices from the affected vehicles at no cost to consumers and bring the vehicles into compliance with emissions standards under the Clean Air Act.

CARB Chair Mary Nichols said, “Californians live with some of the worst air in the country, air that adversely impacts public health causing or contributing to asthma, respiratory disease, and premature death. It also costs the economy through medical costs as well as lost work and school days.”

“Automakers must learn that in this state,” said Nichols, “CARB will continue to use the very latest and most sophisticated science and technology to catch cheating and violations that impact our air and health.”

To avoid stiff penalties, Daimler must repair at least 85 percent of the affected passenger cars within two years and at least 85 percent of the vans within three years.

Daimler must also replace 15 old locomotive engines with new, less-polluting engines to offset the excess NOx emitted from its vehicles.

The proposed settlement is subject to a 30-day public comment period and court review and approval. Copies of the consent decree lodged with the court are online here.

※ 全文及圖片詳見:ENS

戴姆勒
賓士
柴油車
違法
氮氧化物
國際新聞
美國
污染治理

作者

姜唯

如果有一件事是重要的,如果能為孩子實現一個願望,那就是人類與大自然和諧共存。

林大利

於特有生物研究保育中心服務,小鳥和棲地是主要的研究對象。是龜毛的讀者,認為龜毛是探索世界的美德。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

德公布核廢最終處置選址標準 90個地區列入考慮

摘錄自2020年9月29日中央社報導

德國確定非核家園的目標後,核廢最終處置場的尋址就成了能源政策的焦點。德國政府今(28日)正式公布選址的範圍和標準,總計全國有90個地區列入考慮,預定在2031年前決定地點。

2011年日本發生福島核災,導致德國反核民意高漲,政府因此決定在2022年前關閉所有核電廠,並積極尋找存放高放射性核廢料的最終處置場。

2017年,德國立法成立最終處置場選址委員會,由學者、官員、工程師、律師、環保人士和民眾代表組成,根據不排除任何地點、透明和科學基礎等原則討論選址標準,目標是找到能安全存放高階核廢料100萬年的地點。

歷經40多場公聽會,德國政府今天正式公布選址的範圍,總計全國有90個地區列入考慮,約占國土面積的54%。至於選址標準,最終處置場應位於地下深層的黏土層、鹽層或花崗岩層,排除人口密集區以及有地震和火山活動、容易滲水或曾經採礦的地區。

能源轉型
國際新聞
德國
核廢料最終處置場

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化

※產品缺大量曝光嗎?你需要的是一流包裝設計!