java同步機(jī)制

我們可以在計(jì)算機(jī)上運(yùn)行各種計(jì)算機(jī)軟件程序唧席。每一個(gè)運(yùn)行的程序可能包括多個(gè)獨(dú)立運(yùn)行的線(xiàn)程(Thread)疾呻。

線(xiàn)程(Thread)是一份獨(dú)立運(yùn)行的程序澈歉,有自己專(zhuān)用的運(yùn)行棧工腋。線(xiàn)程有可能和其他線(xiàn)程共享一些資源姨丈,比如,內(nèi)存擅腰,文件蟋恬,數(shù)據(jù)庫(kù)等。

當(dāng)多個(gè)線(xiàn)程同時(shí)讀寫(xiě)同一份共享資源的時(shí)候趁冈,可能會(huì)引起沖突歼争。這時(shí)候,我們需要引入線(xiàn)程“同步”機(jī)制渗勘,即各位線(xiàn)程之間要有個(gè)先來(lái)后到沐绒,不能一窩蜂擠上去搶作一團(tuán)。

同步這個(gè)詞是從英文synchronize(使同時(shí)發(fā)生)翻譯過(guò)來(lái)的旺坠。我也不明白為什么要用這個(gè)很容易引起誤解的詞乔遮。既然大家都這么用,咱們也就只好這么將就价淌。

線(xiàn)程同步的真實(shí)意思和字面意思恰好相反申眼。線(xiàn)程同步的真實(shí)意思瞒津,其實(shí)是“排隊(duì)”:幾個(gè)線(xiàn)程之間要排隊(duì)蝉衣,一個(gè)一個(gè)對(duì)共享資源進(jìn)行操作括尸,而不是同時(shí)進(jìn)行操作。

因此病毡,關(guān)于線(xiàn)程同步濒翻,需要牢牢記住的第一點(diǎn)是:線(xiàn)程同步就是線(xiàn)程排隊(duì)。同步就是排隊(duì)啦膜。線(xiàn)程同步的目的就是避免線(xiàn)程“同步”執(zhí)行有送。這可真是個(gè)無(wú)聊的繞口令。

關(guān)于線(xiàn)程同步僧家,需要牢牢記住的第二點(diǎn)是 “共享”這兩個(gè)字雀摘。只有共享資源的讀寫(xiě)訪(fǎng)問(wèn)才需要同步。如果不是共享資源八拱,那么就根本沒(méi)有同步的必要阵赠。

關(guān)于線(xiàn)程同步,需要牢牢記住的第三點(diǎn)是肌稻,只有“變量”才需要同步訪(fǎng)問(wèn)清蚀。如果共享的資源是固定不變的,那么就相當(dāng)于“常量”爹谭,線(xiàn)程同時(shí)讀取常量也不需要同步枷邪。至少一個(gè)線(xiàn)程修改共享資源,這樣的情況下诺凡,線(xiàn)程之間就需要同步东揣。

關(guān)于線(xiàn)程同步,需要牢牢記住的第四點(diǎn)是:多個(gè)線(xiàn)程訪(fǎng)問(wèn)共享資源的代碼有可能是同一份代碼腹泌,也有可能是不同的代碼嘶卧;無(wú)論是否執(zhí)行同一份代碼,只要這些線(xiàn)程的代碼訪(fǎng)問(wèn)同一份可變的共享資源真屯,這些線(xiàn)程之間就需要同步脸候。

為了加深理解,下面舉幾個(gè)例子绑蔫。

有兩個(gè)采購(gòu)員运沦,他們的工作內(nèi)容是相同的,都是遵循如下的步驟:

(1)到市場(chǎng)上去配深,尋找并購(gòu)買(mǎi)有潛力的樣品携添。

(2)回到公司,寫(xiě)報(bào)告篓叶。

這兩個(gè)人的工作內(nèi)容雖然一樣烈掠,他們都需要購(gòu)買(mǎi)樣品羞秤,他們可能買(mǎi)到同樣種類(lèi)的樣品,但是他們絕對(duì)不會(huì)購(gòu)買(mǎi)到同一件樣品左敌,他們之間沒(méi)有任何共享資源瘾蛋。所以,他們可以各自進(jìn)行自己的工作矫限,互不干擾哺哼。

