----------------------单例---单例模式--------------------

* a:什么是单例?
* 单例就是某个类在项目运行的生命周期中 永远只有一个实例
* b:单例和单例模式的区别?
* 单例模式是实现单例的方法之一
*
* 你学过的spring中每个被管理bean默认是单例的 它是否使用了单例模式?
* 没有使用单例模式
* <bean id="xxx" class="bean的全名称">.....


* c:什么是单例模式?
* 如何以下3点的才是使用了单例模式
* 类本身的构造方法必须私有
* 类本身提供一个自己的实例
* 必须对外提供一个可以访问这个唯一实例的方法


* d:单例模式的分类
* 饿汉式
* 懒汉式
*
* e:单例模式的线程安全问题

 

代码说明:

*<饿汉式>:

public class SendURL {

//类本身提供一个自己的实例
private static SendURL instance = new SendURL();

//类本身的构造方法必须私有
private SendURL() {}

//必须对外提供一个可以访问这个唯一实例的方法
public static SendURL getInstance() {
return instance;
}
}

 

*懒汉式

//懒汉式
public class SendURL {

//类本身提供一个自己的实例
//volatile是把创建SendURL对象instance的过程变成原子性
private volatile static SendURL instance = null;

//定义一个可并发处理的缓冲队列
public static BlockingQueue<String> urlcache = new LinkedBlockingQueue<String>();

//类本身的构造方法必须私有
private SendURL() {}

//必须对外提供一个可以访问这个唯一实例的方法
public static SendURL getInstance() {

if (instance==null) {
//t1 t2 t3
synchronized (SendURL.class) {
if (instance==null) {
//控制单例
instance = new SendURL();

//开始执行send方法 一次执行 一直执行
//监控url缓冲队列
//send();

//创建一个单线程池 启动send方法
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {

@Override
public void run() {
//保证调用send方法
send();

}
});
}
}

}
return instance;
}

//把待发送的url放入url缓冲队列 等待发送
public static void addURL(String url) {
//urlcache.add(url);
getInstance().urlcache.add(url);
}

//执行发送url
public static void send() {
//1:从urlcache中拿一个待发送的url
String url = null;
while (true) {

try {
url = urlcache.take();
if (url!=null) {
//代码执行到这里 说明拿到了一个待发送的url
//2:发送url到nginx服务器
RequestUtil.doGet(url);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}
}

 

posted @ 2019-06-05 19:38  wuyingying  阅读(93)  评论(0编辑  收藏  举报