台灣特斯拉正式成軍,維修業務職缺首先釋出

台灣過去是電動車製造商特斯拉(Tesla)關鍵零件的生產基地,但目前如Model S 仍要透過代理商引進台灣。近日傳來好消息,特斯拉向北市府登記「台灣特斯拉汽車有限公司」已核准設立,完成進軍台灣的第一步。

台灣曾是特斯拉關鍵零件如電動馬達、電控系統的生產基地,供應鏈集中於台中、林口一帶,全盛時期有將近25% 的零組件來自台灣。特斯拉推出第一款電動跑車Tesla Roadster,就已經搭載台灣供應商的零組件。

特斯拉早在 2006 年6 月26 日由經濟部中部辦公室核准設立台灣特斯拉汽車有限公司,負責電動車內部重要的機電整合系統,並與台灣供應鏈密切合作。但原公司在2010年解散並清算完結,今年向台北市政府遞交申請。

由經濟部商業司的全國商工行政服務入口網,已能查詢特斯拉向北市府登記的公開資料,公司名稱為「台灣特斯拉汽車有限公司」,核准設立日期是2016年3 月16 日,營業事業包括汽車批發業、汽車零售業、國際貿易業、汽車修理業、租賃業等項目。

不只如此,該公司也在104 人力銀行刊登徵才資訊,是由中國特斯拉團隊著手籌備,截稿前已有11 個工作機會,需求人數逾20 人,多為銷售、維修等相關職缺。上述皆能看出特斯拉開始佈局台灣電動車市場,期待不久的將來特斯拉正式在台營運,建置充電網並銷售旗下車款。

本文授權轉載自《》──〈〉

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

架構設計:”4+1″視圖

概念

“4+1”視圖,是指從5個不同視角來描述軟件體繫結構。
“4+1”分別指:

  1. 邏輯視圖
  2. 過程視圖
  3. 物理視圖
  4. 開發視圖
  5. 場景/用例 視圖

邏輯架構的描述可以圍繞前四個視圖進行組織,然後結合用例或場景進行說明,形成第五個視圖。

每個視圖只關心繫統的一個側面,5個視圖結合起來,才能反映系統的全部內容。

關於視圖

軟件設計可以從不同的概念角度進行描述和記錄,這些角度通常被稱為視圖。

“視圖表示軟件體繫結構的一部分,它显示軟件系統的特定屬性”

不同的視圖涉及與軟件相關的不同問題。

總之,軟件設計是由設計過程產生的多方面的產物,通常由相對獨立的正交視圖組成,可以結合建築視圖理解。

邏輯視圖

當使用面向對象的設計方法時,邏輯視圖對應設計的對象模型,常用描述方法有UML類圖、E-R圖。

邏輯架構主要支持功能需求,即系統應該為用戶提供什麼樣的服務。
系統被分解成一組關鍵抽象,以對象或對象類的形式從問題中表述。

類的設計遵循抽象、封裝和繼承的原則,這種分解不僅是為了進行功能分析,也是為了理清系統各個部分的通用機制和設計元素。

過程視圖

過程架構關注設計的併發和同步方面,考慮了一些非功能性需求,比如性能和可用性。
過程視圖可以在幾個抽象層次上進行描述,每個抽象層次處理不同的關注點:

  • 在最高層次上關注進程,進程分佈在由LAN或WAN連接的一組硬件資源上,作為一組獨立執行的通信程序邏輯網絡。
  • 多個邏輯網絡可以同時存在,共享相同的物理資源。

主要任務是通過一組定義良好的任務間通信機制進行通信:基於同步和異步消息的通信服務、遠程過程調用、事件廣播等。

次要任務是可以通過集合或共享內存進行通信,避免重大任務在同一過程或處理節點上進行配置假設。

物理視圖

物理視圖描述軟件到硬件的映射,主要反映在分佈式方面。

物理架構主要考慮系統的非功能性需求,如可用性、可靠性(容錯性)、性能(吞吐量)和可擴展性。

常見物理配置:

  • 測試
  • 為不同站點或不同客戶部署系統

開發視圖

開發視圖描述軟件在其開發環境中的靜態組織。

開發架構的重點:

  • 對軟件開發環境中實際軟件模塊進行組織
  • 將軟件打包成小的程序庫,或者打包成可以由一個或少量開發人員開發的子系統

系統的開發架構由模塊和子系統圖表示,表示成“導出”和“導入”關係。只有當軟件的所有元素都被識別之後,才能描述完整的開發架構。

