懒汉式单例模式在多线程下问题的解决方法

news/2025/2/26 13:36:11
package demo8;

/**
 * @author xianyu
 * @version 1.0
 * @date 2020/4/20 14:30
 * 单例模式: 懒汉式单例模式
 */
public class singleInstance1 {
    public static void main(String[] args) {
        for (int i = 0; i < 1000; i++) {
            Thread t = new Thread(()->{
                Teacher.getInstance();
            });
            t.start();
        }
    }
}


class Teacher{

    // 1. 私有化构造器
    private Teacher(){
        System.out.println("**********调用构造器*********");
    }

    // 2. 提供一个私有的静态的该类的对象, 声明时未直接实例化
    private static Teacher instance;

    // 3. 提供一个静态的获取该类对象的方法,但是对于多线程有问题
    // 第一种解决方法:synchronized 同步方法
//    public static synchronized Teacher getInstance(){
//        if(instance == null){
//            instance = new Teacher();  // 懒汉式,等调用时才实例化对象
//        }
//        return instance;
//    }

     ///第二种解决方法,同步代码块
/*    obj 称为同步监视器,也就是锁,
    原理是:当线程开始执行同步代码块前,必须先获得对同步代码块的锁定。
    并且任何时刻只能有一个线程可以获得对同步监视器的锁定,
    当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。
    其中的锁,在非静态方法中可为this,
    在静态方法中为当前类本身(例如单例模式的懒汉式:singleInstance1.class)。*/

     public static Teacher getInstance(){
         // 二次判断提高效率
         // 这样的话就不用每次都执行同步代码块,只需第一次执行的时候比较占资源,
         // 以后的话就和之前的一样了
         if(instance == null){
             synchronized (singleInstance1.class){
                 if(instance == null){
                     instance = new Teacher();  // 懒汉式,等调用时才实例化对象
                 }
             }
         }
         return instance;
     }

}

http://www.niftyadmin.cn/n/1790995.html

相关文章

单链表归并排序

package demo8; /*** author xianyu* version 1.0* date 2020/4/20 12:11* 单链表的归并排序*/ public class mergeSort {public static void main(String[] args) {Node head new Node(7);head.next new Node(5);head.next.next new Node(3);head.next.next.next new Node…

shell基础DAY5

1、awk工具使用awk -F ‘字段分隔符’ ‘BEGIN&#xff5b;&#xff5d;模式匹配{动作} END&#xff5b;&#xff5d;’ 文件名转载于:https://blog.51cto.com/11044100/2333991

Python时间time模块介绍

一、明确时间元组 二、测试代码#!/usr/bin/env python # -- coding: utf-8 -- """ 时间模块&#xff0c;time的相关操作与测试 """ # python中time模块使用例子 import time# 1493368879.41&#xff0c;时间戳 print time.time()# 获取的是一个元…

P5072 [Ynoi2015]盼君勿忘

传送门 一开始理解错题意了……还以为是两个子序列相同的话只算一次……结果是子序列里相同的元素只算一次…… 对于一个区间\([l,r]\)&#xff0c;设其中\(x\)出现了\(k\)次&#xff0c;那么它的贡献就是它的权值乘上包含它的序列个数&#xff0c;即\(2^{r-l1}-2^{r-l1-k}\)&a…

css媒体查询

先来段代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>body{background-color: grey;}media only screen and (max-width: 960px) {body{background-color: red;}media only …

2018.12.25 区块链论文翻译

Blockchain and Cryptocurrency: A comparative framework of the main Architectural Drivers (CONICET, Argentina & Fidtech, Argentina) 区块链和加密货币&#xff1a;主要建筑驱动因素的比较框架 区块链是一种分散的交易和数据管理解决方案&#xff0c;是比特币和其他…

golang 内置函数new()

new() 这是一个用来分配内存的内置函数&#xff0c;它的第一个参数是一个类型&#xff0c;不是一个值&#xff0c;它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下&#xff1a; func new(t Type) *Type strut{} 直接使用struct{} 来初始化strut时&a…

Express 文档(Hello world)

Hello world 示例 下面的代码片段是你可以创建的最简单的Express应用程序&#xff0c;它是一个单一文件的应用程序 — 如果使用Express生成器&#xff0c;就不会得到这样的结果&#xff0c;Express生成器为一个完整的应用程序创建脚手架&#xff0c;其中包含大量JavaScript文件…