代码线程安全

线程生命周期

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

synchronized

synchronized会自动释放锁

  • synchronized同步代码块
    在这里插入图片描述
    在这里插入图片描述

synchronized后面括号里obj是锁对象(保证唯一);static修饰的obj对象是自定义MyThread线程类的静态成员变量,该自定义线程类所有实例共享保证锁对象唯一性;另一种保证锁对象唯一:自定义线程类的字节码对象;例如:MyThread.class
备注: synchronized同步代码块的锁对象可以自己指定

  • synchronized同步方法
    在这里插入图片描述
    在这里插入图片描述

synchronized同步方法上时,锁对象通过系统定义而不能自定义指定;
同步方法系统定义锁对象两种方式:
1.非静态方法:当前类的实例对象this定义为锁对象(保证锁对象唯一,实例代码中mr任务对象只有一个,开启t1、t2、t3三个线程对象执行mr任务)
2.静态方法:当前类的类字节码对象为锁对象(static修饰的成员方法类的所有实例共享,类的字节码对象只有一个);类字节码对象:类.class

  • synchronized的死锁

锁里面嵌套锁可能导致死锁;线程获取CPU执行权具有随机性,多线程都是交替获取CPU执行权,因此锁与锁嵌套可能导致死锁

在这里插入图片描述

lock锁

lock锁需要手动unlock方法释放锁

在这里插入图片描述

代码中lock锁unlock方法释放时放在finally里面,保证锁正常释放(即使遇到break)

多线程等待唤醒机制

线程常用方法
在这里插入图片描述

1. 手动实现多线程的等待唤醒机制(食客与厨师为例)

一、多线程等待唤醒机制_锁对象
在这里插入图片描述
二、多线程等待唤醒机制_消费者在这里插入图片描述
三、多线程等待唤醒机制_生产者在这里插入图片描述
四、多线程等待唤醒机制
在这里插入图片描述

2. 阻塞队列实现多线程的等待唤醒机制(食客与厨师为例)

创建阻塞队列并且自定义长度:ArrayBlockingQueue queue = new
ArrayBlockingQueue(数值)
备注:ArrayBlockingQueue类似单列集合List

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

博客系统的后端设计(八) - 实现发布博客功能

文章目录 发布博客1. 约定前后端交互接口2. 服务器代码3. 客户端代码4. 出现的问题 发布博客 在原来的编辑页面点击发布文章按钮,是不会有什么效果的。 这是因为此时还不能实现前后端的交互。 1. 约定前后端交互接口 请求使用 POST,路径是 /blog title这…

Niagara—— Niagara Editor界面

目录 一,菜单栏 二,工具栏 三,预览面板 四,参数面板 五,系统总览面板 六,暂存区面板 七,选择面板 八,时间轴面板 九,曲线面板 十,日志面板 十一&a…

通过js来判断是否是横屏如果是就自刷新页面解决横屏之后只有屏幕一半宽度的问题

判断页面是横屏还是竖屏 window.addEventListener("load", rotate, false);window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", rotate, false);function rotate() {if (window.orientatio…

力扣高频SQL50题(基础版)——第一天

力扣高频SQL50题(基础版)——第一天 1 可回收且低脂的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # WHERE子句中使用多条件 SELECT product_id FROM Products WHERE low_fatsY AND recyclableY1.3 运行截图 2 寻找用户推荐人 2.1 题目内容…

《数据库应用系统实践》------ 小区停车管理系统

系列文章 《数据库应用系统实践》------ 小区停车管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&…

第13届蓝桥杯Scratch选拔赛真题集锦

第13届蓝桥杯Scratch选拔赛真题集锦 编程题 第 1 题问答题 跳舞机游戏 题目说明 编程实现 跳舞机游戏。 具体要求: 1).点击绿旗,舞台左上角显示得分0代表玩家分数,在得分右侧倒计时10代表游戏时长(10s) 2).游戏开始倒数计时,在舞台上随机显示上、下、左、右四个箭头中…

SCMA基本原理介绍

