JAVA多線程·并發(fā)問(wèn)題及解決思路

一吩跋、概述

1. 線程

線程允許在同一個(gè)進(jìn)程中存在多個(gè)程序控制流叙凡。線程可以共享進(jìn)程的資源厌蔽,但是每個(gè)線程都有自己的程序計(jì)數(shù)器、棧和局部變量表抢腐。同一進(jìn)程中的不同線程能夠訪問(wèn)相同的變量姑曙,并且在同一個(gè)堆上分配對(duì)象。

2. 多線程

多線程的優(yōu)勢(shì)/作用

  • 提高程序的運(yùn)行性能迈倍。
  • 充分利用系統(tǒng)的處理能力伤靠,提高系統(tǒng)的資源利用率。
  • 提高系統(tǒng)響應(yīng)性啼染,即線程可以在運(yùn)行現(xiàn)有任務(wù)的情況下立即開始處理新的任務(wù)宴合。

多線程通信

多線程之間需要進(jìn)行通信,線程的通信依賴共享內(nèi)存和線程方法的調(diào)用來(lái)實(shí)現(xiàn)迹鹅。Java內(nèi)存模型分為主內(nèi)存和工作內(nèi)存卦洽,通過(guò)內(nèi)存之間的數(shù)據(jù)交換實(shí)現(xiàn)線程之間的通信;主動(dòng)調(diào)用線程的wait()斜棚、notify()方法也可以實(shí)現(xiàn)線程之間的通信阀蒂。

多線程引發(fā)的問(wèn)題

多線程并發(fā)執(zhí)行可能會(huì)導(dǎo)致一些問(wèn)題:

安全性問(wèn)題:在單線程系統(tǒng)上正常運(yùn)行的代碼,在多線程環(huán)境中可能會(huì)出現(xiàn)意料之外的結(jié)果弟蚀。

活躍性問(wèn)題:不正確的加鎖脂新、解鎖方式可能會(huì)導(dǎo)致死鎖or活鎖問(wèn)題。

性能問(wèn)題:多線程并發(fā)即多個(gè)線程切換運(yùn)行粗梭,線程切換會(huì)有一定的消耗并且不正確的加鎖争便。

名詞概念:

  • 安全性:即正確性,指“程序得到正確的結(jié)果”断医。
  • 活躍性:指”正確的是最終會(huì)發(fā)生“滞乙。
  • 性能:即程序的服務(wù)時(shí)間、延遲時(shí)間(響應(yīng)速度)鉴嗤、吞吐率斩启、可伸縮性、容量醉锅、效率等兔簇。

多線程問(wèn)題的深層原因

  1. 分時(shí)調(diào)度模型
  1. JAVA內(nèi)存模型
  2. 指令重排

二、并發(fā)問(wèn)題(安全性問(wèn)題)

核心

要編寫線程安全的代碼,核心在于對(duì)狀態(tài)訪問(wèn)操作進(jìn)行管理垄琐。特別是對(duì)共享的和可變的狀態(tài)的訪問(wèn)边酒。

解決思路

當(dāng)發(fā)生安全性問(wèn)題時(shí)。有三種解決問(wèn)題的角度:

  • 不在線程之間共享變量
  • 將狀態(tài)變量修改為不可變
  • 訪問(wèn)狀態(tài)變量時(shí)使用同步機(jī)制狸窘。

前兩種方式從根本上避免了多線程并發(fā)問(wèn)題的原因:對(duì)共享和可變狀態(tài)的訪問(wèn)墩朦。

1. 不在線程之間共享變量

即限制變量只能在單個(gè)線程中訪問(wèn)。