在很大程度上,開發架構考慮發展的便利性、軟件管理、重用或通用性,以及工具集或編程語言施加的約束。

開發視圖是需求分配的基礎,便於開發團隊分配工作,有助於成本評估和提前計劃、監控項目進度、軟件重用、可移植性和安全性的推理。通過開發視圖,容易得出項目開發人員的分工配置。

實際應用中,開發視圖會在邏輯視圖的基礎上增加大量內容,比如大量接口、輔助類等。

場景/用例 視圖

架構的描述決策可以圍繞前四個視圖進行組織,然後由一些選定的用例或場景(成為第五個視圖)進行說明。

其他四個視圖中的元素,可以通過一些重要的場景或用例進行更好的展示,比如:

  • 構造更符合用例的實例
  • 描述一些關聯腳本,如對象之間或進程之間的交互

總結

並非所有的軟件架構都需要完整的“4+1”視圖。

無用的視圖可以從架構描述中省略,例如:

  • 如果只有一個處理器,則不需要物理視圖
  • 如果只有一個進程或程序,則不需要進程視圖
  • 對於非常小的系統,有可能邏輯視圖和開發視圖非常相似,不需要單獨描述

場景視圖在任何情況下都有用。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

MySQL InnoDB MVCC

MySQL 原理篇

MVCC

MVCC 的定義

MVCC(Multiversion concurrency control):多版本併發控制,併發訪問(讀或寫)數據庫時,對正在事務內處理的數據做多版本的管理。以達到用來避免寫操作的堵塞,從而引發讀操作的併發問題。

MVCC 邏輯流程

插入

MySQL 在每一行數據中都會默認添加一些隱藏列 DB_TRX_IDDB_ROLL_PT。

上面圖中的執行步驟如下:

  1. 手動開啟事務,從 InnoDB 引擎中獲取一個全局事務ID(1)
  2. 然後往 teacher 表中插入兩條數據,同時設置數據行的版本號為當前事務ID,刪除版本號為 NULL

思考:如果事務是自動提交的(SET AUTOCOMMIT = NO),且未手動開啟事務,執行如下兩條 SQL,插入的數據會是什麼樣子的?

INSERT INTO teacher (NAME, age) VALUE ('seven', 18) ;

INSERT INTO teacher (NAME, age) VALUE ('qingshan', 19) ;

因為事務是自動提交的,所以兩條插入語句會分別獲取事務ID,所以這裏插入的數據行的版本號是1和2。

刪除

上面圖中的執行步驟如下:

  1. 手動開啟事務,從 InnoDB 引擎中獲取一個全局事務ID(22)
  2. 然後執行一條刪除語句,InnoDB 會找到這條記錄,把它的刪除版本號設置為當前事務ID

修改

上面圖中的執行步驟如下:

  1. 手動開啟事務,從 InnoDB 引擎中獲取一個全局事務ID(33)
  2. 然後執行一條修改語句,InnoDB 會找到這條記錄,copy 一份原數據插入到表中,將新行數據的數據行的版本號的值設置為當前事務ID,將原行數據的刪除版本號的值設置為當前事務ID

查詢

上面圖中的執行步驟如下:

  1. 手動開啟事務,從 InnoDB 引擎中獲取一個全局事務ID(44)
  2. 根據數據查詢規則的描述
    1. 查找數據行版本早於當前事務版本的數據行,發現表中三行數據都滿足條件
    2. 查找刪除版本號要麼為 NULL,要麼大於當前事務版本號的記錄,發現只有最後一條數據滿足條件(1, seven, 19)

案例分析

數據準備:

CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

INSERT  INTO teacher(id,NAME,age) VALUES (1,'seven',18);
INSERT  INTO teacher(id,NAME,age) VALUES (2,'qingshan',20);

案例一

-- 事務A執行
BEGIN;                                     -- 1
SELECT * FROM teacher;                       -- 2
COMMIT;

--事務B執行
BEGIN;                                     -- 3
UPDATE teacher SET age =28 WHERE id=1;     -- 4
COMMIT;

案例一的執行步驟是:1,2,3,4,2,執行效果如下圖所示:

雖然在執行 3,4 步驟的時候更新 id=1 的數據,但是根據 MVCC 的查詢邏輯流程,再次執行2,獲取到的數據依然和第一次一樣。

案例二

-- 事務A執行
BEGIN;                                     -- 1
SELECT * FROM teacher;                       -- 2
COMMIT;

