java复习-线程的同步和死锁

线程的同步和死锁

同步问题引出

当多个线程访问同一资源时,会出现不同步问题。比如当票贩子A(线程A)已经通过了“判断”,但由于网络延迟,暂未修改票数的间隔时间内,票贩子B(线程B)也通过了“判断”。此时,若票数只剩下了最后一张,则会出现两个线程同时通过判断并最终会修改票数,出现错误(票数为0或-1)。
在这里插入图片描述

线程同步处理

解决同步问题的关键是锁,指的是当某一个线程执行操作的时候,其它线程外面等待。
在这里插入图片描述

现这把锁的功能,就可以使用 synchronized 关键字来实现,利用此关键字可以定义同步方法或同步代码块, 在同步代码块的操作里面的代码只允许一个线程执行。

1. 同步代码块

synchronized(同步对象){同步代码操作;
}

一般要进行同步对象处理的时候可以采用当前对象 this 进行同步。
卖票范例(同步代码块版):

class MyThread implements Runnable { // 线程的主体类private int ticket = 5;@Overridepublic void run() { // 线程的主体方法while(true) {synchronized(this) { // 每一次只允许一个线程进行访问if (this.ticket > 0) {try {Thread.sleep(100);  // 模拟网络延迟} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "买票,ticket = " + this.ticket --);				} else { System.out.println("-----票已售完-----");break;}}}}
}
public class ThreadDemo {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt,"票贩子A").start(); new Thread(mt,"票贩子B").start(); new Thread(mt,"票贩子C").start(); }
}

结果:

票贩子A买票,ticket = 5
票贩子C买票,ticket = 4
票贩子C买票,ticket = 3
票贩子C买票,ticket = 2
票贩子B买票,ticket = 1
-----票已售完-----
-----票已售完-----
-----票已售完-----

加入同步处理之后,程序的整体的性能下降了。同步实际上会造成性能的降低。

2. 同步方法

只需要在方法定义上使用synchronized 关键字即可。

class MyThread implements Runnable { // 线程的主体类private int ticket = 5;public synchronized boolean sale() { // 每一次只允许一个线程进行访问该方法if (this.ticket > 0) {try {Thread.sleep(100);  // 模拟网络延迟} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "买票,ticket = " + this.ticket --);return true;} else { System.out.println("-----票已售完-----");return false;}}@Overridepublic void run() {while(this.sale()) {}}
}
public class ThreadDemo {public static void main(String[] args) {MyThread mt = new MyThread();new Thread(mt,"票贩子A").start(); new Thread(mt,"票贩子B").start(); new Thread(mt,"票贩子C").start(); }
}

结果:

票贩子A买票,ticket = 5
票贩子A买票,ticket = 4
票贩子A买票,ticket = 3
票贩子C买票,ticket = 2
票贩子C买票,ticket = 1
-----票已售完-----
-----票已售完-----
-----票已售完-----

在日后学习 Java 类库的时候会发现,系统中许多的类上使用的同步处理采用的都是同步方法。

线程死锁

死锁是在进行多线程同步的处理之中有可能产生的一种问题,所谓的死锁指的是若干个线程彼此互相等待的状态。
若干个线程访问同一资源时一定要进行同步处理,而过多的同步会造成死锁。

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

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

相关文章

带你打穿三层内网-红日靶场七

文章目录 前记环境配置web1信息搜集cve-2021-3129redis未授权|ssh密钥后渗透 Win7(PC1)永恒之蓝 web2docker逃逸 win7(PC2)|DC 前记 所用工具 msfcsvenomfrp蚁剑冰蝎laravel.pyfscan 注意事项 msf的永恒之蓝每次都需要两次才能…

Java 代理模式之静态代理与动态代理

1,代理模式 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。 代理模式的目的: (1)通过引入代理对象的方式来间接访问目标对象,防…

geopandas 笔记:geometry上的操作汇总

如无特殊说明,数据主要来自:GeoDataFrame 应用:公园分布映射至subzone_UQI-LIUWJ的博客-CSDN博客 0 读入数据 subzone gpd.read_file(ura-mp19-subzone-no-sea-pl.geojson) subzone subzone_tstsubzone[0:5] subzone_tst subzone_tst.plot…

mingw 编译 curl ,Qt 工程使用

mingw 编译 curl 下载curl 源码 https://github.com/curl/curl 我使用8.3版 CMake-gui 配置 源码路径:D:/workspace/CPP/curl-8.3.0 生成路径: D:/workspace/CPP/curl-8.3.0/mingw-build 点击 Configure ,弹窗配置,选择 MinGW Makefiles 选择 Spec…

【Django】日志设置

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: "[%(asctime)s] %(levelname)s [%(name)s:%(l…

探索AIGC人工智能(Midjourney篇)(四)