這兩個(gè)采購(gòu)員就相當(dāng)于兩個(gè)線(xiàn)程;兩個(gè)采購(gòu)員遵循相同的工作步驟叼风,相當(dāng)于這兩個(gè)線(xiàn)程執(zhí)行同一段代碼取董。

下面給這兩個(gè)采購(gòu)員增加一個(gè)工作步驟。采購(gòu)員需要根據(jù)公司的“布告欄”上面公布的信息无宿,安排自己的工作計(jì)劃茵汰。

這兩個(gè)采購(gòu)員有可能同時(shí)走到布告欄的前面,同時(shí)觀看布告欄上的信息孽鸡。這一點(diǎn)問(wèn)題都沒(méi)有蹂午。因?yàn)椴几鏅谑侵蛔x的,這兩個(gè)采購(gòu)員誰(shuí)都不會(huì)去修改布告欄上寫(xiě)的信息梭灿。

下面增加一個(gè)角色画侣。一個(gè)辦公室行政人員這個(gè)時(shí)候,也走到了布告欄前面堡妒,準(zhǔn)備修改布告欄上的信息配乱。

如果行政人員先到達(dá)布告欄,并且正在修改布告欄的內(nèi)容皮迟。兩個(gè)采購(gòu)員這個(gè)時(shí)候搬泥,恰好也到了。這兩個(gè)采購(gòu)員就必須等待行政人員完成修改之后伏尼,才能觀看修改后的信息忿檩。

如果行政人員到達(dá)的時(shí)候,兩個(gè)采購(gòu)員已經(jīng)在觀看布告欄了爆阶。那么行政人員需要等待兩個(gè)采購(gòu)員把當(dāng)前信息記錄下來(lái)之后燥透,才能夠?qū)懮闲碌男畔ⅰ?/p>

上述這兩種情況,行政人員和采購(gòu)員對(duì)布告欄的訪(fǎng)問(wèn)就需要進(jìn)行同步辨图。因?yàn)槠渲幸粋€(gè)線(xiàn)程(行政人員)修改了共享資源(布告欄)班套。而且我們可以看到,行政人員的工作流程和采購(gòu)員的工作流程(執(zhí)行代碼)完全不同故河,但是由于他們?cè)L問(wèn)了同一份可變共享資源(布告欄)吱韭,所以他們之間需要同步。

同步鎖

前面講了為什么要線(xiàn)程同步鱼的,下面我們就來(lái)看如何才能線(xiàn)程同步理盆。

線(xiàn)程同步的基本實(shí)現(xiàn)思路還是比較容易理解的痘煤。我們可以給共享資源加一把鎖,這把鎖只有一把鑰匙猿规。哪個(gè)線(xiàn)程獲取了這把鑰匙衷快,才有權(quán)利訪(fǎng)問(wèn)該共享資源。

生活中坎拐,我們也可能會(huì)遇到這樣的例子烦磁。一些超市的外面提供了一些自動(dòng)儲(chǔ)物箱养匈。每個(gè)儲(chǔ)物箱都有一把鎖哼勇,一把鑰匙。人們可以使用那些帶有鑰匙的儲(chǔ)物箱呕乎,把東西放到儲(chǔ)物箱里面积担,把儲(chǔ)物箱鎖上,然后把鑰匙拿走猬仁。這樣帝璧,該儲(chǔ)物箱就被鎖住了,其他人不能再訪(fǎng)問(wèn)這個(gè)儲(chǔ)物箱湿刽。(當(dāng)然的烁,真實(shí)的儲(chǔ)物箱鑰匙是可以被人拿走復(fù)制的,所以不要把貴重物品放在超市的儲(chǔ)物箱里面诈闺。于是很多超市都采用了電子密碼鎖渴庆。)

線(xiàn)程同步鎖這個(gè)模型看起來(lái)很直觀。但是雅镊,還有一個(gè)嚴(yán)峻的問(wèn)題沒(méi)有解決襟雷,這個(gè)同步鎖應(yīng)該加在哪里?

當(dāng)然是加在共享資源上了仁烹。反應(yīng)快的讀者一定會(huì)搶先回答耸弄。

沒(méi)錯(cuò),如果可能卓缰,我們當(dāng)然盡量把同步鎖加在共享資源上计呈。一些比較完善的共享資源,比如征唬,文件系統(tǒng)捌显,數(shù)據(jù)庫(kù)系統(tǒng)等,自身都提供了比較完善的同步鎖機(jī)制鳍鸵。我們不用另外給這些資源加鎖苇瓣,這些資源自己就有鎖。