--事務B執行
BEGIN;                                     -- 3
UPDATE teacher SET age =28 WHERE id=1;     -- 4
COMMIT;

案例二的執行步驟是:3,4,1,2,執行效果如下圖所示:

根據 MVCC 的查詢邏輯流程,執行1,2,獲取到的數據是事務B未提交的數據,這個是有問題的。

分析了案例一和案例二,發現 MVCC 不能解決案例二的問題,InnoDB 會使用 Undo log 解決案例二的問題。

Undo Log

Undo Log 的定義

Undo:意為取消,以撤銷操作為目的,返回指定某個狀態的操作。

Undo Log:數據庫事務提交之前,會將事務修改數據的鏡像(即修改前的舊版本)存放到 undo 日誌里,當事務回滾時,或者數據庫奔潰時,可以利用 undo 日誌,即舊版本數據,撤銷未提交事務對數據庫產生的影響。。

  • 對於 insert 操作,undo 日誌記錄新數據的 PK(ROW_ID),回滾時直接刪除;
  • 對於 delete/update 操作,undo 日誌記錄舊數據 row,回滾時直接恢復;
  • 他們分別存放在不同的buffer里。

Undo Log 是為了實現事務的原子性而出現的產物。

 

Undo Log 實現事務原子性:事務處理過程中,如果出現了錯誤或者用戶執行了 ROLLBACK 語句,MySQL 可以利用 Undo Log 中的備份將數據恢復到事務開始之前的狀態。

InnoDB 發現可以基於 Undo Log 來實現多版本併發控制。

Undo Log 在 MySQL InnoDB 存儲引擎中用來實現多版本併發控制。

 

Undo Log 實現多版本併發控制:事務未提交之前,Undo Log 保存了未提交之前的版本數據,Undo Log 中的數據可作為數據舊版本快照供其他併發事務進行快照讀。

分析下圖中 SQL 的執行過程。

  • 事務A手動開啟事務,執行更新操作,首先會把更新命中的數據拷貝到 Undo Buffer 中
  • 事務B手動開啟事務,執行查詢操作,會讀取 Undo Log 中數據返回,進行快照度

當前讀和快照讀

快照讀

SQL 讀取的數據是快照版本,也就是歷史版本,普通的 SELECT 就是快照讀。

InnoDB 快照讀,數據的讀取將由 cache(原本數據)+ Undo Log(事務修改過的數據)兩部分組成。

當前讀

SQL 讀取的數據是最新版本,通過鎖機制來保證讀取的數據無法通過其他事務進行修改。

UPDATE 、DELETE 、INSERT 、SELECT … LOCK IN SHARE MODE 、SELECT … FOR UPDATE 都是當前讀,這些操作在《MySQL InnoDB 鎖》這篇文章中有過演示,事務A執行這些 SQL,會阻塞事務B的 SQL 執行。

在 InnoDB 引擎裏面,快照讀通過 MVCC 解決幻讀的問題,當前讀通過 Next-Key Locks 解決幻讀的問題。

Redo Log

Redo Log 的定義

Redo:顧名思義就是重做。以恢復操作為目的,重現操作。

Redo Log:指事務中操作的任何數據,將最新的數據備份到一個地方(Redo Log)。

Redo Log 的持久化:不是隨着事務的提交才寫入的,而是在事務的執行過程中,便開始寫入 Redo Log 中,具體的落盤策略可以進行配置。

Redo Log 是為了實現事務的持久性而出現的產物。

Redo Log 實現事務持久性:防止在發生故障的時間點,尚有臟頁未寫入表的 IBD 文件中,在重啟 MySQL 服務的時候,根據 Redo Log 進行重做,從而達到事務的未入磁盤數據進行持久化這一特性。

根據下圖分析 Redo Log 的執行流程

InnoDB 不是每一次提交事務都把數據從緩存區持久化到硬盤的,因為每次提交事務都把數據持久化到硬盤,效率很低,每一次持久化都需要執行 IO 操作。

InnoDB 會把每次數據變化會先進入 Redo Buffer 中,事務提交了,會根據策略把新的數據寫入 Redo Log 中,InnoDB 就會認為這次事務提交成功了,數據並不一定馬上就進入表的 IBD 文件中。

疑問:持久化到 Redo Log 中和持久化到表的 IBD 文件一樣都是 IO 操作,為什麼要設計 Redo Log 呢?