實(shí)現(xiàn)方式:

  1. 線程封閉

    保證變量只能被一個(gè)線程可以訪問(wèn)到翻擒∶セ粒可以通過(guò)Executors.newSingleThreadExecutor()實(shí)現(xiàn)。

  2. 棧封閉

    棧封閉即使用局部變量陋气。局部變量只會(huì)存在于本地方法棧中劳吠,不能被其他線程訪問(wèn),因此也就不會(huì)出現(xiàn)并發(fā)問(wèn)題巩趁。所以如果可以使用局部變量就優(yōu)先使用局部變量赴背。

  3. ThreadLocal封閉

    ThreadLocal是Java提供的實(shí)現(xiàn)線程封閉的一種方式,ThreadLocal內(nèi)部維護(hù)了一個(gè)Map晶渠,Map的key是各個(gè)線程凰荚,而Map的值就是要封閉的對(duì)象。每個(gè)線程中的對(duì)象都對(duì)應(yīng)著Map中一個(gè)值褒脯,也就是ThreadLocal利用Map實(shí)現(xiàn)了對(duì)象的線程封閉便瑟。

2. 將狀態(tài)變量修改為不可變

即使用不可變對(duì)象。

不可變對(duì)象:當(dāng)一個(gè)對(duì)象構(gòu)造完成后番川,其狀態(tài)就不再變化到涂,我們稱這樣的對(duì)象為不可變對(duì)象(Immutable Object),這些對(duì)象關(guān)聯(lián)的類為不可變類(Immutable Class)颁督。

比如Java中的String践啄、Integer、Double沉御、Long等所有原生類型的包裝器類型屿讽,都是不可變的。

大多數(shù)時(shí)候吠裆,線程間是通過(guò)使用共享資源實(shí)現(xiàn)通信的伐谈。如果該共享資源誕生之后就完全不再變更(猶如一個(gè)常量),多線程間共同并發(fā)讀取該共享資源是不會(huì)產(chǎn)生線程沖突的试疙,因?yàn)樗芯€程無(wú)論何時(shí)讀取該共享資源诵棵,總是能獲取到一致的、完整的資源狀態(tài)祝旷,這樣也能規(guī)避多線程沖突履澳。不可變對(duì)象就是這樣一種誕生之后就完全不再變更的對(duì)象嘶窄,該類對(duì)象天生支持在多線程間共享。

3. 使用同步機(jī)制

關(guān)注一個(gè)并發(fā)問(wèn)題距贷,有3個(gè)基本的關(guān)注點(diǎn):

  • 原子性柄冲,即一個(gè)操作或者多個(gè)操作 要么全部執(zhí)行并且執(zhí)行的過(guò)程不會(huì)被任何因素打斷,要么就都不執(zhí)行储耐。
  • 可見性,當(dāng)多個(gè)線程訪問(wèn)同一個(gè)變量時(shí)滨溉,一個(gè)線程修改了這個(gè)變量的值什湘,其他線程能夠立即看得到修改的值。
  • 有序性晦攒,有序性指的是數(shù)據(jù)不相關(guān)的變量在并發(fā)的情況下闽撤,實(shí)際執(zhí)行的結(jié)果和單線程的執(zhí)行結(jié)果是一樣的,不會(huì)因?yàn)橹嘏判虻膯?wèn)題導(dǎo)致結(jié)果不可預(yù)知脯颜。

所有的并發(fā)問(wèn)題的都可以從這三個(gè)點(diǎn)進(jìn)行分析并針對(duì)性的進(jìn)行解決哟旗。

a. 可見性問(wèn)題

概念:

可見性指的是一個(gè)線程對(duì)變量的寫操作對(duì)其他線程后續(xù)的讀操作可見

問(wèn)題分析:

由于Java的內(nèi)存模型栋操,內(nèi)存分為主內(nèi)存和線程內(nèi)存闸餐,線程讀寫變量時(shí)都需要先講主內(nèi)存的變量拷貝到線程內(nèi)存中,讀寫操作都在線程內(nèi)存中進(jìn)行矾芙∩嵘常可能一個(gè)線程寫入了變量的值,但還沒(méi)有同步到主內(nèi)存中剔宪,這時(shí)另外一個(gè)線程讀取變量值就會(huì)讀到舊的值拂铡,即發(fā)生了可見性問(wèn)題。

