文章目录
单例模式
设计模式部分后续也会出,但是可能会比较晚,先鸽一下嘿嘿嘿,
首先来加深理解一下加锁的作用
单例模式作用:
能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例。(JDBC 中的 DataSource 实例就只需要一个)
单例模式实现方法
饿汉模式
类加载的同时, 创建实例
class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
懒汉模式
类加载的时候不创建实例. 第一次使用的时候才创建实例
懒汉模式单线程
public class 懒汉单线程 {
private static 懒汉单线程 instance = null;
private 懒汉单线程() {
}
public synchronized static 懒汉单线程 getInstance() {
if (instance == null) {
instance = new 懒汉单线程();
}
return instance;
}
}
仔细观察这段代码,好像没什么问题,但是如果在多线程的话,它其实线程不安全,那我们怎么修改呢?看下面:
懒汉模式多线程
public class 懒汉多线程 {
private static 懒汉多线程 instance = null;
private 懒汉多线程() {
}
public synchronized static 懒汉多线程 getInstance() {
if (instance == null) {
instance = new 懒汉多线程();
}
return instance;
}
}
没错就是你看到那样我们只需要添加synchronized关键字。
但是,众所周知,加锁 、 解锁是一件开销比较高的事情.,否则StringBuffer。。。而懒汉模式的线程不安全只是发生在首次创建实例的时候.,后续的使用,其实就 不必再进行加锁了,所以我们可以做如下修改:
public class 懒汉模式多线程改进 {
private static volatile 懒汉模式多线程改进 instance = null;
private 懒汉模式多线程改进() {
}
public static 懒汉模式多线程改进 getInstance() {
if (instance == null) {
synchronized (懒汉模式多线程改进.class) {
if (instance == null) {
instance = new 懒汉模式多线程改进();
}
}
}
return instance;
}
}
提问:为什么要这么设计?
解:首先我们要知道不安全的可能是因为多线程调用时,可能会有多个实例来getInstance(),那么我们就给他加锁,然后解决性能问题:外层判断使创建的实例只能有一个因为给他上锁了,但是内存可见性怎么保证呢,万一读缓存呢?所以我们给他加volatile,诺~,完美解决!!!
想必现在我们对单例模式的线程安全处理已经有了一定理解那么接下来:
阻塞式队列
首先顾名思义啦,队列队列了啦,当然遵循队列的先进先出的规则啦。
当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.
当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素.
阻塞队列的一个典型的开发模型:生产消费者模型,开发模型这个东西就也先鸽一下吧
当然俺会丢下