其實是因為持久化到 Redo Log 中是順序 IO 的操作,而持久化到表的 IBD 文件中是一個隨機 IO 的操作,比如我們需要更新 id=1 和 id=8 的數據,如果是 Redo Log,就只需要把更新的數據順序存入 Redo Log 中;但如果是表的 IBD 文件,就需要先找到 id=1 和 id=8 的兩個不連續的磁盤文件地址,再做持久化操作,影響數據庫服務的併發性能。

Redo Log 的持久化配置

指定 Redo Log 記錄在 {datadir}/ib_logfile1 和 ib_logfile2 兩個文件中,可以通過 innodb_log_group_home_dir配置指定目錄存儲。

一旦事務成功提交且數據持久化到表的 IBD 文件中之後,此時 Redo Log 中的對應事務數據記錄就失去了意義,所 以 Redo Log 的寫入是日誌文件循環寫入的過程,也就是覆蓋寫的過程。

  • 指定 Redo Log 日誌文件組中的數量 innodb_log_files_in_group 默認為2
  • 指定 Redo Log 每一個日誌文件最大存儲量 innodb_log_file_size 默認48M
  • 指定 Redo Log 在 cache/buffer 中的 buffer 池大小 innodb_log_buffer_size 默認16M

Redo Buffer 持久化到 Redo Log 的策略,通過設置 Innodb_flush_log_at_trx_commit 的值:

  • 取值0:每秒提交 Redo buffer -> Redo Log OS cache -> flush cache to disk,可能丟失一秒內的事務數據。
  • 取值1(默認值):每次事務提交執行 Redo Buffer -> Redo Log OS cache -> flush cache to disk,最安全,性能最差的方式
  • 取值2:每次事務提交執行 Redo Buffer -> Redo log OS cache 再每一秒執行 -> flush cache to disk 操作

一般建議選擇取值2,因為 MySQL 掛了最多損失一次事務提交的數據,整個服務期掛了才會損失一秒的事務提交數據。

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

台廠商農作廢棄物製吸管 紐約參展進軍美東

摘錄自2020年03月14日世界新聞網全國報導

全球環保意識興起,紐約市也於本月開始禁用免費塑膠袋,來自台灣的鉅田潔淨技術公司以農作廢棄物,包括甘蔗渣、咖啡渣、竹子粉等材料,製成不含聚乳酸(PLA)的甘蔗吸管,以廢棄物循環再利用的環保概念,於過去幾年成功推廣至美西,如今希望藉由到紐約參加專業展覽,讓產品進軍美東地區。

據統計,全世界每年使用3700億支一次性塑膠吸管,今年首次至紐約參展的鉅田潔淨技術公司,推出的甘蔗吸管則是以循環再生經濟理念邁,以可再生材料作為原料製造,並訴求吸管能夠自然分解,確保地球有限的資源能以循環再生、永續方式被使用,形成一個友善的經濟及產業系統。

該公司業務經理楊量祺說,以目前美國市場,加州對於可分解吸管的接受度較高,紐約目前則是有部分店家開始使用環保吸管,普及度仍較低;甘蔗吸管雖然成本是一般塑膠吸管的六倍,但基於大眾環保意識抬頭,展覽期間仍有不低的詢問度。

公害污染
廢棄物
國際新聞
紐約
塑膠袋
吸管

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

鮪魚業刺網混獲最大苦主 研究:印度洋海豚數量減少近90%

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

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

三菱電機將自己的導彈技術用在無人駕駛汽車上

日本三菱電機準備將自己的武器技術用在無人駕駛汽車上,可以利用的元件包括雷達、聲納發射機、感測器和攝像頭,這些組件是導彈所必需的。需要注意的是三菱電機並不是汽車製造商三菱。

三菱電機工程師Katsumi Adachi在接受採訪時透露說,公司希望將技術用在汽車中,這些汽車2020年就會上路。

2017年4月,三菱電機就會開始生產車道保持、自動刹車系統元件。在隨後的一個財年裡,公司將會開始生產自動刹車系統。三菱電機為日本空軍提供空對空導彈,它希望用軍事技術幫助無人駕駛汽車偵測障礙物、避免碰撞。據Katsumi Adachi透露,已經有企業向三菱電機定購自動刹車系統和車道保持元件。他還說,三菱電機掌握了高精度感測器、電動助力轉向系統相關技術,明年公司就可以提供更先進的系統了。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

CSS複合選擇器是什麼?複合選擇器是如何工作

