Java中有6大设计原则&饿汉式单例模式&懒汉式单例模式&生产者和消费者模式

手把手教你学Simulink——基于重复控制(RC)的并网逆变器场景实例:基于RC的单相并网逆变器仿真 本次教程深入剖析了重复控制(RC)在单相并网逆变器中的应用,解决了周期性谐波抑制这一核心难题。核心收获RC是谐波抑制的“核武器”:它利用内模原理,对所有周期性谐波提供无限大增益,实现理论上无静差的跟踪和抑制。PI+RC是黄金组合:PI提供快速响应,RC提供稳态精度,二者结合,兼顾了动态与稳态性能。结构简单,效果卓越:相比多个PR控制器,RC仅需一个模块,即可抑制所有谐波,设计简洁。电能质量的终极追求,是波形的纯净。重复控制,如同一位不知疲倦的校对员它记住每一次错误(上一周期的误差), 阅读详情

Java中有6大设计原则,23种设计模式.还有一种,有人归纳为设计原则,有人归纳为设计模式.

1.设计原则(扩展):前人经过经验的总结出写Java代码的规则,平时写代码遵循这些规则,写出代码就规范性好.java要求程序高内聚低耦合.

内聚性:独立性.

耦合度:依赖性.

1.1:单一职能原则:一个类只做一件事.

作用:提高程序内聚性,降低程序耦合度.

1.2:里氏替换原则:所有使用父类父接口的地方,都可以用子类去替换.

作用:提高程序可扩展性.

1.3:依赖倒置原则:能依赖抽象的就不依赖于具体的.

作用:提高程序可扩展性.

1.4:接口隔离原则:一个接口只被设计一种功能.

作用:提高程序灵活性和可扩展性.

1.5:迪米特原则:一个对象应该对其他对象保持最少的了解.

作用:提高程序内聚性,降低程序耦合度.

1.6:开闭原则:对扩展开发,对修改关闭.

作用:提高程序的可维护性.

2.设计模式:前人经过项目经验的总结,总结出对特定问题的特定解决方案.

3.单例模式:一个类只有一个对象.

优点:减少频繁创建对象所消耗系统资源.

实现方式:私有化构造方法,声明私有静态当前对象变量,给他提供一个公有的静态的获得对象的方法.

3.1:饿汉式单例模式:相懒汉式单例模式来说,优点:在多线程中使用安全.缺点:耗系统资源.

eg:public class King {
	private String sname;
	private int wifeCount;
	
	/**
	 * 私有化构造方法
	 */
	private King() {
		
	}
	
	/**
	 * 声明私有这个类的对象变量
	 */
	private static King k1=new King();
	
	/**
	 * 公有的静态获得对象的方法
	 * @return
	 */
	public static King getKing() {
		return k1;
	}
	
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public int getWifeCount() {
		return wifeCount;
	}
	public void setWifeCount(int wifeCount) {
		this.wifeCount = wifeCount;
	}
}

3.2:懒汉式单例模式:相对于饿汉式单例模式:优点:不耗资源.缺点在多线程中使用不安全.如果想在多线程中使用就用线程同步.