SCMA: Sparse Code Multiple Access SCMA基本原理 我们考虑一个同步(synchronous)的SCMA系统, 含1个基站(Base Station, BS); J J J个用户(so called layers);K个OFDM…

vue2介绍(入门)

目录 声明式渲染 v-bind v-if条件与循环 name命名 学会log打印 一些js方法 双向绑定v-model和v-bind 那么请实现一个复选框吧 自定义标签模板 声明式渲染 我感觉这里文档的意思是双向绑定, 或许需要清理一下js缓存机制 ,嗯...不懂,响应式&…

深入解析Linux C/C++ 编程中的内存泄漏问题

深入解析Linux C/C 编程中的内存泄漏问题 I. 前言 (Introduction)1.1 文章目的与内容概述 (Purpose and Overview of the Content)1.2 重要性和实用性的说明 (Significance and Practicality Explanation)1.3 数据结构与内存泄漏的基本概念 (Basic Concepts of Data Structure …

PDF文件数字证书签名指南

一、安装PDF证书的环境 1.1 PDF证书安装环境 Windows pc 机一台 安装Adobe Acrobat 软件 PDF文档签名证书一张(备注:本指南使用沃通内部文档加密证书进行操作,通用其它版本证书) 1.2 网络环境要求 请确保您签名的电脑可以正常访问外网。 二、PDF证书安装 2.…

数据结构之二叉树的基本实现

在我们之前已经了解的堆这样的完全二叉树的实现,也对树型结构有了一些了解,那么今天我们来看看二叉树的一些性质。 因为二叉树是一种每个节点至多只有两个子树(即二叉树的每个节点的度不大于2),并且二叉树的子树有左右…

Shell脚本攻略:shell函数应用

目录 一、理论 1.shell函数 2.函数传参 3.函数变量的作用范围 4.递归 5.函数位置变量与脚本位置变量区别 6.创建库 二、实验 1.实验一 一、理论 1.shell函数 (1)概念 将命令序列按格式写在一起,可方便重复使用命令序列。 ① 避免…

Docker容器与虚拟机(VM)大对比

Docker是一个开源应用容器引擎。Docker可以将应用程序与基本架构分开,从而快速交付软件。 传统虚拟机的运行需要占用较高的资源,包括磁盘空间、内存和处理器性能。每个虚拟机都需要完整的操作系统和应用程序副本,这在资源利用和启动时间上存…

js实现PDF 预览和文件下载

在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能,PDF 类型文件的来源又包括 H5 移动端 和 PC 端,而针对这两个不同端的处理会有些许不同,下文会有所提及。 针对 PDF 预览 的文章不在少数,但似乎都没有提及可能遇到的问…

Markdown可以在线编辑吗?这个办法很好用

Markdown是一种轻量级标记语言,它使用简单的语法来创建文本,非常易于学习。它最初被设计为一种用于写作的格式,但现在已经成为了一种非常受欢迎的文本编辑工具。 作为一个较为方便的在线文本编辑器,它可以用代码代替文字&#xf…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心:IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作,注意:此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

springboot中将logback切换为log4j2

前言 springboot默认使用logback作为日志记录框架,常见的日志记录框架有log4j、logback、log4j2。这篇文章我们来学习怎样将logbak替换为log4j2。 一、为什么使用log4j2? 我们在项目中经常使用一个叫SLF4J的依赖,它是做什么的呢? …

Activity的预览窗口StartingWindow添加

Activity的预览窗口StartingWindow添加 1、Activity组件启动2、ActivityStarter.java#startActivityInner() > 主要查看Task.java#startActivityLocked3、ActivityRecord.java#addStartingWindow到WindowManagerService.java#addWindow3.1 ActivityRecord.java#addStartingW…

C/C++开发,libiec61850库学习及运用

目录 一、libiec61850库下载编译 1.1 下载 1.2 linux编译: 1.3 win编译 二、案例编译测试 2.1 CMakeLists.txt调整(server_example_goose) 2.2 模型static_model.h/static_model.cpp生成 2.3 案例编译(server_goose) 2.4 客户端编译 2.5 运行测试 一、libiec61850…