但是偿乖,大部分情況下击罪,我們?cè)诖a中訪(fǎng)問(wèn)的共享資源都是比較簡(jiǎn)單的共享對(duì)象哲嘲。這些對(duì)象里面沒(méi)有地方讓我們加鎖。

讀者可能會(huì)提出建議:為什么不在每一個(gè)對(duì)象內(nèi)部都增加一個(gè)新的區(qū)域媳禁,專(zhuān)門(mén)用來(lái)加鎖呢眠副?這種設(shè)計(jì)理論上當(dāng)然也是可行的。問(wèn)題在于竣稽,線(xiàn)程同步的情況并不是很普遍囱怕。如果因?yàn)檫@小概率事件,在所有對(duì)象內(nèi)部都開(kāi)辟一塊鎖空間毫别,將會(huì)帶來(lái)極大的空間浪費(fèi)娃弓。得不償失。

于是岛宦,現(xiàn)代的編程語(yǔ)言的設(shè)計(jì)思路都是把同步鎖加在代碼段上台丛。確切的說(shuō),是把同步鎖加在“訪(fǎng)問(wèn)共享資源的代碼段”上砾肺。這一點(diǎn)一定要記住挽霉,同步鎖是加在代碼段上的。

同步鎖加在代碼段上变汪,就很好地解決了上述的空間浪費(fèi)問(wèn)題侠坎。但是卻增加了模型的復(fù)雜度,也增加了我們的理解難度裙盾。

現(xiàn)在我們就來(lái)仔細(xì)分析“同步鎖加在代碼段上”的線(xiàn)程同步模型实胸。

首先,我們已經(jīng)解決了同步鎖加在哪里的問(wèn)題闷煤。我們已經(jīng)確定童芹,同步鎖不是加在共享資源上,而是加在訪(fǎng)問(wèn)共享資源的代碼段上鲤拿。

其次假褪,我們要解決的問(wèn)題是,我們應(yīng)該在代碼段上加什么樣的鎖近顷。這個(gè)問(wèn)題是重點(diǎn)中的重點(diǎn)生音。這是我們尤其要注意的問(wèn)題:訪(fǎng)問(wèn)同一份共享資源的不同代碼段,應(yīng)該加上同一個(gè)同步鎖窒升;如果加的是不同的同步鎖缀遍,那么根本就起不到同步的作用,沒(méi)有任何意義饱须。

這就是說(shuō)域醇,同步鎖本身也一定是多個(gè)線(xiàn)程之間的共享對(duì)象。

Java語(yǔ)言的synchronized關(guān)鍵字

為了加深理解,舉幾個(gè)代碼段同步的例子譬挚。

不同語(yǔ)言的同步鎖模型都是一樣的锅铅。只是表達(dá)方式有些不同。這里我們以當(dāng)前最流行的Java語(yǔ)言為例减宣。Java語(yǔ)言里面用synchronized關(guān)鍵字給代碼段加鎖盐须。整個(gè)語(yǔ)法形式表現(xiàn)為

synchronized(同步鎖) {

// 訪(fǎng)問(wèn)共享資源,需要同步的代碼段

}

這里尤其要注意的就是漆腌,同步鎖本身一定要是共享的對(duì)象贼邓。

… f1() {

Object lock1 = new Object(); // 產(chǎn)生一個(gè)同步鎖

synchronized(lock1){

// 代碼段 A

// 訪(fǎng)問(wèn)共享資源 resource1

// 需要同步

}

}

上面這段代碼沒(méi)有任何意義。因?yàn)槟莻€(gè)同步鎖是在函數(shù)體內(nèi)部產(chǎn)生的闷尿。每個(gè)線(xiàn)程調(diào)用這段代碼的時(shí)候塑径,都會(huì)產(chǎn)生一個(gè)新的同步鎖。那么多個(gè)線(xiàn)程之間悠砚,使用的是不同的同步鎖晓勇。根本達(dá)不到同步的目的。

同步代碼一定要寫(xiě)成如下的形式灌旧,才有意義。

public static final Object lock1 = new Object();

