JavaEE--线程基础(中)


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


volatile 修饰的变量, 能够保证 “内存可见性”
在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
上述过程的完整代码如下:

public class Demo14 {//使用locker对象负责加锁,wait,notifyprivate static Object locker=new Object();public static void main(String[] args) {Thread t1=new Thread(() ->{while(true){synchronized (locker){System.out.println("t1 wait开始");try {locker.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("t1 wait结束");}}});t1.start();Thread t2=new Thread(() ->{while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (locker){System.out.println("t2 notify开始");locker.notify();System.out.println("t2 notify结束");}}});t2.start();}
}

其中,我们观察到notify的开始和结束的过程是非常快的


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


下面介绍代码案例

在这里插入图片描述

在这里插入图片描述****
饿汉模式
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


懒汉模式
类加载的时候不创建实例. 第一次使用的时候才创建实例.
因为只有使用getInstance的时候,才会new出来一个对象;而在饿汉模式下,instance被当做一个类的属性,在类的加载的时候就被创建了。

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
上述过程的完整代码如下:

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;//生产者消费者模型
public class Demo18 {public static void main(String[] args) {//建一个阻塞队列,作为交易场所BlockingDeque<Integer> queue=new LinkedBlockingDeque<>();//一个线程负责生产Thread t1=new Thread(() ->{int count=0;while(true){try {queue.put(count);System.out.println("生产的元素为:"+count);count++;Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});//一个线程负责消耗Thread t2=new Thread(() ->{while(true){try {Integer n=queue.take();System.out.println("消耗的元素为:"+n);} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();t2.start();}
}

阻塞队列的模拟实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面首先实现一般的队列
在这里插入图片描述
上述过程的代码如下:

class MyBlockingQueue{//使用循环队列来表示这个阻塞队列private String[] items=new String[1000];//队列的头部int head=0;//tail:队列的尾部的下一个元素. 总的来说, 队列中有效元素的范围 [head, tail)// 当 head 和 tail 相等(重合), 相当于空的队列.int tail=0;//size表示队列当前的元素个数int size=0;public void put(String elem){if(size>=items.length){//队列满return;}items[tail]=elem;tail++;if(tail>= items.length){tail=0;}size++;}public String take(){if(size==0){return null;}String elem=items[head];head++;if(head>= items.length){head=0;}size--;return elem;}
}
public class Demo19 {public static void main(String[] args) {MyBlockingQueue queue=new MyBlockingQueue();queue.put("aaa");queue.put("bbb");queue.put("ccc");queue.put("ddd");String elem= queue.take();System.out.println("elem="+elem);elem= queue.take();System.out.println("elem="+elem);elem= queue.take();System.out.println("elem="+elem);}
}

在这里插入图片描述

考虑线程安全性在这里插入图片描述


在这里插入图片描述

实现阻塞
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


上述实现过程的最终代码如下:

class MyBlockingQueue{//使用循环队列来表示这个阻塞队列private String[] items=new String[10];//队列的头部volatile int head=0;//tail:队列的尾部的下一个元素. 总的来说, 队列中有效元素的范围 [head, tail)// 当 head 和 tail 相等(重合), 相当于空的队列.volatile int tail=0;//size表示队列当前的元素个数volatile int size=0;public void put(String elem) throws InterruptedException {synchronized (this){while(size>=items.length){//队列满//return;this.wait();}items[tail]=elem;tail++;if(tail>= items.length){tail=0;}size++;this.notify();}}public String take() throws InterruptedException {synchronized (this){while(size==0){// return null;this.wait();}String elem=items[head];head++;if(head>= items.length){head=0;}size--;this.notify();return elem;}}
}
public class Demo19 {public static void main(String[] args) {
/*    MyBlockingQueue queue=new MyBlockingQueue();queue.put("aaa");queue.put("bbb");queue.put("ccc");queue.put("ddd");String elem= queue.take();System.out.println("elem="+elem);elem= queue.take();System.out.println("elem="+elem);elem= queue.take();System.out.println("elem="+elem);*///创建两个线程,表示生产者和消费者MyBlockingQueue queue=new MyBlockingQueue();Thread t1=new Thread(() ->{int count=0;while (true){try {queue.put(count + "");} catch (InterruptedException e) {e.printStackTrace();}System.out.println("生产"+count);count++;try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});Thread t2=new Thread(() ->{while (true){String elem= null;try {elem = queue.take();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("消耗"+elem);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}});t1.start();t2.start();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【前段基础入门之】=>HTML结构进阶【列表;表格;表单】

前言 在上一章节中&#xff0c;我们学习了讲述了 html 中的一些常用排版标签&#xff0c;以及一些文本标签和超链接等相关知识。本章节将重点给大家带来 HTML 中【列表&#xff0c;表格&#xff0c;表单】的使用讲解。 目录 列表有序列表无序列表自定义列表 表格表格的基本结构…

为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

Kubernetes中Pod的扩缩容介绍

Kubernetes中Pod的扩缩容介绍 在实际生产系统中&#xff0c;我们经常会遇到某个服务需要扩容的场景&#xff0c;也可能会遇到由于资源紧张或者工作负载降低而需 要减少服务实例数量的场景。此时可以利用 Deployment/RC 的 Scale 机制来完成这些工作。 Kubernetes 对 Pod 的扩…

opencv形状目标检测

1.圆形检测 OpenCV图像处理中“找圆技术”的使用-图像处理-双翌视觉OpenCV图像处理中“找圆技术”的使用,图像处理,双翌视觉https://www.shuangyi-tech.com/news_224.htmlopencv 找圆心得&#xff0c;模板匹配比霍夫圆心好用 - 知乎1 相比较霍夫找直线算法&#xff0c; 霍夫找…

如何安全传输存储用户密码?(程序员必备)

前言 我们开发网站或者APP的时候&#xff0c;首先要解决的问题&#xff0c;就是「如何安全传输和存储用户的密码」。一些大公司的用户数据库泄露事件也时有发生&#xff0c;带来非常大的负面影响。因此&#xff0c;如何安全传输存储用户密码&#xff0c;是每位程序员必备的基础…

[NLP] LLM---<训练中文LLama2(三)>对LLama2进行中文预料预训练

预训练 预训练部分可以为两个阶段&#xff1a; 第一阶段&#xff1a;冻结transformer参数&#xff0c;仅训练embedding&#xff0c;在尽量不干扰原模型的情况下适配新增的中文词向量。第二阶段&#xff1a;使用 LoRA 技术&#xff0c;为模型添加LoRA权重&#xff08;adapter&…

Apache Hive安装部署详细图文教程

目录 一、Apache Hive 元数据 1.1 Hive Metadata 1.2 Hive Metastore 二、Metastore 三种配置方式 ​2.1 内嵌模式 ​2.2 本地模式 ​2.3 远程模式 ​三、Hive 部署实战 3.1 安装前准备 3.2 Hadoop 与 Hive 整合 3.3 远程模式安装 3.3.1 安装 MySQL 3.3.2 …

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…

干货 | 基于深度学习的生态保护红线和生态空间管控区域内开发建设活动识别...

以下内容整理自2023年夏季学期大数据能力提升项目《大数据实践课》同学们所做的期末答辩汇报。 一、背景需求 本研究主要针对江苏省典型生态保护区域&#xff0c;通过计算机语义分割和变化检测的技术方法&#xff0c;以实现生态保护区内违法违规开发建设活动的智能监控。 项目的…

MQ - 01 消息队列发展史MQ通用架构

文章目录 导图PreMQ 发展史消息队列的发展脉络MQ选型考虑因素消息 和 流消息队列的架构和功能什么情况下会使用消息队列?架构和功能的基本概念架构层面的基本概念功能层面的基本概念4款主流消息队列的区别和建议对比图导图 Pre MQ - 闲聊MQ一二事儿

【WSN】基于蚁群算法的WSN路由协议(最短路径)消耗节点能量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL主从复制与读写分离(附配置实例)

目录 一、主从复制1.1 什么是主从复制&#xff1f;1.2 MySQL支持的复制类型1.3 主从复制的工作过程1.4 主从复制的同步模式1.4.1 异步复制&#xff08;Asynchronous replication&#xff09;1.4.2 全同步复制&#xff08;Fully synchronous replication&#xff09;1.4.3 半同步…

Floyd算法基础

弗洛伊德算法(Floyd) 之前介绍了迪杰斯特拉算法(Dijkstra)。具体请看&#xff1a;最短路径算法——简单明了的迪杰斯特拉算法(Dijkstra)。Dijkstra适用于非负权图&#xff0c;并且一次只能从网络中找源点到任何一个节点的最短路径&#xff0c;而Floyd算法的应用更加广泛&#…

docker openjdk:8-jdk-alpine 修改时区、添加字体

新建Dockerfile文件&#xff0c;制作新镜像 FROM openjdk:8-jdk-alpine 1、解决字体问题 RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* 2、解决时差问题 # 解决时差8小时问题ENV TZAsia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /et…

postgresql-触发器

postgresql-触发器 触发器概述创建触发器管理触发器删除触发器事件触发器创建事件触发器修改触发器删除事件触发器 触发器概述 PostgreSQL 触发器&#xff08;trigger&#xff09;是一种特殊的函数&#xff0c;当某个数据变更事件&#xff08;INSERT、UPDATE、 DELETE 或者 TR…

Java关于AbstractProcessor的使用

文章目录 Step1 项目准备Step2 开发一个自定义的AbstractProcessorStep3 Debug AbstractProcessor替换源码内容运行SpringBoot应用测试源码内容是否成功替换 背景&#xff1a;我们都知道&#xff0c;在正常情况下&#xff0c;我们无法去变更二方&#xff0c;三方包中源码的Java…

在 React 表单开发时,有时没有必要使用State 数据状态

说到在React中处理表单&#xff0c;最流行的方法是将输入值存储在状态变量中。遵循这种方法的原因之一是因为毕竟它是React&#xff0c;每个人都倾向于使用它附带的hooks。使用hooks可以解决React中的许多问题&#xff0c;但是在处理表单时是否必需呢&#xff1f;让我们来看看。…

前端框架之争:Vue.js vs. React.js vs. Angular

文章目录 Vue.js - 渐进式框架的魅力简单易用组件化开发生态系统和工具适用场景 React.js - 高性能的虚拟DOM虚拟DOM单向数据流社区和生态系统适用场景 Angular - 一站式框架完整的框架双向数据绑定类型安全适用场景 如何选择&#xff1f;项目规模生态系统技能和经验性能需求 结…

UOS Deepin Ubuntu Linux 开启 ssh 远程登录

UOS Deepin Ubuntu Linux 开启 ssh 远程登录 打开控制台 安装 openssh-server sudo apt -y install openssh-server修改 /etc/ssh/ssh_config 文件 sudo vim /etc/ssh/ssh_config找到 # Port 22 去掉 # 注释后 保存 重启 ssh 服务 sudo systemctl restart ssh设置 ssh 服务 开机…

【MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制】

文章目录 MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制ACID及如何实现事务隔离级别&#xff1a;MVCC 多版本并发控制MySQL数据库主从复制主从同步延迟怎么处理Redis 读写分离1.什么是主从复制2.读写分离的优点 Redis为什么快呢&#xff1f; MySQL数…