複合選擇器介紹

  • 複合選擇器其實很好理解,說白了就跟我們生活中的有血緣關係家庭成員一樣,通過標籤或者class屬性或id屬性,去找對應的有血緣關係的某個選擇器,具體的大家往下看哦。
  • 如果是初學者對基本的選擇器不是很了解的可以看筆者之前寫過的基本選擇器文章,,在這就不過多的介紹基本選擇器的使用了。

複合選擇器說明表

選擇器 描述 舉例
選擇器1 選擇器2{屬性:值;} 多元素選擇器。同時匹配選擇器1和選擇器2,多個選擇器之間用逗號隔開即可。 h1,h2,h3{color: red;}
E F {屬性:值;} 後代元素選擇器,匹配所有屬於E元素後代的F元素,E和F之間用空格隔開即可。 .box h1{color: red;}
E>F{屬性:值;} 子元素選擇器,匹配所有E元素的子元素為F div >h1{color:red;}
E+F{屬性:值;} 相鄰元素選擇器,匹配所有緊跟隨着E元素之後的同級元素F div+div{color:red;}

多元素選擇器

  • 多元素選擇器在工作當中經常會用到,主要用於設置多個元素使用同一種CSS樣式。
  • 讓我們進入多元素選擇器實踐,實踐內容如:將HTML頁面中的div標籤、h1標籤、p標籤、中的文本顏色設置為紅色。
  • 代碼塊

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>多元素選擇器</title>
</head>
    <style>
        div,h1,p{
           color: red;
        }
    </style>
<body>
    <div>成功不是打敗別人,而是改變自己。</div>
    <h1>成功不是打敗別人,而是改變自己。</h1>
    <p>成功不是打敗別人,而是改變自己。</p>
</body>

</html>
  • 結果圖

  • 注意:作用給列表中的所有的選擇器設置樣式,class類選擇器或id選擇器也是一樣,在這裏就拿class類選擇器屬性值為.box為例,其餘的大家可以自己嘗試。

  • 代碼塊

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>多元素選擇器</title>
</head>
    <style>
        .box,h1,p{
           color: red;
        }
    </style>
<body>
    <div class="box" >成功不是打敗別人,而是改變自己。</div>
    <h1>成功不是打敗別人,而是改變自己。</h1>
    <p>成功不是打敗別人,而是改變自己。</p>
</body>

</html>
  • 結果圖

後代元素選擇器

  • 讓我們進入後代元素選擇器實踐,實踐內容如:將class屬性值為.box的後代元素文本顏色設置為紅色,給大家介紹下結構:class屬性值為.box中一共有三個子元素,第一個h1標籤、第二個h1標籤、第三個div標籤、但是第三個子元素為div標籤裏面還有一個子元素為h1標籤或者我們可以理解為class屬性值為.box的孫子輩元素。
  • 代碼塊

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>後代元素選擇器</title>
</head>
    <style>
        .box h1{
           color: red;
        }
    </style>
<body>
    <div class="box" >
        <h1>成功不是打敗別人,而是改變自己。</h1>
        <h1>微笑是最初的信仰</h1>
        <div>
            <h1>成功不是打敗別人,而是改變自己。</h1>
        </div>
    </div>
    
</body>

</html>
  • 結果圖

  • 注意:後代選擇器只能包含在class屬性值為.box裏面的所有屬性。

子元素選擇器

  • 讓我們進入子元素選擇器實踐,實踐內容如:將class屬性值為.box的子元素文本顏色設置為紅色,給大家介紹下結構:class屬性值為.box中一共有三個子元素,第一個h1標籤、第二個h1標籤、div標籤、但是第三個子元素為div標籤裏面還有一個子元素為h1標籤或者我們可以理解為class屬性值為.box的孫子輩元素。

  • 代碼塊

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>子元素選擇器</title>
</head>
    <style>
        .box > h1{
           color: red;
        }
    </style>
<body>
    <div class="box" >
        <h1>成功不是打敗別人,而是改變自己。</h1>
        <h1>微笑是最初的信仰</h1>
        <div>
            <h1>成功不是打敗別人,而是改變自己。</h1>
        </div>
    </div>

</body>

</html>
  • 結果圖

  • 注意:子元素選擇器和後代元素選擇器是不樣的,子元素選擇器是將class屬性值為.box中的子元素設置CSS樣式,後代元素選擇器是將class屬性值為.box中的所有元素設置CSS樣式,現在大家應該明白了,為什麼div標籤中的h1標籤文本顏色沒有被渲染的原因了吧,因為div標籤中的h1標籤是孫子輩。

