2018-06-13

什么是單例模式?

在文章開始之前我們還是有必要介紹一下什么是單例模式北苟。單例模式是為確保一個(gè)類只有一個(gè)實(shí)例,并為整個(gè)系統(tǒng)提供一個(gè)全局訪問點(diǎn)的一種模式方法怕篷。

從概念中體現(xiàn)出了單例的一些特點(diǎn):

(1)历筝、在任何情況下,單例類永遠(yuǎn)只有一個(gè)實(shí)例存在

(2)廊谓、單例需要有能力為整個(gè)系統(tǒng)提供這一唯一實(shí)例?

為了便于讀者更好的理解這些概念漫谷,下面給出這么一段內(nèi)容敘述:

在計(jì)算機(jī)系統(tǒng)中,線程池蹂析、緩存舔示、日志對象碟婆、對話框、打印機(jī)惕稻、顯卡的驅(qū)動程序?qū)ο蟪1辉O(shè)計(jì)成單例竖共。這些應(yīng)用都或多或少具有資源管理器的功能。每臺計(jì)算機(jī)可以有若干個(gè)打印機(jī)俺祠,但只能有一個(gè)Printer Spooler公给,以避免兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。每臺計(jì)算機(jī)可以有若干通信端口蜘渣,系統(tǒng)應(yīng)當(dāng)集中管理這些通信端口淌铐,以避免一個(gè)通信端口同時(shí)被兩個(gè)請求同時(shí)調(diào)用∧韪祝總之腿准,選擇單例模式就是為了避免不一致狀態(tài),避免政出多頭拾碌。

正是由于這個(gè)特點(diǎn)吐葱,單例對象通常作為程序中的存放配置信息的載體,因?yàn)樗鼙WC其他對象讀到一致的信息校翔。例如在某個(gè)服務(wù)器程序中弟跑,該服務(wù)器的配置信息可能存放在數(shù)據(jù)庫或文件中,這些配置數(shù)據(jù)由某個(gè)單例對象統(tǒng)一讀取防症,服務(wù)進(jìn)程中的其他對象如果要獲取這些配置信息孟辑,只需訪問該單例對象即可。這種方式極大地簡化了在復(fù)雜環(huán)境 下蔫敲,尤其是多線程環(huán)境下的配置管理饲嗽,但是隨著應(yīng)用場景的不同,也可能帶來一些同步問題燕偶。


各式各樣的單例實(shí)現(xiàn)

溫馨提示:本文敘述中涉及到的相關(guān)源碼可以在這里進(jìn)行下載源碼喝噪,讀者可免積分下載础嫡。

1指么、餓漢式單例

餓漢式單例是指在方法調(diào)用前,實(shí)例就已經(jīng)創(chuàng)建好了榴鼎。下面是實(shí)現(xiàn)代碼:

package org.mlinge.s01;

public class MySingleton {

private static MySingleton instance = new MySingleton();

private MySingleton(){}

public static MySingleton getInstance() {

return instance;

}

}

以上是單例的餓漢式實(shí)現(xiàn)伯诬,我們來看看餓漢式在多線程下的執(zhí)行情況,給出一段多線程的執(zhí)行代碼:

package org.mlinge.s01;

public class MyThread extends Thread{


@Override

public void run() {

System.out.println(MySingleton.getInstance().hashCode());

}

public static void main(String[] args) {

MyThread[] mts = new MyThread[10];

for(int i = 0 ; i < mts.length ; i++){

mts[i] = new MyThread();

}

for (int j = 0; j < mts.length; j++) {

mts[j].start();

}

}

}

以上代碼運(yùn)行結(jié)果:

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

從運(yùn)行結(jié)果可以看出實(shí)例變量額hashCode值一致巫财,這說明對象是同一個(gè)盗似,餓漢式單例實(shí)現(xiàn)了。

2平项、懶漢式單例