解決方式:voliate關(guān)鍵字/synchronized關(guān)鍵字

原理::每次修改變量后葱绒,立即將變量寫會(huì)主內(nèi)存感帅;每次使用變量時(shí),必須從主內(nèi)存中同步變量的值地淀。

b.原子性問(wèn)題

概念:

原子性是指某個(gè)(些)操作在語(yǔ)意上是原子的失球。

問(wèn)題分析:

由于線程的調(diào)度模型,每個(gè)線程會(huì)被分配一定的cpu時(shí)間帮毁,執(zhí)行時(shí)間結(jié)束后切換到下一個(gè)線程執(zhí)行她倘。可能存在一個(gè)線程訪問(wèn)并修改變量作箍,在整個(gè)操作完成之前被切出執(zhí)行硬梁,切換到另外一個(gè)線程執(zhí)行,該線程對(duì)變量也進(jìn)行的操作胞得,之后再切回原來(lái)線程繼續(xù)執(zhí)行時(shí)荧止,變量的值可能已經(jīng)被修改,無(wú)法得到正確的結(jié)果。因此需要通過(guò)某些方式保證操作的原子性跃巡。

原子性變量操作:

根據(jù)Java內(nèi)存模型保證的原子性變量操作包括read load use assign store write危号,基礎(chǔ)數(shù)據(jù)類型的訪問(wèn)、讀取素邪、寫是原子性的(注意long外莲,double),另外還有l(wèi)ock和unlock操作兔朦,反映到j(luò)ava代碼中即synchronized操作也是原子性的

解決方式:synchronized關(guān)鍵字/其他互斥鎖

原理:保證同一時(shí)間只能有一個(gè)線程訪問(wèn)加鎖區(qū)域中的代碼偷线,即保證了原子性。

擴(kuò)展

競(jìng)態(tài)條件:指某個(gè)操作由于不同的執(zhí)行時(shí)序而出現(xiàn)不同的結(jié)果沽甥。專門用來(lái)描述原子性問(wèn)題声邦。

c. 有序性問(wèn)題

有序性的語(yǔ)意有三層

  1. 保證多線程執(zhí)行的串行順序
  2. 防止重排序引起的問(wèn)題
  3. 程序執(zhí)行的先后順序,比如JMM定義的一些Happens-before規(guī)則

解決方式:volatile, final, synchronized摆舟,顯式鎖都可以保證有序性亥曹。

三、活躍性問(wèn)題

活躍性問(wèn)題包括但不限于死鎖恨诱、活鎖媳瞪、饑餓等。

死鎖:死鎖發(fā)生在一個(gè)線程需要獲取多個(gè)資源的時(shí)候照宝,這時(shí)由于兩個(gè)線程互相等待對(duì)方的資源而被阻塞材失,死鎖是最常見的活躍性問(wèn)題。

活鎖:活鎖指的是線程不斷重復(fù)執(zhí)行相同的操作硫豆,但每次操作的結(jié)果都是失敗的龙巨。盡管這個(gè)問(wèn)題不會(huì)阻塞線程,但是程序也無(wú)法繼續(xù)執(zhí)行熊响。

饑餓:饑餓指的線程無(wú)法訪問(wèn)到它需要的資源而不能繼續(xù)執(zhí)行時(shí)旨别,引發(fā)饑餓最常見資源就是CPU時(shí)鐘周期。

四汗茄、性能問(wèn)題

1. 性能

概述

性能包括很多方面:服務(wù)時(shí)間秸弛、延遲時(shí)間(響應(yīng)速度)、吞吐率洪碳、可伸縮性递览、容量、效率等瞳腌。

分類

可以分為兩大類:

運(yùn)行速度:服務(wù)時(shí)間绞铃、等待時(shí)間。即對(duì)于某個(gè)指定的任務(wù)單元嫂侍,“多快”才能處理完成儿捧。(一般對(duì)于單線程)