相鄰元素選擇器

  • 相鄰元素選擇器必須滿足以下條件才會匹配。
  • E元素與F元素必須是兄弟關係,意思就是平輩關係。
  • E元素與F元素必須要緊挨着,就是之間不能有任何元素阻擋。
  • 要求F元素一定是在E元素的下面。
  • 讓我們進入相鄰元素選擇器實踐,實踐內容如:將HTML頁面中的class屬性值為.box的相鄰元素文本顏色設置為紅色。
  • 代碼塊

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>相鄰元素選擇器</title>
</head>
    <style>
        .box + h1{
           color: red;
        }
    </style>
<body>
    <h1>我在上面學習</h1>
    <div class="box" >
        <h1>成功不是打敗別人,而是改變自己。</h1>
    </div>
    <h1>我在下面學習</h1>
</body>
</html>
  • 結果圖

  • 注意:大家一定要注意以上的2個必須和1個一定的規則,否則CSS樣式不會被渲染。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

併發編程-深入淺出AQS

AQS是併發編程中非常重要的概念,它是juc包下的許多併發工具類,如CountdownLatch,CyclicBarrier,Semaphore 和鎖, 如ReentrantLock, ReaderWriterLock的實現基礎,提供了一個基於int狀態碼和隊列來實現的併發框架。本文將對AQS框架的幾個重要組成進行簡要介紹,讀完本文你將get到以下幾個點:

  1. AQS進行併發控制的機制是什麼

  2. AQS獨佔和共享模式是如何實現的

  3. 同步隊列和條件等待隊列的區別,和數據出入隊原則

一,AQS基本概念

AQS(AbstractQueuedSynchronizer)是用來構建鎖或者其他同步組件的基礎框架,它使用了一個int成員變量來表示狀態,通過內置的FIFO(first in,first out)隊列來完成資源獲取線程的排隊工作。

隊列可分為兩種,一種是同步隊列,是程序執行入口出處的等待隊列;而另一種則是條件等待隊列,隊列中的元素是在程序執行時在某個條件上發生等待。

1.1 獨佔or共享模式

AQS支持兩種獲取同步狀態的模式既獨佔式和共享式。顧名思義,獨佔式模式同一時刻只允許一個線程獲取同步狀態,而共享模式則允許多個線程同時獲取。

1.2 同步隊列

當一個線程嘗試獲取同步狀態失敗時,同步器會將這個線程以及等待狀態等信息構造成一個節點加入到等待隊列中,同時會阻塞當前線程,當同步狀態釋放時,會把首節點中的線程喚醒,使其再次嘗試重複獲取同步隊列。

1.3 條件隊列

AQS內部類ConditionObject來實現的條件隊列,當一個線程獲取到同步狀態,但是卻通過Condition調用了await相關的方法時,會將該線程封裝成Node節點並加入到條件隊列中,它的結構和同步隊列相同。

二,獨佔or共享模式

AQS框架中,通過維護一個int類型的狀態,來進行併發控制,線程通常通過修改此狀態信息來表明當前線程持有此同步狀態。AQS則是通過保存修改狀態線程的引用來實現獨佔和共享模式的。

/**
 * 獲取同步狀態
 */
public final void acquire(int arg) {
    //嘗試獲取同步狀態, 如果嘗試獲取到同步狀態失敗,則加入到同步隊列中
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}
/**
 * 嘗試獲取同步狀態【子類中實現】,因為aqs基於模板模式,僅提供基於狀態和同步隊列的實 
 * 現思路,具體的實現由子類決定
 */
protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        // 如果當前狀態值為0,並且等待隊列中沒有元素,執行修改狀態值操作
        if (!hasQueuedPredecessors() &&
            compareAndSetState(0, acquires)) {
            // 修改狀態值成功,記錄當前持有同步狀態的線程信息
            setExclusiveOwnerThread(current);
            return true;
        }
        // 如果當前線程已經持有同步狀態,繼續修改同步狀態【重入鎖實現原理】
    } else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

/**
 * 根據傳入的模式以及當前線程信息創建一個隊列的節點並加入到同步隊列尾部
 */
private Node addWaiter(Node mode) {
    Node node = new Node(Thread.currentThread(), mode);
    // Try the fast path of enq; backup to full enq on failure
    Node pred = tail;
    if (pred != null) {
        node.prev = pred;
        if (compareAndSetTail(pred, node)) {
            pred.next = node;
            return node;
        }
    }
    enq(node);
    return node;
}
/**
 * 同步隊列中節點,嘗試獲取同步狀態
 */
