多线程案例

  • 🎥 个人主页:Dikz12
  • 📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香
  • 欢迎大家👍点赞✍评论⭐收藏

目录

单例模式 

饿汉模式 

 懒汉模式

阻塞队列

生产者-消费者模型意义 

 定时器


单例模式 

 单例模式就是,约定某个类,只能有一个实例,通过编码技巧,让编译器强制检查.(在类里以前创建好实例,用private修饰构造方法).  效果就跟 final , @Override一样.

饿汉模式 

饿汉模式代码实现,就只需要读取数据,多线程读,是线程安全的操作. (代码如下: )

class Singleton {//现在类的内部获得实例private static Singleton instance = new Singleton();// 后续如果想使用这个类的实例, 都通过 getInstance 方法来获取.public static Singleton getInstance() {return instance;}// 设置程私有的构造方法private Singleton() {}
}

 懒汉模式

相对于饿汉模式,就更加灵活,非必要不创建,减少了一些工作量,提高效率.但是,有收益的同时,肯定还会有风险 ,懒汉模式,既有读,也有写,就会涉及到线程不安全问题.

1.加锁. 这锁要加到什么位置合适.(涉及到修改操作只是在第一次实例化的时候会进行修改,后面都是读操作).

2.双重if,减少加锁次数.

3.解决指定重排序问题.

new 操作会涉及到指令重排序. new操作可以分为三步:

1) 申请内存空间

2)在内存空间构造对象

3) 把内存地址,赋值给引用

上诉三步,1)一定是先执行的, 哪种顺序对于单线程是没有影响的.  

而对于多线程就会出问题,当线程t1 按照 1) 3) 2)顺序执行,就可能会出现2)还没执行完的时候也,另一个线程t2,已经开始执行,instance == null 就会不成立,t2线程就拿到另一个非法对象.

class SingletonLazy {// 3.解决指定重排序 问题private static volatile SingletonLazy instance = null;public static SingletonLazy getInstance() {// 2.双重ifif (instance == null) {//1.synchronized (SingletonLazy.class) {if (instance == null) {instance = new SingletonLazy();}}}return instance;}private SingletonLazy() {}
}

阻塞队列

 是多线程代码中比较常用的一种数据结构. 也是一种特殊的队列.

1.线程安全

2.带有阻塞特性

    a)如果队列为空,继续出队列,就会阻塞等待,阻塞到其它线程往对列里添加元素

    b)如果队列为满,继续入队列,也会发生阻塞等待,阻塞到其它线程从队列中取走元素为止.

阻塞队列的最大意义,就是可以用来实现"生产者-消费者模型".

生产者-消费者模型意义 

 1.解耦合

2.削峰填谷 

class MyBlockingQueue {//队列大小private String[] date = new String[500];//队列头private volatile int head = 0;//队列下一个元素的位置private volatile int rear = 0 ;//队列个数private volatile int usedSized = 0;//入队public void put(String elem) throws InterruptedException {synchronized (this) {/*  if (usedSized == date.length) {//队列满了return;}*/while (usedSized == date.length) {//队列满了// return;// 如果是队列满, 继续插入元素, 就会阻塞this.wait();}date[rear] = elem;rear = (rear + 1) % date.length;usedSized++;this.notify();}}//出队public String take() throws InterruptedException {synchronized (this) {while (usedSized == 0) {//队列为空// return null;this.wait();}String ret = date[head];head = (head + 1) % date.length;usedSized--;this.notify();return ret;}}
}
public class Demo22 {public static void main(String[] args) {MyBlockingQueue queue = new MyBlockingQueue();//消费者Thread t1 = new Thread(() -> {while (true) {try {String ret = queue.take();System.out.println("消费元素:"+ret);Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}});//生产者Thread t2 = new Thread(() -> {int num = 1;while (true) {try {queue.put(num+"");System.out.println("生产元素"+num);num++;Thread.sleep(30);} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();t2.start();}
}

运行效果:

 定时器

约定一个时间,时间到达之后,开始执行某个代码的逻辑. 定时器是非常常见的,尤其是在网络通信的时候.

 在标准库里,也是有现成的定时器实现.

    public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("执行定时器任务!");}},5000);System.out.println("程序启动!");}

运行效果: 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479096.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux网络编程——序列反序列化

文章目录 0. 前言1. 认识协议2. 序列号与反序列化3. 自定义协议——网络计算器4. json 本章Gitee仓库:序列反序列化 0. 前言 tcp是面向字节流的,但是如何保证读取的数据是一个完整的报文呢? 管道也是面向字节流,写端写了一大堆的…

Redis篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 集群的主从复制模型是怎样的?三、Redis 集群会有写操作丢失吗?为什么?四、Redis 集群之间是如何复制的?五、Redis 集群最大节点个数是多少?前言 前些天发现了一个巨牛的人工智能学习网站,…

前端新手Vue3+Vite+Ts+Pinia+Sass项目指北系列文章 —— 第十二章 常用工具函数 (Utils配置)

前言 在项目开发中,我们经常会使用一些工具函数,也经常会用到例如loadsh等工具库,但是这些工具库的体积往往比较大,如果项目本身已经引入了这些工具库,那么我们就没有必要再引入一次,所以我们需要自己封装…

基于WOA优化的Bi-LSTM多输入回归预测(Matlab)鲸鱼算法优化双向长短期神经网络回归预测

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 鲸鱼优化算法(WOA): 双向长短期神经网络(Bi-LSTM)&#xff1a…

PCIe学习笔记(2)错误处理和AER/DPC功能

文章目录 PCIe ErrorAER (Advanced Error Reporting)DPC (Downstream Port Containment) 处理器上错误通常可分为detected和undetected error。Undetected errors可能变得良性(benign),也可能导致系统故障如silent data corruptions (SDC)。Detected errors则又可分…

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么?、能干什么?、怎么用? 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议,MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输&#xff0…

web基础及http协议 (二) apache

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache,存在C10K(10K connections)问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

关于计算机专业必看的几部电影

一些电影推荐: 《黑客帝国》(The Matrix):这是一部科幻动作片,探讨了虚拟现实、人工智能和计算机破解等主题。 《源代码》(Source Code):这是一部科幻惊悚片,讲述了一位士兵通过一种计算机程序,进入了一名…

阿里云幻兽帕鲁Windows 服务器怎么下载存档?

阿里云幻兽帕鲁Windows 服务器怎么下载存档?通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后,可以将压缩后的存档文件,拖动到 workbench\Download 目录后,就会触发浏览器的文件下载,然后将…

C++:构造函数

构造函数 1、与类名同名; 2、不具有任何类型,无返回值; 3、可以重载。 功能:一般用于初始化对象成员变量。 构造函数初始化成员变量: 1、this->成员变量 值; 2、初始化列表 一、普通构造函数 1、调用:Stu…

Go 是否有三元运算符?Rust 和 Python 是怎么做的?

嗨,大家好!本文是系列文章 Go 技巧第十四篇,系列文章查看:Go 语言技巧。 今天来聊聊在 Go 语言中是否支持三元运算符。这个问题很简单,没有。 首先,什么是三元运算符? 在其他一些编程语言中&a…

【Go语言】Go语言中的变量和常量

Go语言中的变量和常量 1 变量 变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 Go 语言是强类型静态语言,所以变量的声明与赋值方式与 PHP/Python 等动…