處理能力:可伸縮性荚坞、吞吐量、生產(chǎn)量菲盾。即對(duì)于計(jì)算資源一定的情況下颓影,可以完成“多少”工作。(一般針對(duì)于多線程)

性能調(diào)優(yōu)

在進(jìn)行性能調(diào)優(yōu)時(shí)需要明確優(yōu)化指標(biāo)懒鉴、運(yùn)行環(huán)境诡挂、測(cè)試or驗(yàn)證方式、優(yōu)化的代價(jià)和影響等多方面因素临谱。

需要考慮多種修改可能造成的影響:安全性璃俗、可讀性、可維護(hù)性吴裤、資源消耗旧找、其他風(fēng)險(xiǎn)等溺健。

針對(duì)線程并發(fā)進(jìn)行設(shè)計(jì)和優(yōu)化時(shí)采用的方法和傳統(tǒng)的性能調(diào)優(yōu)方法不同麦牺。

對(duì)于傳統(tǒng)的性能調(diào)優(yōu):已更少的代價(jià)完成相同的工作,比如緩存鞭缭、替換使用低復(fù)雜度算法等剖膳。

對(duì)于并發(fā)的性能調(diào)優(yōu):將問(wèn)題的計(jì)算并行化、從而利用更多的計(jì)算資源岭辣。

2. 針對(duì)并發(fā)程序的性能調(diào)優(yōu)

多線程的最主要目的是提高程序的運(yùn)行性能吱晒。使程序充分利用系統(tǒng)的處理能力,提高系統(tǒng)的資源利用率沦童。

在討論并發(fā)程序的性能時(shí)仑濒,一般關(guān)注它的可伸縮性。

可伸縮性:當(dāng)增加計(jì)算資源時(shí)(CPU偷遗、內(nèi)存墩瞳、存儲(chǔ)容量或I/O帶寬),程序的吞吐量或處理能力能夠相應(yīng)的增加氏豌。

想要通過(guò)線程并發(fā)獲得更好的伸縮性有兩個(gè)關(guān)鍵點(diǎn):

  1. 有效利用現(xiàn)有的處理資源
  2. 在出現(xiàn)新的系統(tǒng)資源時(shí)使程序盡可能利用這些新資源

系統(tǒng)資源:CPU時(shí)鐘周期喉酌、內(nèi)存、網(wǎng)絡(luò)帶寬泵喘、I/O帶寬泪电、數(shù)據(jù)庫(kù)請(qǐng)求、磁盤空間等纪铺。

可伸縮性優(yōu)化的注意點(diǎn):

  • 并發(fā)中的串行操作
  • 線程的額外開銷相速,包括上下文切換、內(nèi)存同步鲜锚、阻塞等
  • 獨(dú)占方式的資源鎖和蚪,當(dāng)鎖的請(qǐng)求頻率*持有時(shí)間越大時(shí)表明鎖的競(jìng)爭(zhēng)越激烈止状。可以通過(guò)縮小鎖的范圍(持有時(shí)間)攒霹、鎖分解(多加鎖怯疤、但是會(huì)增加死鎖的概率)、鎖分段催束、避免熱點(diǎn)域集峦、減少使用獨(dú)占鎖等方式來(lái)減少鎖的競(jìng)爭(zhēng)。

五抠刺、并發(fā)程序的設(shè)計(jì)

1. 執(zhí)行策略

執(zhí)行策略:

  • 在什么線程中執(zhí)行任務(wù)
  • 以什么順序執(zhí)行這些策略塔淤,F(xiàn)IFO、LIFO速妖、優(yōu)先級(jí)
  • 有多少個(gè)任務(wù)可以并發(fā)執(zhí)行
  • 有多少個(gè)任務(wù)可以等待執(zhí)行
  • 如果系統(tǒng)因?yàn)檫^(guò)載需要拋棄一個(gè)任務(wù)高蜂,應(yīng)該選擇哪一個(gè)任務(wù)來(lái)拋棄?進(jìn)一步罕容,如何通知應(yīng)用程序任務(wù)被拋棄备恤?