final boolean acquireQueued(final Node node, int arg) {
    boolean failed = true;
    try {
        boolean interrupted = false;
        // 自旋(死循環)
        for (;;) {
            // 只有當前節點的前驅節點是頭節點時才會嘗試執行獲取同步狀態操作
            final Node p = node.predecessor();
            if (p == head && tryAcquire(arg)) {
                setHead(node);
                p.next = null; // help GC
                failed = false;
                return interrupted;
            }
            if (shouldParkAfterFailedAcquire(p, node) &&
                parkAndCheckInterrupt())
                interrupted = true;
        }
    } finally {
        if (failed)
            cancelAcquire(node);
    }
}

獨佔式是如何控製得?

當修改狀態信息成功后,如果執行的是獨佔式操作,AQS的具體實現類中會保存當前線程的信息來聲明同步狀態已被當前線程佔用,此時其他線程再嘗試獲取同步狀態會返回false。

三,同步隊列

3.1 隊列中保存那些信息?

同步隊列節點中主要保存着線程的信息以及模式(共享or獨佔)。

3.2 何時執行入隊操作?

/**
 * 獲取同步狀態
 */
public final void acquire(int arg) {
    //嘗試獲取同步狀態, 如果嘗試獲取到同步狀態失敗,則加入到同步隊列中
    if (!tryAcquire(arg) &&
        acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
        selfInterrupt();
}

復用上文中的代碼,不難看出再獲取同步狀態失敗后,會執行入隊操作。

3.3 何時執行出隊操作?

當線程獲取同步狀態失敗時,會被封裝成Node節點加入到等待隊列中,此時所有節點都回進入自旋過程,首先判斷自己prev是否時頭節點,如果是則嘗試獲取同步狀態。
被阻塞線程的喚醒主要以靠前驅節點的出隊或阻塞線程被中斷來實現。

/**
 * 同步隊列中節點,嘗試獲取同步狀態
 * 
 * 1. 當一個線程獲取到同步狀態時,會將當前線程構造程Node並設置為頭節點
 * 2. 並將原始的head節點設置為null,以便於垃圾回收
 */
final boolean acquireQueued(final Node node, int arg) {
    boolean failed = true;
    try {
        boolean interrupted = false;
        for (;;) {
            final Node p = node.predecessor();
            if (p == head && tryAcquire(arg)) {
                setHead(node);
                p.next = null; // help GC
                failed = false;
                return interrupted;
            }
            if (shouldParkAfterFailedAcquire(p, node) &&
                parkAndCheckInterrupt())
                interrupted = true;
        }
    } finally {
        if (failed)
            cancelAcquire(node);
    }
}

四,條件等待隊列

條件變量(ConidtionObject)是AQS中的一個內部類,用來實現同步隊列機制。同步隊列復用了等待隊列中Node節點,所以同步隊列到等待隊列中不需要進行額外的轉換。

4.1 什麼時候執行入隊操作?

當線程獲取到同步狀態,但是在臨界區中調用了await()方法,此時該線程會被加入到對應的條件隊列匯總。
ps: 臨界區,加鎖和釋放鎖之間的代碼區域

/**
 * ConditionObject中的await方法,調用后使得當前執行線程加入條件等待隊列
 */
public final void await() throws InterruptedException {
    if (Thread.interrupted())
        throw new InterruptedException();
    Node node = addConditionWaiter();
    // -----省略代碼------
}
/**
 * 添加等待線程
 */
private Node addConditionWaiter() {
    Node t = lastWaiter;
    // -----省略代碼------
    // 將當前線程構造程條件隊列節點,並加入到隊列中
    Node node = new Node(Thread.currentThread(), Node.CONDITION);
    if (t == null)
        firstWaiter = node;
    else
        t.nextWaiter = node;
    lastWaiter = node;
    return node;
}

4.2 什麼時候執行出隊操作?

當對應的Conditioni調用signial/signalAll()方法時回選擇從條件隊列中出隊列,同步隊列是通過自旋的方式獲取同步狀態,而條件隊列中的節點則通過通知的方式出隊。條件隊列中的節點被喚醒後會加入到入口等待隊列中。

/**
 * 喚醒當前條件等到隊列中的所有等待線程
 */
public final void signalAll() {
    if (!isHeldExclusively())
        throw new IllegalMonitorStateException();
    Node first = firstWaiter;
    if (first != null)
        doSignalAll(first);
}
/**
 * 遍歷隊列,將元素從條件隊列 加入到 同步隊列
 */
private void doSignalAll(Node first) {
    lastWaiter = firstWaiter = null;
    do {
        Node next = first.nextWaiter;
        first.nextWaiter = null;
        transferForSignal(first);
        first = next;
    } while (first != null);
}
final boolean transferForSignal(Node node) {
    // -----省略代碼------
    // 執行入隊操作,將node添加到同步隊列中
    Node p = enq(node);
    int ws = p.waitStatus;
    if (ws > 0 || !compareAndSetWaitStatus(p, ws, Node.SIGNAL))
        LockSupport.unpark(node.thread);
    return true;
}

五,總結

  1. 使用Node實現的FIFO隊列,可以用於構建鎖或者其他同步裝置的基礎框架
  2. 利用一個int類型的屬性表示狀態
  3. 使用模板方法模式,子類可以通過繼承它來管理狀態實現各種併發工具
  4. 可以同時實現獨佔和共享模式

本文對AQS的基本原理進行的簡要的描述,對於子類的公平性和非公平行實現,中斷,隊列中節點的等待狀態,cas等操作沒有進行探討,感興趣的小夥伴可以進行源碼閱讀或者查閱相關資料。

六,Q&A

Question1: 在java中通常使用synchronized來實現方法同步,AQS中通過CAS保證了修改同步狀態的一致性問題,那麼對比synchronized,cas有什麼優勢不同與優勢呢?你還知道其他無鎖併發的策略嗎?

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

避之唯恐不及 仍有泰人採集蝙蝠糞便維生

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

蝙蝠被認為極可能是新型冠狀病毒的宿主。不過在泰國卻有一群人,甘願冒著染病的風險進到蝙蝠的洞穴,採取大量蝙蝠糞便;原來蝙蝠的糞便不但可以當肥料販賣,而且利潤也高,泰國村莊有好幾個世代都以此維生。

由於洞穴裡的蝙蝠數量極多,靠著帽子上的燈光,村民只要進入蝙蝠洞約三小時,就能蒐集到大約500桶蝙蝠糞便,能賣得約7萬多台幣。蝙蝠糞便含有豐富的氮、磷酸鹽和鉀,被當成高營養價值的肥料販賣。有公司專門收購,透過網路在亞馬遜跟阿里巴巴都買得到。

蝙蝠在叻丕府備受重視,除了肥料的經濟效益外,透過蝙蝠捕食破壞水稻和其他作物的昆蟲,在授粉和控制蟲害方面也發揮作用,蝙蝠洞也列為動物保護區。不過這些村民在進入蝙蝠洞時並沒有專業保護,只穿了長袖長褲,避免和蝙蝠接觸。雖然撿拾的是乾燥的蝙蝠糞便,傳播病毒的機率較低,但有學者提出警告,理論上任何跟蝙蝠有關的東西都可能使人暴露在潛在病毒中。萬一在收集蝙蝠糞便的過程中,接觸到新鮮的蝙蝠唾液或尿液,都很有可能染上病毒。

生態保育
國際新聞
泰國
蝙蝠
糞便
武漢肺炎

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

【其他文章推薦】

台北網頁設計公司這麼多,該如何挑選?? 網頁設計報價省錢懶人包”嚨底家”

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

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

小三通海運與一般國際貿易有何不同?

小三通快遞通關作業有哪些?

日本男童「免農藥除草大作戰」 農夫大讚:非常有效

摘錄自2020年3月24日中時報導

一名日本網友在推特表示,她在家中庭院內種植秋葵,但只要一到夏季,雜草就會生長得特別快,而她就讀小學的兒子看到這種情況,便主動說要以「除草」為主題,當作暑假作業來做研究,而且要「不使用農藥」。

兒子在三年間嘗試過多種方法,都無法完全清除雜草。某一天他突然靈機一動,發現土壤的軟硬度是導致雜草生長的關鍵,於是他決定每天在土壤上跑步。從今年的1月5日起到3月1日,不論晴雨,他每天都在土壤上奔跑,每次跑30分鐘,沒想到短短2個月後,雜草就不再生長了。

也有農民認同此方法「身為一名農民,這是非常有效的除草方法,可在雜草種子發芽時挪動土壤,在雜草生根前徹底將其消滅。」

環境經濟
農林漁牧業
國際新聞
日本
除草

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

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!