eg:public class Boss {
	private String name;
	private double money;
	
	/**
	 * 私有构造方法
	 */
	private Boss() {
		
	}
	
	/**
	 * 私有的静态的对象的变量
	 */
	private static Boss b1;
	
	/**
	 * 公有的静态的获得对象的方法
	 * @return Boss
	 */
	public synchronized static Boss getBoss() {
		if (b1==null) {
			b1=new Boss();
		}
		return b1;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getMoney() {
		return money;
	}
	public void setMoney(double money) {
		this.money = money;
	}
}

4.生产者和消费者模式:如果没有商品,生产者就要生产商品,如果有商品,生产者必须等待,等待这个商品被消费才能再生产.如果没有商品,消费者就要等待;如果有商品,消费者就要消费商品.

优点:安全性高.

缺点:效率低.

注意:监视器要监视所有线程,所以一般要是所有线程共用的一个对象,而我们的锁对象刚好是监视所有的线程,所以可以用锁对象作监视器来监视所有线程.

eg:public class Goods {
	private int gid;
	private String gname;
	
	@Override
	public String toString() {
		return "Goods [gid=" + gid + ", gname=" + gname + "]";
	}
	
	public int getGid() {
		return gid;
	}
	/**
	 * 实现商品编号自增
	 */
	public void setGid() {
		this.gid++;
	}
	public String getGname() {
		return gname;
	}
	public void setGname(String gname) {
		this.gname = gname;
	}
}
public class Consumer implements Runnable{
	//声明商品变量
	public Goods g;
	
	/**
	 * 通过构造方法将商品对象传过来
	 * @param g
	 */
	public Consumer(Goods g) {
		this.g=g;
	}

	/**
	 * 消费者的任务方法
	 */
	@Override
	public void run() {
		while (true) {
			synchronized (Test2.ob2) {
				//判断商品是否存在
				if (Test2.flag==false) {//商品不存在,
					try {
						//等待
						Test2.ob2.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}else {//商品存在,消费
					System.out.println(Thread.currentThread().getName()+"在消费"+this.g);
					//改变商品标记
					Test2.flag=false;
					//唤醒所有生产者
					Test2.ob2.notifyAll();
				}
			}
		}
	}
}
public class Producer implements Runnable{
	//声明商品变量
	public Goods g;

	/**
	 * 用构造方法将商品对象传过来
	 * @param g
	 */
	public Producer(Goods g) {
		this.g=g;
	}

	/**
	 * 生产者的任务方法
	 */
	@Override
	public void run() {
		while (true) {
			
			synchronized (Test2.ob2) {
				//判断商品是否存在
				if (Test2.flag==false) {//商品不存在,生产商品
					//生产商品
					this.g.setGid();
					this.g.setGname("衣服");
					System.out.println(Thread.currentThread().getName()+"在生产"+this.g);
					//改变商品标记
					Test2.flag=true;
					//唤醒所有消费者去消费
					Test2.ob2.notifyAll();
				}else {//商品存在
					try {
						Test2.ob2.wait();//让当前所有生产者来等待
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
			if (this.g.getGid()==100) {
				break;
			}
		}
	}
}
public class Test2 {
	/**
	 * 声明一个变量作标记,标记当前的商品是否存在
	 */
	public static boolean flag=false;//默认不存在
	/**
	 * 创建一个生产者锁对象,也作为生产者监视器,监视器要监视所有对象
	 */
	public static Object ob2=new Object();
	
	public static void main(String[] args) {
		//声明一个商品对象
		Goods g=new Goods();
		
		//创建生产者任务对象
		Producer p1=new Producer(g);
		
		//创建三个生产者
		Thread t1=new Thread(p1, "张三1");
		Thread t2=new Thread(p1, "张三2");
		Thread t3=new Thread(p1, "张三3");
		
		//创建消费都任务对象
		Consumer c1=new Consumer(g);
		
		//创建三个消费者
		Thread t4=new Thread(c1, "李四1");
		Thread t5=new Thread(c1, "李四2");
		Thread t6=new Thread(c1, "李四3");
		
		//启动线程
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		t5.start();
		t6.start();
	}
}

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制 控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。 阅读详情

相关推荐

立创开源桌面激光雕刻机DIY全解析:从悬臂结构、Arduino主控到Marlin固件

本文详细解析了基于立创开源平台的桌面激光雕刻机DIY全过程。重点介绍了悬臂式机械结构的设计与优化,阐述了采用Arduino Mega 2560主控与RAMPS 1.4扩展板的经典控制方案,并深入讲解了Marlin固件的关键配置步骤,包括电机步数计算与激光功能启用,为创客和电子爱好者提供了一套完整的从硬件搭建到软件调试的实战指南。

weixin_42510201的博客 387

24.设计模式

1.设计原则(扩展): 前人经过经验的总结出写Java代码的规则,平时写代码遵循这些规则,写出代码就规范性好.java要求程序高内聚低耦合. 内聚性:独立性. 耦合度:依赖性. 1.1:单一职能原则:一个类一做一件事. 作用:提高程序内聚性,降低程序耦合度. 1.2:里氏替换原则:所有使用父类父接口的地方,都可以用子类去替换. 作用:提高程序可扩展性. 1.3:依赖倒置原则:能依赖抽象的就不依赖于具体的. 作用:提高程序可扩展性. 1.4:接口隔离原则:一个接口只被设计一种功能.

qq_44949002的博客 206

OpenClaw(原Clawdbot/Moltbot)本地部署快速指南

支持Telegram、Slack、Discord、iMessage等多平台接入,通过配置文件或环境变量填写对应平台的Token,配置后执行。支持对接OpenAI、Anthropic、阿里云百炼等云端模型,也可搭配Ollama使用本地模型。默认仅允许已配对用户交互,群聊场景建议开启Docker沙箱模式,在配置文件设置。执行后跟随指引确认安全说明,进入QuickStart模式,默认网关端口为。可查看已加载模型,通过绑定的通讯通道发送测试指令,响应正常即部署完成。,限制非主会话操作权限,提升安全性。

wukangjupingbb的博客 8479

如何写好一个Java方法?

什么样的方法才是最好的方法 要回答这个问题,我们首先要确定的是我们需要什么样子的方法。无论我们出于什么样子的目的产生对方法的需求,我可以说精准地满足我们需求的方法就是好方法。精准的含义是不过也不少。 那么我们需要什么样的方法呢?就我个人的理解而言,我们对于方法的需求源于软件系统本身,系统是为需求服务的,而方法则为系统服务。所以我们的方法是为了更好地实现需求。那么对于项目需求而言,能够满足需求的设计、实现、迭代的方法就是最好的方法。但往往在进行代码开发时候,我们更关注的是功能上线,从而忽略了后续的迭代部分(当

蜜糖的代码注释 724

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4540

快速卷积结构FIR数字滤波器的设计与ARM平台实现

本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。

huanghm88的专栏 125

JAVA设计模式-单例模式

在java面试过程中(当然了,不能只是出于面试的目的去学设计模式,要做一个有理想的程序员),设计模式是一定会问到的一环,而其中的单例模式因为比较简单,而且设计到的面比较广,线程安全、内存模型、类加载机制、反射等基础知识,比较好拿出来考察面试者。 ...

wdquan19851029的专栏 1302

【DaVinci Developer专题】-41-APP SWC如何读取写入NVM Block数据

APP SWC Port如何Read读取/Write写入NVM Block数据; DaVinci Developer中的Calibration Parameter/Per-Instance Memory/Service Need如何配置。

「汽车电子助手」的博客 4485

程序设计原则——优化程序

1.类的设计和接口 类的设计好坏可以从一些方面看出,比如:能否方便地添加新的接口,维护是否简单。 如果说一个程序能用,但是要添加新功能时就很困难,甚至需要把整个程序重写,那么它在设计时肯定出现了问题。 ...

z2431435的博客 941

企业合规审查系统开发实战:基于知识图谱与深度学习的智能引擎构建(附完整Python代码)

动态合规监测:实时追踪法规变化并更新知识库智能合约审计:区块链智能合约的自动合规检查跨域知识融合:整合财务、法律、业务多维度数据可解释性增强:基于Attention机制生成合规审查依据。

理论都是虚的,代码才是王道。 456

第1章第11节:创建可容纳多行滚动文字的输入框TextEditor [SwiftUI快速入门到实战]

TextField可以让用户输入单行的文字内容,若想输入多行的文字内容,可以使用能够容纳多行滚动文字的 TextEditor。 定义一个字符串属性,用来存储用户输入的文字内容。接着定义一个布尔属性,用来标识是否弹出警告窗口,以显示用户输入的内容。 TextEditor是由UIKit中的UITextView演变而来,因此可以在init方法中,通过UITextView修改TextEditor的外观属性。 添加一个VStack视图,作为子视图的容器。 创建一个TextEditor,Te..

互动教程网[www.hdjc8.com] 832

程序设计-高内聚低耦合原则

高内聚:如果类中的方法是一组相关的行为,则称该类是高内聚的,反之成为低内聚的。高内聚便于类的维护,而低内聚不利于类的维护。迭代器模式中,对于高内聚低耦合原则的使用会有很好的解释。低耦合:就是尽量不要让一个类有太多其他类的实例引用,以避免修改系统的其中一部分会影响到其他部分,中介者模式中,就会体会到这个低耦合原则的必要性。...

zw3413的专栏 2422

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【设计模式】单例模式和生产者消费者模型

使用Java语言来描述编程设计模式中的单例模式和生产者消费者模式。附有详细的代码解析。

yican2580的博客 839

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列

对框架和设计模式的简单理解就是,这两者都是“大佬”设计出来的,让即使是一个代码写的不太好的“菜鸡程序员”也能写出还可以的代码。设计模式也可以认为是对编程语言语法的补充。此处提到的“单例模式”就是一种设计模式。

Hacynn的博客 1814

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

多线程下的单例模式、生产者、消费者模式

单例模式 之前有一个博客简述了单例模式,这里就不具体介绍了 单例模式的实现方式:懒汉式和饿汉式 其中,懒汉式是线程不安全的,当有多条线程同时访问单例对象时,则会出现多线程临界资源问题 多线程下的懒汉式 package waking.test.xcms; /** * 多线程下的单例模式 * 懒汉式 * @author waking * */ import java.util.Hash...

weixin_43688349的博客 1878

JavaEE初级 多线程案例(单例模式、阻塞队列、线程池、定时器)

多线程中单例模式中饿汉式和懒汉式在多线程下线程安全,以及对阻塞队列、线程池以及定时器介绍

2401_89019969的博客 1246

Java 单例模式 、 生产者消费者 、 网络编程

1. 单例模式 package Test; /** * 1 编写多线程环境下较安全的单例模式(懒汉模式) * * 单列模式 : 让某个类只创建一个对象,可以避免垃圾回收问题 * * 实现方式 : * 1. 实例化对象 , 需要调用构造方法 ,想要控制创建对象啊的数量, * 第一步就是不能让别人创建对象,就意味着不能让别的类访问构造方法 构造方法私有化 * 2. 提供一个用于获取当前类对象的静态方法

qq_58765786的博客 304

线程安全版本的单例设计模式 与 生产者消费者模型简介

包含单例设计模式的线程安全版本,生产者消费者原理和应用以及阻塞队列的介绍

小S的博客 611

javaEE:多线程,单列模式和生产者消费者模型

单例模式确保类只有一个实例并提供全局访问点,包括饿汉式(立即创建)和懒汉式(延迟创建)。懒汉式需解决线程安全问题,通过双重检查锁定和volatile避免指令重排。阻塞队列支持线程安全的put/take操作,满或空时自动阻塞。手动实现可使用ReentrantLock和Condition管理不同阻塞条件,确保线程安全。

2503_90262217的博客 1155

并发模式(生产者/消费者;单例模式;不变模式)

文章目录生产者与消费者模式(线程同步,通信)Object方式实现生产者消费者模式ReentranLock实现生产者与消费者单例模式(并发中如何实现安全的并发)饿汉式懒汉式DCL(double checking )枚举单例(线程安全,调用效率高,不能延时加载)推荐不变模式(这是绝对安全的并发)介绍如何实现Jdk中的实现Future模式(异步模式) 在并发中,有一些经典的模式,我们可以学习下 生产者与消费者模式(线程同步,通信) 面试时,有可能要手写生产这与消费者模式 可以使用原生的Object.wai

ZHOUJIAN_TANK的博客 392

单例模式与生产者消费者模式的实现与应用

本文介绍了两种常见的设计模式:单例模式和生产者消费者模式。单例模式通过饿汉式(类加载时创建实例)和懒汉式(延迟加载+双重检查锁)实现线程安全的单例对象。生产者消费者模式通过阻塞队列解耦生产者和消费者,平衡系统负载,并详细展示了使用Java标准库BlockingQueue和自定义阻塞队列的实现方式,包括队列满/空时的等待机制和线程间通信的notify操作,适用于秒杀等高并发场景的请求缓冲。

qq_71356343的博客 219

JAVA入门—————线程协调 AND 懒汉饿汉单例模式

线程协调 void wait ()——在其他线程调用此对象的 notify () 方法或 notifyAll () 方法前,导致当前线程等待。 void wait (long timeout)——在其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者超过指定的时间量前,导致当前线程等待。 若没有唤醒 则线程一直等待… void notify ()——唤醒在此对...

qq_45673367的博客 191

java线程安全-单例模式-线程通信

虚拟机会保证一个类的()方法在多线程环境中被正确地加锁、同步,如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的()方法,其他线程都需要阻塞等待,直到活动线程执行()方法完毕。假设开始线程0进入,判断singleton为空,在将要创建实例时,cpu切换,线程1又进来了,同样singleton为空 创建了实例,这是cpu切换回来到0线程,继续创建实例。饿汉式是在类加载的时候创建实例,故不存在线程安全问题。可见,经过分析共创建了 两个实例,还谈什么单例。首先我们先来回顾一下。

qq_33406021的博客 458

掌握 Java 并发编程中的线程安全设计模式

通过Object的wait和notifycount++;count--;i < 10;i < 10;try {此方式需手动控制线程等待与唤醒,适用于对同步逻辑有更高定制需求的场景。Java 并发编程中的线程安全设计模式是解决多线程问题的有效工具。单例模式确保实例唯一性与线程安全,生产者 - 消费者模式实现任务异步解耦,线程池模式优化线程资源管理,读写锁模式提升读多写少场景的性能。

潜意识Java的博客 1053

设计模式面经

设计模式

FYPPPP的博客 704

单例模式的几种实现方式总结

单例模式可能是设计模式中最容易理解,应用最广泛的模式。单例模式虽然简单,但其中的坑却不少,尤其是线程安全方面的问题。本文主要对单例的各种写法做个小结,并分析其优缺点。模式定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 在Java中,单例模式的实现分两种,一种称为懒汉式,一种称为饿汉式,其实就是在具体创建对象实例的处理上,有不同的实现方式。代码实现1、懒汉式实现当被问到要实现一个单例

Ricky 2286
上一篇: 线程(线程中常用方法)
下一篇: 多线程练习题&多线程模拟龟兔赛跑
Java_LXM
博客等级 码龄7年 39粉丝 32原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值