執(zhí)行策略的目的:

更高效地利用系統(tǒng)資源,提高服務(wù)質(zhì)量锦秒。避免因?yàn)椴l(fā)影響了性能露泊。

執(zhí)行策略的優(yōu)勢(shì):

將任務(wù)的提交過(guò)程和執(zhí)行過(guò)程解耦。

2. 線程管理

ThreadExecutor線程池 - 重用已有線程

  • 減少系統(tǒng)開銷旅择,減少線程創(chuàng)建和銷毀時(shí)的巨大開銷
  • 提高響應(yīng)性惭笑,避免由于創(chuàng)建線程導(dǎo)致延遲任務(wù)執(zhí)行的時(shí)機(jī)
  • 充分利用系統(tǒng)資源,創(chuàng)建足夠多的線程使處理器保持忙碌狀態(tài)生真,同時(shí)防止多個(gè)線程競(jìng)爭(zhēng)資源導(dǎo)致應(yīng)用程序耗盡內(nèi)存或者失敗

線程池注意點(diǎn):

  • 任務(wù)和執(zhí)行策略之間的耦合性和相關(guān)性
  • 線程池大小
  • 配置ThreadPoolExecutor:線程的創(chuàng)建和銷毀沉噩、管理任務(wù)隊(duì)列、飽和策略柱蟀、線程工廠
  • 其他擴(kuò)展:日志川蒙、計(jì)時(shí)、監(jiān)視产弹、統(tǒng)計(jì)信息

3. 中斷派歌、取消和關(guān)閉

線程的取消和關(guān)閉,可以分為四個(gè)維度:任務(wù)痰哨、線程胶果、服務(wù)、應(yīng)用程序

針對(duì)任務(wù)斤斧,需要明確取消策略:

取消策略(how早抠、when、what)

  • 其他代碼如何請(qǐng)求取消該任務(wù)
  • 任務(wù)在何時(shí)取消檢查已經(jīng)請(qǐng)求了取消
  • 響應(yīng)取消請(qǐng)求時(shí)需要應(yīng)該進(jìn)行哪些操作

六撬讽、擴(kuò)展

1. java內(nèi)存模型

java內(nèi)存模型主要目標(biāo)是定義程序中各個(gè)變量的訪問(wèn)規(guī)則蕊连,即在虛擬機(jī)中將變量存儲(chǔ)到內(nèi)存和從內(nèi)存中取出變量這樣的底層細(xì)節(jié)悬垃。

Java內(nèi)存模型分為主內(nèi)存和工作內(nèi)存。駐內(nèi)存所有線程共享甘苍,工作內(nèi)存每個(gè)線程單獨(dú)擁有尝蠕,不共享。

線程工作內(nèi)存中保存著該線程所用到的變量的主內(nèi)存副本拷貝载庭。

線程對(duì)于變量的所有操作看彼,都必須在工作內(nèi)存中進(jìn)行,不能直接讀寫主內(nèi)存中的變量囚聚。

線程無(wú)法獲取其他線程工作內(nèi)存中的變量靖榕,線程間變量值的傳遞必須通過(guò)主內(nèi)存完成

  • lock(鎖定):作用于主內(nèi)存,它把一個(gè)變量標(biāo)記為一條線程獨(dú)占狀態(tài)顽铸;
  • unlock(解鎖):作用于主內(nèi)存茁计,它將一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),釋放后的變量才能夠被其他線程鎖定谓松;
  • read(讀刃茄埂):作用于主內(nèi)存變量,把一個(gè)變量值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中毒返,以便隨后的load動(dòng)作使用
  • load(載入):作用于工作內(nèi)存的變量租幕,它把read操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中舷手。
  • use(使用):作用于工作內(nèi)存的變量拧簸,把工作內(nèi)存中的一個(gè)變量值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個(gè)需要使用變量的值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作男窟。
  • assign(賦值):作用于工作內(nèi)存的變量盆赤,它把一個(gè)從執(zhí)行引擎接收到的值賦值給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)執(zhí)行這個(gè)操作歉眷。
  • store(存儲(chǔ)):作用于工作內(nèi)存的變量牺六,把工作內(nèi)存中的一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的write的操作汗捡。
  • write(寫入):作用于主內(nèi)存的變量淑际,它把store操作從工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存的變量中