… f1() {

synchronized(lock1){ // lock1 是公用同步鎖

// 代碼段 A

// 訪(fǎng)問(wèn)共享資源 resource1

// 需要同步

}

你不一定要把同步鎖聲明為static或者public绰筛,但是你一定要保證相關(guān)的同步代碼之間枢泰,一定要使用同一個(gè)同步鎖。

講到這里铝噩,你一定會(huì)好奇衡蚂,這個(gè)同步鎖到底是個(gè)什么東西。為什么隨便聲明一個(gè)Object對(duì)象骏庸,就可以作為同步鎖毛甲?

在Java里面,同步鎖的概念就是這樣的具被。任何一個(gè)Object Reference都可以作為同步鎖玻募。我們可以把Object Reference理解為對(duì)象在內(nèi)存分配系統(tǒng)中的內(nèi)存地址。因此一姿,要保證同步代碼段之間使用的是同一個(gè)同步鎖七咧,我們就要保證這些同步代碼段的synchronized關(guān)鍵字使用的是同一個(gè)Object Reference,同一個(gè)內(nèi)存地址叮叹。這也是為什么我在前面的代碼中聲明lock1的時(shí)候艾栋,使用了final關(guān)鍵字,這就是為了保證lock1的Object Reference在整個(gè)系統(tǒng)運(yùn)行過(guò)程中都保持不變蛉顽。

一些求知欲強(qiáng)的讀者可能想要繼續(xù)深入了解synchronzied(同步鎖)的實(shí)際運(yùn)行機(jī)制蝗砾。Java虛擬機(jī)規(guī)范中(你可以在google用“JVM Spec”等關(guān)鍵字進(jìn)行搜索),有對(duì)synchronized關(guān)鍵字的詳細(xì)解釋。synchronized會(huì)編譯成 monitor enter, … monitor exit之類(lèi)的指令對(duì)悼粮。Monitor就是實(shí)際上的同步鎖拇泣。每一個(gè)Object Reference在概念上都對(duì)應(yīng)一個(gè)monitor。

這些實(shí)現(xiàn)細(xì)節(jié)問(wèn)題矮锈,并不是理解同步鎖模型的關(guān)鍵霉翔。我們繼續(xù)看幾個(gè)例子,加深對(duì)同步鎖模型的理解苞笨。

public static final Object lock1 = new Object();

… f1() {

synchronized(lock1){ // lock1 是公用同步鎖

// 代碼段 A

// 訪(fǎng)問(wèn)共享資源 resource1

// 需要同步

}

}

… f2() {

synchronized(lock1){ // lock1 是公用同步鎖

// 代碼段 B

// 訪(fǎng)問(wèn)共享資源 resource1

// 需要同步

}

}

上述的代碼中债朵,代碼段A和代碼段B就是同步的。因?yàn)樗鼈兪褂玫氖峭粋€(gè)同步鎖lock1瀑凝。

如果有10個(gè)線(xiàn)程同時(shí)執(zhí)行代碼段A序芦,同時(shí)還有20個(gè)線(xiàn)程同時(shí)執(zhí)行代碼段B,那么這30個(gè)線(xiàn)程之間都是要進(jìn)行同步的粤咪。

這30個(gè)線(xiàn)程都要競(jìng)爭(zhēng)一個(gè)同步鎖lock1谚中。同一時(shí)刻,只有一個(gè)線(xiàn)程能夠獲得lock1的所有權(quán)寥枝,只有一個(gè)線(xiàn)程可以執(zhí)行代碼段A或者代碼段B宪塔。其他競(jìng)爭(zhēng)失敗的線(xiàn)程只能暫停運(yùn)行,進(jìn)入到該同步鎖的就緒(Ready)隊(duì)列囊拜。

每一個(gè)同步鎖下面都掛了幾個(gè)線(xiàn)程隊(duì)列某筐,包括就緒(Ready)隊(duì)列,待召(Waiting)隊(duì)列等冠跷。比如南誊,lock1對(duì)應(yīng)的就緒隊(duì)列就可以叫做lock1 - ready queue。每個(gè)隊(duì)列里面都可能有多個(gè)暫停運(yùn)行的線(xiàn)程蜜托。

