【Java并发编程三】多线程案例(手撕单例模式,阻塞队列,定时器,线程池)

目录

多线程案例

1.单例模式

饿汉模式

懒汉模式

2.阻塞队列

生产者消费者模型

阻塞队列的实现

3.定时器

标准库中的定时器

实现自己的定时器

4.线程池

标准库中的线程池

实现一个自己的线程池 


多线程案例

1.单例模式

单例模式是校招中最常考的设计模式之一。

啥是设计模式?
        设计模式好比象棋中的 " 棋谱 "。 红方当头炮 , 黑方马来跳 . 针对红方的一些走法 , 黑方应招的时候有一些固定的套路. 按照套路来走局势就不会吃亏 . 软件开发中也有很多常见的 " 问题场景 ". 针对这些问题场景 , 大佬们总结出了一些固定的套路 . 按照这个套路来实现代码, 能提高程序的整体下限
单例模式能保证某个类在程序中只存在唯一一份实例 , 而不会创建出多个实例。
单例模式具体的实现方式 , 有非常多种,本篇文章主要讲述“饿汉模式”和“懒汉模式”两种方法。
饿汉模式

饿汉模式即类加载的同时, 创建实例。

下面是饿汉模式的代码实现:

class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
   }
}
懒汉模式

懒汉模式在类加载的时候不创建实例,第一次使用的时候才创建实例。

懒汉模式的代码实现(单线程版本):

class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
       }
        return instance;
   }
}

上述懒汉模式的代码实现是线程不安全的。

        线程安全问题发生在首次创建实例时. 如果在多个线程中同时调用 getInstance 方法 , 就可能导致创建出多个实例。一旦实例已经创建好了, 后面在多线程环境调用 getInstance 就不再有线程安全问题了 ( 不再修改instance 了 )

 加上 synchronized 可以改善这里的线程安全问题。

class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public synchronized static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
       }
        return instance;
   }
}

上述代码还可以进行改进,加锁和解锁是一件开销比较高的事情. 而懒汉模式的线程不安全只是发生在首次创建实例的时候.因此后续使用的时候, 不必再进行加锁了.

同时为了避免 “内存可见性” 导致读取的 instance 出现偏差, 于是在第一行补充上 volatile。

在加锁的基础上, 做出了进一步改动:

  • 使用双重 if 判定, 降低锁竞争的频率.
  • 给 instance 加上了 volatile.
class Singleton {
  private static volatile Singleton instance = null;
  private Singleton() {}
  public static Singleton getInstance() {
    if (instance == null) {//判断 instance 实例是否创建出来,如果有,说明已经是单例了,这个 if 是防频繁加锁解锁的
      synchronized (Singleton.class) {
     if (instance == null) {//多个线程获得这把锁,只有第一个获得锁的对象才会创建实例对象,这个 if 是防多线程的
       instance = new Singleton();
       }
     }
   }
    return instance;
 }
}

2.阻塞队列

阻塞队列是一种特殊的队列

你可能感兴趣的:(Java并发编程,java,单例模式,开发语言,后端,笔记)