20160919130233191.jpg

2. 指令重排

目標(biāo):提高運(yùn)行速度。

起因:只要程序的最終結(jié)果與嚴(yán)格串行環(huán)境中執(zhí)行的結(jié)果相同扇住,那么所有操作都是允許的春缕。

重排序的問(wèn)題是一個(gè)單獨(dú)的主題,常見的重排序有3個(gè)層面:

  1. 編譯級(jí)別的重排序艘蹋,比如編譯器的優(yōu)化
  2. 指令級(jí)重排序锄贼,比如CPU指令執(zhí)行的重排序
  3. 內(nèi)存系統(tǒng)的重排序,比如緩存和讀寫緩沖區(qū)導(dǎo)致的重排序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末女阀,一起剝皮案震驚了整個(gè)濱河市宅荤,隨后出現(xiàn)的幾起案子屑迂,更是在濱河造成了極大的恐慌,老刑警劉巖冯键,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惹盼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惫确,警方通過(guò)查閱死者的電腦和手機(jī)逻锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雕薪,“玉大人昧诱,你說(shuō)我怎么就攤上這事∷” “怎么了盏档?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)燥爷。 經(jīng)常有香客問(wèn)我蜈亩,道長(zhǎng),這世上最難降的妖魔是什么前翎? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任稚配,我火速辦了婚禮,結(jié)果婚禮上港华,老公的妹妹穿的比我還像新娘道川。我一直安慰自己,他們只是感情好立宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布冒萄。 她就那樣靜靜地躺著,像睡著了一般橙数。 火紅的嫁衣襯著肌膚如雪尊流。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天灯帮,我揣著相機(jī)與錄音崖技,去河邊找鬼。 笑死钟哥,一個(gè)胖子當(dāng)著我的面吹牛迎献,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞪醋,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼忿晕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了银受?” 一聲冷哼從身側(cè)響起践盼,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸦采,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后咕幻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渔伯,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年肄程,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锣吼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蓝厌,死狀恐怖玄叠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拓提,我是刑警寧澤读恃,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站代态,受9級(jí)特大地震影響寺惫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蹦疑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一西雀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歉摧,春花似錦艇肴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)育谬。三九已至券盅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間膛檀,已是汗流浹背锰镀。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咖刃,地道東北人泳炉。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚎杨,于是被迫代替她去往敵國(guó)和親花鹅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實(shí)習(xí)到現(xiàn)在枫浙,面了一些公司刨肃,掛了不少古拴,但最終還是拿到小米、百度真友、阿里黄痪、京東、新浪盔然、CVTE桅打、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,184評(píng)論 11 349
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來(lái)是分開三篇的,后來(lái)想想還是整...
    coder_pig閱讀 1,629評(píng)論 2 17
  • 慨起神馳赴故杭愈案,未收舊土已弓藏挺尾。 后來(lái)多少受侮事,直教匹夫思岳王站绪。 2015.春
    長(zhǎng)青柏閱讀 284評(píng)論 0 0
  • 大家好崇众,我是磐石掂僵,今天是我參加60秒口才訓(xùn)練營(yíng)的第30天,已經(jīng)錄制了32期節(jié)目顷歌。 今天我把前面幾期的節(jié)目和后面進(jìn)行...
    磐石yy閱讀 519評(píng)論 0 4
  • 蘆瑞琦閱讀 124評(píng)論 0 0