注意抄囚,競(jìng)爭(zhēng)同步鎖失敗的線(xiàn)程進(jìn)入的是該同步鎖的就緒(Ready)隊(duì)列,而不是后面要講述的待召隊(duì)列(Waiting Queue橄务,也可以翻譯為等待隊(duì)列)幔托。就緒隊(duì)列里面的線(xiàn)程總是時(shí)刻準(zhǔn)備著競(jìng)爭(zhēng)同步鎖,時(shí)刻準(zhǔn)備著運(yùn)行仪糖。而待召隊(duì)列里面的線(xiàn)程則只能一直等待柑司,直到等到某個(gè)信號(hào)的通知之后,才能夠轉(zhuǎn)移到就緒隊(duì)列中锅劝,準(zhǔn)備運(yùn)行攒驰。

成功獲取同步鎖的線(xiàn)程,執(zhí)行完同步代碼段之后故爵,會(huì)釋放同步鎖玻粪。該同步鎖的就緒隊(duì)列中的其他線(xiàn)程就繼續(xù)下一輪同步鎖的競(jìng)爭(zhēng)隅津。成功者就可以繼續(xù)運(yùn)行,失敗者還是要乖乖地待在就緒隊(duì)列中劲室。

因此伦仍,線(xiàn)程同步是非常耗費(fèi)資源的一種操作。我們要盡量控制線(xiàn)程同步的代碼段范圍很洋。同步的代碼段范圍越小越好充蓝。我們用一個(gè)名詞“同步粒度”來(lái)表示同步代碼段的范圍

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喉磁,隨后出現(xiàn)的幾起案子谓苟,更是在濱河造成了極大的恐慌,老刑警劉巖协怒,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涝焙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孕暇,警方通過(guò)查閱死者的電腦和手機(jī)仑撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妖滔,“玉大人隧哮,你說(shuō)我怎么就攤上這事☆蹰梗” “怎么了近迁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)簸州。 經(jīng)常有香客問(wèn)我,道長(zhǎng)歧譬,這世上最難降的妖魔是什么岸浑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮瑰步,結(jié)果婚禮上矢洲,老公的妹妹穿的比我還像新娘。我一直安慰自己缩焦,他們只是感情好读虏,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著袁滥,像睡著了一般盖桥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上题翻,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天揩徊,我揣著相機(jī)與錄音,去河邊找鬼。 笑死塑荒,一個(gè)胖子當(dāng)著我的面吹牛熄赡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播齿税,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼彼硫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凌箕?” 一聲冷哼從身側(cè)響起拧篮,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎陌知,沒(méi)想到半個(gè)月后他托,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仆葡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年赏参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沿盅。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡把篓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腰涧,到底是詐尸還是另有隱情韧掩,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布窖铡,位于F島的核電站疗锐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏费彼。R本人自食惡果不足惜滑臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箍铲。 院中可真熱鬧雇卷,春花似錦、人聲如沸颠猴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翘瓮。三九已至贮折,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間春畔,已是汗流浹背脱货。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工岛都, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人振峻。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓臼疫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親扣孟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烫堤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請(qǐng)注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,150評(píng)論 0 14
  • 一凤价、多線(xiàn)程 說(shuō)明下線(xiàn)程的狀態(tài) java中的線(xiàn)程一共有 5 種狀態(tài)鸽斟。 NEW:這種情況指的是,通過(guò) New 關(guān)鍵字創(chuàng)...
    Java旅行者閱讀 4,688評(píng)論 0 44
  • 對(duì)于很多剛剛接觸多線(xiàn)程編程的同學(xué)來(lái)說(shuō)利诺,可能僅僅是聽(tīng)說(shuō)過(guò)線(xiàn)程同步和線(xiàn)程安全這兩個(gè)名詞而已富蓄,對(duì)于具體什么線(xiàn)程同步、什么...
    揭光智閱讀 6,694評(píng)論 3 19
  • layout: posttitle: 《Java并發(fā)編程的藝術(shù)》筆記categories: Javaexcerpt...
    xiaogmail閱讀 5,835評(píng)論 1 19
  • 美麗慢逾,在古戰(zhàn)場(chǎng) 傳說(shuō)一股腦兒的美麗 西施氣喘立倍,范蠡眼盲 為一則典故,遂失蹤 轉(zhuǎn)過(guò)身去侣滩,小荷才露 赤紅的蜻蜓已夏季 ...
    曾昭閱讀 134評(píng)論 0 1