懶漢式單例是指在方法調(diào)用獲取實(shí)例時(shí)才創(chuàng)建實(shí)例赫舒,因?yàn)橄鄬︷I漢式顯得“不急迫”悍及,所以被叫做“懶漢模式”。下面是實(shí)現(xiàn)代碼:

package org.mlinge.s02;

public class MySingleton {

private static MySingleton instance = null;

private MySingleton(){}

public static MySingleton getInstance() {

if(instance == null){//懶漢式

instance = new MySingleton();

}

return instance;

}

}

這里實(shí)現(xiàn)了懶漢式的單例接癌,但是熟悉多線程并發(fā)編程的朋友應(yīng)該可以看出心赶,在多線程并發(fā)下這樣的實(shí)現(xiàn)是無法保證實(shí)例實(shí)例唯一的,甚至可以說這樣的失效是完全錯(cuò)誤的缺猛,下面我們就來看一下多線程并發(fā)下的執(zhí)行情況缨叫,這里為了看到效果,我們對上面的代碼做一小點(diǎn)修改:

package org.mlinge.s02;

public class MySingleton {

private static MySingleton instance = null;

private MySingleton(){}

public static MySingleton getInstance() {

try {

if(instance != null){//懶漢式

}else{

//創(chuàng)建實(shí)例之前可能會有一些準(zhǔn)備性的耗時(shí)工作

Thread.sleep(300);

instance = new MySingleton();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return instance;

}

}

這里假設(shè)在創(chuàng)建實(shí)例前有一些準(zhǔn)備性的耗時(shí)工作要處理荔燎,多線程調(diào)用:

package org.mlinge.s02;

public class MyThread extends Thread{


@Override

public void run() {

System.out.println(MySingleton.getInstance().hashCode());

}

public static void main(String[] args) {

MyThread[] mts = new MyThread[10];

for(int i = 0 ; i < mts.length ; i++){

mts[i] = new MyThread();

}

for (int j = 0; j < mts.length; j++) {

mts[j].start();

}

}

}

執(zhí)行結(jié)果如下:

1210420568

1210420568

1935123450

1718900954

1481297610

1863264879

369539795

1210420568

1210420568

602269801

從這里執(zhí)行結(jié)果可以看出耻姥,單例的線程安全性并沒有得到保證,那要怎么解決呢有咨?

3琐簇、線程安全的懶漢式單例

要保證線程安全,我們就得需要使用同步鎖機(jī)制摔吏,下面就來看看我們?nèi)绾我徊讲降慕鉀Q 存在線程安全問題的懶漢式單例(錯(cuò)誤的單例)鸽嫂。

(1)、 方法中聲明synchronized關(guān)鍵字

出現(xiàn)非線程安全問題征讲,是由于多個(gè)線程可以同時(shí)進(jìn)入getInstance()方法据某,那么只需要對該方法進(jìn)行synchronized的鎖同步即可:

package org.mlinge.s03;

public class MySingleton {

private static MySingleton instance = null;

private MySingleton(){}

public synchronized static MySingleton getInstance() {

try {

if(instance != null){//懶漢式

}else{

//創(chuàng)建實(shí)例之前可能會有一些準(zhǔn)備性的耗時(shí)工作

Thread.sleep(300);

instance = new MySingleton();

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return instance;

}

}

此時(shí)任然使用前面驗(yàn)證多線程下執(zhí)行情況的MyThread類來進(jìn)行驗(yàn)證,將其放入到org.mlinge.s03包下運(yùn)行诗箍,執(zhí)行結(jié)果如下:

1689058373

1689058373

1689058373

1689058373

1689058373

1689058373

1689058373

1689058373

1689058373

1689058373

從執(zhí)行結(jié)果上來看癣籽,問題已經(jīng)解決了,但是這種實(shí)現(xiàn)方式的運(yùn)行效率會很低滤祖。同步方法效率低筷狼,那我們考慮使用同步代碼塊來實(shí)現(xiàn):

(2)、 同步代碼塊實(shí)現(xiàn)

package org.mlinge.s03;

public class MySingleton {

private static MySingleton instance = null;

private MySingleton(){}

//public synchronized static MySingleton getInstance() {

public static MySingleton getInstance() {

try {

synchronized (MySingleton.class) {

if(instance != null){//懶漢式

}else{

//創(chuàng)建實(shí)例之前可能會有一些準(zhǔn)備性的耗時(shí)工作

Thread.sleep(300);

instance = new MySingleton();

}

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return instance;

}

}

這里的實(shí)現(xiàn)能夠保證多線程并發(fā)下的線程安全性匠童,但是這樣的實(shí)現(xiàn)將全部的代碼都被鎖上了埂材,同樣的效率很低下。

(3)汤求、 針對某些重要的代碼來進(jìn)行單獨(dú)的同步(可能非線程安全)

針對某些重要的代碼進(jìn)行單獨(dú)的同步俏险,而不是全部進(jìn)行同步,可以極大的提高執(zhí)行效率扬绪,我們來看一下:

package org.mlinge.s04;

public class MySingleton {

private static MySingleton instance = null;

private MySingleton(){}

public static MySingleton getInstance() {

try {?

if(instance != null){//懶漢式

}else{

//創(chuàng)建實(shí)例之前可能會有一些準(zhǔn)備性的耗時(shí)工作

Thread.sleep(300);

synchronized (MySingleton.class) {

instance = new MySingleton();

}

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return instance;

}

}

此時(shí)同樣使用前面驗(yàn)證多線程下執(zhí)行情況的MyThread類來進(jìn)行驗(yàn)證竖独,將其放入到org.mlinge.s04包下運(yùn)行,執(zhí)行結(jié)果如下:

1481297610

397630378

1863264879

1210420568

1935123450

369539795

590202901

1718900954

1689058373

602269801

從運(yùn)行結(jié)果來看挤牛,這樣的方法進(jìn)行代碼塊同步莹痢,代碼的運(yùn)行效率是能夠得到提升,但是卻沒能保住線程的安全性【荷牛看來還得進(jìn)一步考慮如何解決此問題航瞭。

(4)、 Double Check Locking 雙檢查鎖機(jī)制(推薦)

為了達(dá)到線程安全坦辟,又能提高代碼執(zhí)行效率沧奴,我們這里可以采用DCL的雙檢查鎖機(jī)制來完成,代碼實(shí)現(xiàn)如下:

package org.mlinge.s05;

public class MySingleton {

//使用volatile關(guān)鍵字保其可見性

volatile private static MySingleton instance = null;

private MySingleton(){}

public static MySingleton getInstance() {

try {?

if(instance != null){//懶漢式

}else{

//創(chuàng)建實(shí)例之前可能會有一些準(zhǔn)備性的耗時(shí)工作

Thread.sleep(300);

synchronized (MySingleton.class) {

if(instance == null){//二次檢查

instance = new MySingleton();

}

}

}

} catch (InterruptedException e) {

e.printStackTrace();

}

return instance;

}

}

將前面驗(yàn)證多線程下執(zhí)行情況的MyThread類放入到org.mlinge.s05包下運(yùn)行长窄,執(zhí)行結(jié)果如下:

369539795

369539795

369539795

369539795

369539795

369539795

369539795

369539795

369539795

369539795

從運(yùn)行結(jié)果來看滔吠,該中方法保證了多線程并發(fā)下的線程安全性。

這里在聲明變量時(shí)使用了volatile關(guān)鍵字來保證其線程間的可見性挠日;在同步代碼塊中使用二次檢查疮绷,以保證其不被重復(fù)實(shí)例化。集合其二者嚣潜,這種實(shí)現(xiàn)方式既保證了其高效性冬骚,也保證了其線程安全性。

4懂算、使用靜態(tài)內(nèi)置類實(shí)現(xiàn)單例模式

DCL解決了多線程并發(fā)下的線程安全問題只冻,其實(shí)使用其他方式也可以達(dá)到同樣的效果,代碼實(shí)現(xiàn)如下:

package org.mlinge.s06;

public class MySingleton {

//內(nèi)部類

private static class MySingletonHandler{

private static MySingleton instance = new MySingleton();

}

private MySingleton(){}

public static MySingleton getInstance() {

return MySingletonHandler.instance;

}

}

以上代碼就是使用靜態(tài)內(nèi)置類實(shí)現(xiàn)了單例模式计技,這里將前面驗(yàn)證多線程下執(zhí)行情況的MyThread類放入到org.mlinge.s06包下運(yùn)行喜德,執(zhí)行結(jié)果如下:

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

從運(yùn)行結(jié)果來看,靜態(tài)內(nèi)部類實(shí)現(xiàn)的單例在多線程并發(fā)下單個(gè)實(shí)例得到了保證垮媒。

5舍悯、序列化與反序列化的單例模式實(shí)現(xiàn)

靜態(tài)內(nèi)部類雖然保證了單例在多線程并發(fā)下的線程安全性,但是在遇到序列化對象時(shí)睡雇,默認(rèn)的方式運(yùn)行得到的結(jié)果就是多例的萌衬。

代碼實(shí)現(xiàn)如下:

package org.mlinge.s07;

import java.io.Serializable;

public class MySingleton implements Serializable {

private static final long serialVersionUID = 1L;

//內(nèi)部類

private static class MySingletonHandler{

private static MySingleton instance = new MySingleton();

}

private MySingleton(){}

public static MySingleton getInstance() {

return MySingletonHandler.instance;

}

}

序列化與反序列化測試代碼:

package org.mlinge.s07;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

public class SaveAndReadForSingleton {

public static void main(String[] args) {

MySingleton singleton = MySingleton.getInstance();

File file = new File("MySingleton.txt");

try {

FileOutputStream fos = new FileOutputStream(file);

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(singleton);

fos.close();

oos.close();

System.out.println(singleton.hashCode());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

try {

FileInputStream fis = new FileInputStream(file);

ObjectInputStream ois = new ObjectInputStream(fis);

MySingleton rSingleton = (MySingleton) ois.readObject();

fis.close();

ois.close();

System.out.println(rSingleton.hashCode());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

運(yùn)行以上代碼,得到的結(jié)果如下:

865113938

1442407170

從結(jié)果中我們發(fā)現(xiàn)它抱,序列號對象的hashCode和反序列化后得到的對象的hashCode值不一樣秕豫,說明反序列化后返回的對象是重新實(shí)例化的,單例被破壞了观蓄。那怎么來解決這一問題呢混移?

解決辦法就是在反序列化的過程中使用readResolve()方法,單例實(shí)現(xiàn)的代碼如下:

package org.mlinge.s07;

import java.io.ObjectStreamException;

import java.io.Serializable;

public class MySingleton implements Serializable {

private static final long serialVersionUID = 1L;

//內(nèi)部類

private static class MySingletonHandler{

private static MySingleton instance = new MySingleton();

}

private MySingleton(){}

public static MySingleton getInstance() {

return MySingletonHandler.instance;

}

//該方法在反序列化時(shí)會被調(diào)用蜘腌,該方法不是接口定義的方法沫屡,有點(diǎn)兒約定俗成的感覺

protected Object readResolve() throws ObjectStreamException {

System.out.println("調(diào)用了readResolve方法饵隙!");

return MySingletonHandler.instance;

}

}

再次運(yùn)行上面的測試代碼撮珠,得到的結(jié)果如下:

865113938

調(diào)用了readResolve方法!

865113938

從運(yùn)行結(jié)果可知,添加readResolve方法后反序列化后得到的實(shí)例和序列化前的是同一個(gè)實(shí)例芯急,單個(gè)實(shí)例得到了保證勺届。

6、使用static代碼塊實(shí)現(xiàn)單例

靜態(tài)代碼塊中的代碼在使用類的時(shí)候就已經(jīng)執(zhí)行了娶耍,所以可以應(yīng)用靜態(tài)代碼塊的這個(gè)特性的實(shí)現(xiàn)單例設(shè)計(jì)模式免姿。

package org.mlinge.s08;

public class MySingleton{

private static MySingleton instance = null;

private MySingleton(){}

static{

instance = new MySingleton();

}

public static MySingleton getInstance() {

return instance;

}

}

測試代碼如下:

package org.mlinge.s08;

public class MyThread extends Thread{


@Override

public void run() {

for (int i = 0; i < 5; i++) {

System.out.println(MySingleton.getInstance().hashCode());

}

}

public static void main(String[] args) {

MyThread[] mts = new MyThread[3];

for(int i = 0 ; i < mts.length ; i++){

mts[i] = new MyThread();

}

for (int j = 0; j < mts.length; j++) {

mts[j].start();

}

}

}

運(yùn)行結(jié)果如下:

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

1718900954

從運(yùn)行結(jié)果看,單例的線程安全性得到了保證榕酒。

7胚膊、使用枚舉數(shù)據(jù)類型實(shí)現(xiàn)單例模式

枚舉enum和靜態(tài)代碼塊的特性相似,在使用枚舉時(shí)想鹰,構(gòu)造方法會被自動調(diào)用紊婉,利用這一特性也可以實(shí)現(xiàn)單例:

package org.mlinge.s09;

public enum EnumFactory{


?? ?singletonFactory;


?? ?private MySingleton instance;


?? ?private EnumFactory(){//枚舉類的構(gòu)造方法在類加載是被實(shí)例化

?? ??? ?instance = new MySingleton();

?? ?}


?? ?public MySingleton getInstance(){

?? ??? ?return instance;

?? ?}


}

class MySingleton{//需要獲實(shí)現(xiàn)單例的類,比如數(shù)據(jù)庫連接Connection

?? ?public MySingleton(){}

}

測試代碼如下:

package org.mlinge.s09;

public class MyThread extends Thread{


@Override

public void run() {

System.out.println(EnumFactory.singletonFactory.getInstance().hashCode());

}

public static void main(String[] args) {

MyThread[] mts = new MyThread[10];

for(int i = 0 ; i < mts.length ; i++){

mts[i] = new MyThread();

}

for (int j = 0; j < mts.length; j++) {

mts[j].start();

}

}

}

執(zhí)行后得到的結(jié)果:

1481297610

1481297610

1481297610

1481297610

1481297610

1481297610

1481297610

1481297610

1481297610

1481297610

運(yùn)行結(jié)果表明單例得到了保證辑舷,但是這樣寫枚舉類被完全暴露了喻犁,據(jù)說違反了“職責(zé)單一原則”,那我們來看看怎么進(jìn)行改造呢何缓。

8肢础、完善使用enum枚舉實(shí)現(xiàn)單例模式

不暴露枚舉類實(shí)現(xiàn)細(xì)節(jié)的封裝代碼如下:

package org.mlinge.s10;

public class ClassFactory{

private enum MyEnumSingleton{

singletonFactory;

private MySingleton instance;

private MyEnumSingleton(){//枚舉類的構(gòu)造方法在類加載是被實(shí)例化

instance = new MySingleton();

}

public MySingleton getInstance(){

return instance;

}

}

public static MySingleton getInstance(){

return MyEnumSingleton.singletonFactory.getInstance();

}

}

class MySingleton{//需要獲實(shí)現(xiàn)單例的類,比如數(shù)據(jù)庫連接Connection

public MySingleton(){}

}

驗(yàn)證單例實(shí)現(xiàn)的代碼如下:

package org.mlinge.s10;

public class MyThread extends Thread{


@Override

public void run() {

System.out.println(ClassFactory.getInstance().hashCode());

}

public static void main(String[] args) {

MyThread[] mts = new MyThread[10];

for(int i = 0 ; i < mts.length ; i++){

mts[i] = new MyThread();

}

for (int j = 0; j < mts.length; j++) {

mts[j].start();

}

}

}

驗(yàn)證結(jié)果:

1935123450

1935123450

1935123450

1935123450

1935123450

1935123450

1935123450

1935123450

1935123450

1935123450

驗(yàn)證結(jié)果表明碌廓,完善后的單例實(shí)現(xiàn)更為合理传轰。

以上就是本文要介紹的所有單例模式的實(shí)現(xiàn),相信認(rèn)真閱讀的讀者都已經(jīng)明白文章開頭所引入的那幾個(gè)問題了谷婆,祝大家讀得開心:-D路召!

---------------------

作者:mlinge-奮斗吧

來源:CSDN

原文:https://blog.csdn.net/cselmu9/article/details/51366946

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接波材!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末股淡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子廷区,更是在濱河造成了極大的恐慌唯灵,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隙轻,死亡現(xiàn)場離奇詭異埠帕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)玖绿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門敛瓷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斑匪,你說我怎么就攤上這事呐籽。” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵狡蝶,是天一觀的道長庶橱。 經(jīng)常有香客問我,道長贪惹,這世上最難降的妖魔是什么苏章? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮奏瞬,結(jié)果婚禮上枫绅,老公的妹妹穿的比我還像新娘。我一直安慰自己硼端,他們只是感情好撑瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著显蝌,像睡著了一般预伺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曼尊,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天酬诀,我揣著相機(jī)與錄音,去河邊找鬼骆撇。 笑死瞒御,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的神郊。 我是一名探鬼主播肴裙,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涌乳!你這毒婦竟也來了蜻懦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夕晓,失蹤者是張志新(化名)和其女友劉穎宛乃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸辆,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡征炼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躬贡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谆奥。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拂玻,靈堂內(nèi)的尸體忽然破棺而出酸些,到底是詐尸還是另有隱情宰译,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布擂仍,位于F島的核電站,受9級特大地震影響熬甚,放射性物質(zhì)發(fā)生泄漏逢渔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一乡括、第九天 我趴在偏房一處隱蔽的房頂上張望肃廓。 院中可真熱鬧,春花似錦诲泌、人聲如沸盲赊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哀蘑。三九已至,卻和暖如春葵第,著一層夾襖步出監(jiān)牢的瞬間绘迁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工卒密, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缀台,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓哮奇,卻偏偏與公主長得像膛腐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子鼎俘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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

  • 一哲身、wait--notify--sleep Object obj = new Object(); obj.wait...
    fe0180bd6eaf閱讀 331評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法贸伐,類相關(guān)的語法律罢,內(nèi)部類的語法,繼承相關(guān)的語法棍丐,異常的語法误辑,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 猶懼佳節(jié)至, 不見舊人旁歌逢。 靜時(shí)思音貌巾钉, 獨(dú)坐憶熱腸。 觥籌影交錯(cuò)秘案, 枯笑掩心霜砰苍。 何須夜入夢潦匈, 頰上淚兩行。
    海曲三少閱讀 229評論 6 4
  • 剛剛到手的新車上充滿了膠水味、皮革味吼旧、塑料味凰锡、煙味、汗味讓車主很頭痛圈暗,好像怎么除都除不盡掂为,開著真的很不舒服。沒關(guān)系...
    黃江水車?yán)邪?jiān)閱讀 373評論 0 0
  • 以文輔政员串,做不到這一點(diǎn)勇哗,再漂亮的文字也只能成為一堆廢紙。對這一點(diǎn)寸齐,或許無需多說欲诺,稍有常識的都懂得。問題在于...
    一行西去閱讀 169評論 2 1