0基础学java之Day29(单例模式、死锁)

server/2024/12/20 6:11:15/

单例模式

理解:在整个项目中,该类的实例只能有一个

1.饿汉式

  • 优点:线程安全

  • 缺点:浪费资源

public class A {
​private static A a = new A();private A(){}public static A getInstance(){return a;}public static void method(){System.out.println("好好学习,天天向上");}
​public static void main(String[] args) {//      A a1 = A.getInstance();
//      A a2 = A.getInstance();
//      
//      System.out.println(a1 == a2);//trueA.method();//哪怕调用方法也会创建对象开辟空间}

2.饱汉式

  • 优点:节约资源

  • 缺点:线程不安全

public class A {
​private static A a;private A(){}public static A getInstance(){if(a == null){a = new A();}return a;}public static void method(){System.out.println("好好学习,天天向上");}
}
​
​
public static void main(String[] args) {A a1 = A.getInstance();A a2 = A.getInstance();System.out.println(a1 == a2);//true//      A.method();}

3.双重校验

  • 优点:节约资源、线程安全

public class A {//创建一个对象的步骤:A a = new A();//1.创建对象空间,分配地址 -- new --> 0x001//2.调用构造方法,初始化成员变量//3.将对象地址赋值给引用//注意:创建对象的步骤有可能是1、2、3,也有可能是1、3、2//注意:使用volatile修饰的对象被创建的步骤必须是1、2、3
​private static volatile A a;private A(){}public static A getInstance(){if(a == null){synchronized (A.class) {if(a == null){a = new A();}}}return a;}public static void method(){System.out.println("好好学习,天天向上");}
​public static void main(String[] args) {A a1 = A.getInstance();A a2 = A.getInstance();System.out.println(a1 == a2);//true//      A.method();}    

死锁

  • 注意:死锁不一定每次都出现

  • 经验:尽可能避免锁嵌套

public class Test01 {
​public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {synchronized (KuaiZi.a) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (KuaiZi.b) {System.out.println("哲学家1发现了");}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (KuaiZi.b) {try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}synchronized (KuaiZi.a) {System.out.println("哲学家2发现了");}}}}).start();}
}
class KuaiZi{public static Object a = new Object();public static Object b = new Object();}

http://www.ppmy.cn/server/151635.html

相关文章

【C语言】头文件”“和<>的详解

前言 作者在刚开始学C语言的时候&#xff0c;都是用的< >去引用头文件&#xff0c;但在学习STM32的时候发现&#xff0c;程序中大量使用" "去引用双引号。 那么二者有什么区别呢? 无论使用哪种方式&#xff0c;头文件的目的都是为了引用你需要的文件供你编程使…

网络安全(5)_访问控制列表ACL

6. 访问控制列表ACL 6.1 标准访问控制列表 &#xff08;1&#xff09;标准ACL ①标准ACL是基于IP数据包的源IP地址作为转发或是拒绝的条件。即&#xff0c;所有的条件都是基于源IP地址的。 ②基本不允许或拒绝整个协议组。它不区分IP流量类型。如Telnet、UDP等服务。 &#…

工作与学习方向

从去年9月开始线上实习&#xff0c;实习了6个月。 今年6月开始工作&#xff0c;在临实习期被辞退。 现在又在新公司干了三个月。 工作中哪些点于我是重要的呢&#xff1f; 代码规范,比如命名规范&#xff0c;以及一些写程序时需要注意的点。 需要好好学习设计模式&#xff0c;虽…

什么是单页面应用,有哪些特点

单页面应用 (Single Page Applications, SPAs) 的定义与特点 一、定义 单页面应用&#xff08;Single Page Application&#xff0c;简称 SPA&#xff09;是一种 Web 应用程序类型&#xff0c;它在用户与应用交互时不会重新加载整个网页。相反&#xff0c;SPA 使用 JavaScrip…

Shell自定义(二)

1.Shell自定义 1.初始化 定义全局变量environ&#xff0c;把g_env的内容用memset初始化为0&#xff0c;这里用malloc开辟的空间为对应环境变量的长度1&#xff0c;多1位置是最后结束符0&#xff0c;strcpy把此时的对应的环境变量拷贝到g_env里面&#xff0c;下面是新增一个环…

利用PHP和phpSpider进行图片爬取及下载

利用PHP和phpSpider进行图片爬取及下载&#xff0c;可以遵循以下步骤。phpSpider是一个开源的PHP爬虫框架&#xff0c;它可以帮助你轻松地抓取网页内容。以下是一个基本的步骤指南&#xff1a; 1. 安装phpSpider 首先&#xff0c;你需要确保你已经安装了Composer&#xff08;…

四、使用langchain搭建RAG:金融问答机器人--构建web应用,问答链,带记忆功能

经过前面3节完成金融问答机器人基本流程&#xff0c;这章将使用Gradio构建web应用&#xff0c;同时加入memory令提示模板带有记忆的&#xff0c;使用LCEL构建问答链。 加载向量数据库 from langchain.vectorstores import Chroma from langchain_huggingface import HuggingF…

基于Spring Boot的水果蔬菜商城系统

一、系统概述 该系统主要适用于实体店的线上销售&#xff0c;旨在打造线上线下一体化的销售模式&#xff0c;带动水果蔬菜的销售量&#xff0c;提高店铺的销售额。系统前台主要面向用户&#xff0c;提供登录注册、首页展示、分类搜索、购物车、地址信息、个人信息、订单信息等…