文章目录 Midjourney模特换装 Midjourney制作APP图标 Midjourney网页设计 Midjourney如何生成IP盲盒 Midjourney设计儿童节海报 Midjourney制作商用矢量插画 Midjourney设计徽章 Midjourney图片融合 Midjourney后缀参数 Midjourney模特换装 关键词生成模特照片 中国女性模特的…

Hadoop的第二个核心组件:MapReduce框架第一节

Hadoop的第二个核心组件:MapReduce框架第一节 一、基本概念二、MapReduce的分布式计算核心思想三、MapReduce程序在运行过程中三个核心进程四、如何编写MapReduce计算程序:(编程步骤)1、编写MapTask的计算逻辑2、编写ReduceTask的…

2023年数维杯数学建模A题河流-地下水系统水体污染研究求解全过程文档及程序

2023年数维杯数学建模 A题 河流-地下水系统水体污染研究 原题再现: 河流对地下水有着直接地影响,当河流补给地下水时,河流一旦被污染,容易导致地下水以及紧依河流分布的傍河水源地将受到不同程度的污染,这将严重影响…

SQL11 高级操作符练习(1)

描述 题目:现在运营想要找到男性且GPA在3.5以上(不包括3.5)的用户进行调研,请你取出相关数据。 示例:user_profile iddevice_idgenderageuniversitygpa12138male21北京大学3.423214male复旦大学4.036543female20北京大学3.242315female23浙…

C#__资源访问冲突和死锁问题

/// 线程的资源访问冲突:多个线程同时申请一个资源,造成读写错乱。 /// 解决方案:上锁,lock{执行的程序段}:同一时刻,只允许一个线程访问该程序段。 /// 死锁问题: /// 程序中的锁过多&#xf…

Java笔记:GC日志

1. 启用GC日志 -verbose:gc -XX:PrintGC -XX:PrintGCDetails -XX:PrintGCDateStamps -Xloggc:/opt/logs/gc.log在JDK 8中, -verbose:gc是 -XX:PrintGC一个别称,日志格式等价与: -XX:PrintGC。 不过在JDK 9中 -XX:PrintGC被标记deprecated…

ACM模板二:树、图、并查集、DancingLink

目录 〇,全文说明、宏定义代码 一,二叉树 二,树状数组、线段树 三,多叉树 四,并查集、DancingLink、无向图、最小生成树 五,有向图、单源最短路径、连通分量、拓扑排序 六,网格图、回路链…

深入解析顺序表:揭开数据结构的奥秘,掌握顺序表的精髓

💓 博客主页:江池俊的博客⏩ 收录专栏:数据结构探索👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🔥编译环境:Visual Studio 2022&#x1f38…

【业务功能篇99】微服务-springcloud-springboot-电商订单模块-生成订单服务-锁定库存

八、生成订单 一个是需要生成订单信息一个是需要生成订单项信息。具体的核心代码为 /*** 创建订单的方法* param vo* return*/private OrderCreateTO createOrder(OrderSubmitVO vo) {OrderCreateTO createTO new OrderCreateTO();// 创建订单OrderEntity orderEntity build…

【ESP32】带 log 记录的 malloc 动态申请内存,用于debug 调试查找报错原因

本文章以ESP32为依托,旨在解决在【嵌入式工程】开发过程中,在动态申请内存这部分,由于 malloc 之后,忘记 free 释放,造成内存溢出导致 MCU重启的问题 📋 个人简介 💖 作者简介:大家好…

linux安装nacos2.2.0

1、使用docker拉取镜像:docker pull nacos/nacos-server:v2.2.0 2、下载官方配置文件:https://github.com/alibaba/nacos/releases 3、修改配置文件的数据库连接信息,修改完成后将配置文件移至挂载目录/home/shixp/docker/nacos/conf&#xf…

统计表和流程分析,也能同屏呈现_三叠云

表单统计&流程分析 路径 表单设计 >> 表单设置 >> 拓展设置 >> 表单统计 功能简介 新增表单统计、流程分析功能(Beta版)。可在当前列表,直接看到表单的统计表和流程分析数据统计图表。 1. 统计表:统计…

实时美颜的背后:视频直播美颜SDK的算法与原理

美颜技术的应用范围已经广泛扩展,从自拍照片到视频直播,都可以看到它的踪迹。然而,视频直播的实时性要求比静态图像高得多。要实现实时美颜,必须克服许多技术挑战。这就是视频直播美颜SDK的用武之地。 一、实时美颜的挑战 实时…

如何使用CMD恢复删除的分区?

分区删除后可以恢复吗? 磁盘分区旨在二级存储上创建一个或多个区域,然后你可以单独管理每个区域,这些区域就是分区。因此,对新安装的存储设备进行分区是很重要的环节,只有分区后才可以在这些设备上创建文件并保存数…