当前位置: 首页 > news >正文

Java笔记-线程同步

目录

    • 线程的同步---以三个窗口售票100张为例
      • 方式一:同步代码块
      • 方式二:同步方法
      • 使用同步机制的作用:

线程的同步—以三个窗口售票100张为例

(1)问题:卖票的过程出现重票和错票
(2)原因:当某个线程操作车票的过程中,尚未操作完成,其他线程参与进来,也操作车票
(3)解决:当一个线程a在操作共享对象时,其他线程不能参与进来,直到线程a操作完毕,其他
线程才可以开始操作共享对象。
这种情况,即使线程a出现了阻塞,也不能被改变
(4)java中通过同步机制,来解决线程的安全问题:

方式一:同步代码块

synchronized(同步监视器){//需要被同步的代码(操作共享数据的代码)
//共享数据:多个线程共同操作的变量
//不能包含太多,不也能包太少}

同步监视器----俗称:锁,任何一个类的对象,都可以充当锁
要求:多个线程必须要共用同一把锁,唯一性
** 补充1:在实现Runnable接口中,使用this做同步监视器 **

class Window1 implements Runnable {/*只创造了一个Window1对象,因此可以实现100张票共享*/private int ticket=100;Object ob=new Object();//任何一个类的对象,都可以充当锁@Overridepublic void run() {while(true){synchronized(this) {//此时的this:唯一的window1对象,不用在另外创建一个类的对象// synchronized(ob) {if (ticket > 0) {System.out.println(Thread.currentThread().getName() + "卖票:" + ticket);ticket--;} else {break;}}}}
}

补充2:在继承Thread类创建多线程的方式中,使用 线程类.class 作为同步监视器,慎用this

class Window2 extends Thread{private static int ticket=100;private static Object obj=new Object();@Overridepublic void run(){while(true) {// synchronized (obj) {synchronized (Window2.class) {//类类型的对象也可以// synchronized(this) {错误,在继承这种方法的时候不能写this,因为new的时候会产生多个对象try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}if (ticket > 0) {System.out.println(getName() + "卖票:" + ticket);ticket--;}}}}}
}

方式二:同步方法

将需要进行同步的代码放在一个方法中,给方法加上synchronized
关于同步方法的总结:
①同步方法仍然涉及到同步监视器,只是不需要显示声明
②非静态的同步方法:同步监视器是:this
静态的同步方法:同步监视器是当前类的本身 类.class

** 1.用同步方法解决,实现Runnable接口创建多线程 **

class Window3 implements Runnable {/*只创造了一个Window1对象,因此可以实现100张票共享*/private int ticket=100;@Overridepublic void run() {while(true){show();}}private synchronized void show(){if (ticket > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "卖票:" + ticket);ticket--;}}
}

2**.同步方法解决继承Thread类创建多线程 **

class Window4 extends Thread{private static int ticket=100;@Overridepublic void run(){while(true) {show();}}private static synchronized void show(){//此时同步监视器:Window4.class//private synchronized void show(){//同步监视器的对象不唯一,和new 有关if (ticket > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "卖票:" + ticket);ticket--;}}
}

使用同步机制的作用:

好处----同步的方式,解决了线程的安全问题
局限性----操作同步代码时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低

相关文章:

Java笔记-线程同步

目录线程的同步---以三个窗口售票100张为例方式一:同步代码块方式二:同步方法使用同步机制的作用:线程的同步—以三个窗口售票100张为例 (1)问题:卖票的过程出现重票和错票 (2)原因…...

通过python 调用OpenAI api_key提交问题解答

通过python 调用OpenAI api_key提交问题解答✨可以通过网页版的jupyter notebook调用,也可以通过spyder窗口等IDE窗口. 🌼通过python 调用OpenAI api_key接口,可以避免国内网页不能访问的问题。前提是需要自己已经注册了OpenAI帐号&#xff…...

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具,由数据可视化软件组件和工具类组成,可支持基于 Windows 的用户界面框架(Windows Presentation Foundation)、Windows 通用应用平台(Universal Windows Platfor…...

什么是响应性?

响应性: 这个术语在今天的各种编程讨论中经常出现,但人们说它的时候究竟是想表达什么意思呢?本质上,响应性是一种可以使我们声明式地处理变化的编程范式。一个经常被拿来当作典型例子的用例即是 Excel 表格: 这里单元…...

黑马】后台管理176-183

一、新建订单管理的分支二、创建一个订单管理的vue文件进行组件页面的路由配置import Order from ../components/order/Order.vue{path:/orders,component:Order},注意上面的components不要忘记少加一个s!三,获取后台数据面包屑导航粘贴过来文本输入框&a…...

Typescript - 类型守卫(typeof / in / instanceof / 自定义类型保护的类型谓词)通俗易懂详细教程

前言 类型守卫用于获取变量类型信息,通常使用在条件块语句中。类型守卫是返回布尔值的常规函数,接受一个类型并告诉 TypeScript 是否可以缩小到更具体的类型。类型守卫具有唯一的属性,可以确保测试的值返回的是布尔值类型。 TypeScript 使用了…...

6.8 左特征向量

特征值很复杂,除了普通的特征向量外,还有左特征向量和广义特征向量。先说说比较容易的左特征向量吧。它是这样定义的,AAA是一个矩阵,λ\lambdaλ是它的一个特征值,下面的向量yyy就是矩阵关于特征值的左特征向量left ei…...

10个自动化测试框架,测试工程师用起来

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐,必须加快应用程序的交付时间,但不能以牺牲质量为代价。快速实现质量是必要的,因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…...

城市C友会【官方牵头更多的线下交流的机会,你有怎样的期待?】

文章目录🌟 课前小差🌟 长沙线下🌟 C友会你也可以是组织者🌟 线下交流提升价值🌟 官方与抖音合作?🌟 23年动起来🌟 写在最后🌟 课前小差 哈喽,大家好&#x…...

CSDN 编程竞赛二十七期题解

竞赛总览 CSDN 编程竞赛二十七期:比赛详情 (csdn.net) 四道题都不难,本来十分钟内就可以解决,但是这次竞赛bug比较多,体验不是很好。 竞赛题解 题目1、幸运数字 小艺定义一个幸运数字的标准包含三条:1、仅包含4或…...

RMI攻击中的ServerClient相互攻击反制

前言 前文中,我们分析了攻击Registry的两种方式,这里我们接着前面的内容,分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例,这里直接注册端和服务端放置在一起。 package pers.rm…...

值类型和引用类型

一、值类型和引用类型示例: 值类型:基本数据类型系列,如:int,float,bool,string,数组和结构体等。 引用类型:如:指针,slice切片,map&a…...

后端开发必懂nginx面试40问

什么是Nginx? Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用ngin…...

Redis为什么这么快?

1.基于内存存储实现 在MySQL数据库中,所有的读写操作都要通过IO的方式从硬盘中获取。在Redis中,所有的操作都是基于内存实现的,从而减少IO操作提高数据库性能。 2.高效的数据结构 SAS简单动态字符串 字符串长度:SAS查询的时间复杂度O(1),c语言中时间复杂度O(n)空间分配来…...

几种实现主题切换的方式

几种实现主题切换的方式 1. 利用 prefers-color-scheme 特性 prefers-color-scheme是CSS 媒体特性【media】用于检测用户是否有将操作系统的主题色设置为亮色【light】或者暗色【dark】。 当前prefers-color-scheme新特性支持各大主流电脑(window和IOS系统&#…...

Jenkins使用(代码拉取->编译构建->部署上线)

Jenkins简介 Jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更重要的业务逻辑实现上。同时Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用…...

IEEE期刊论文投稿前期准备

目录 1、简介 2、资料准备 TPAMI 投稿须知 Letex模板资料下载 下载参考文献Bib文件...

[AAAI 2022] TransFG: A Transformer Architecture for Fine-grained Recognition

Contents TransFG ArchitectureExperimentsReferencesTransFG Architecture Overlapping patch split:ViT 是把图片分成一系列不重叠的 patches,作者认为这可能会破坏 discriminative regions. 为了解决上述问题,作者提出使用 Overlapping patch split,划分的 patch 数 N …...

机器学习之决策树原理详解、公式推导(手推)、面试问题、简单实例(python实现,sklearn调包)

目录1. 决策树原理1.1. 特性1.2. 思路1.3. 概念决策树概念信息论2. 公式推导2.1. 构造决策树2.1.1. ID3理论示例缺点2.1.2. C4.5理论示例缺点2.1.3. CART示例对比分析2.2. 剪枝3. 实例3.1. 数据集3.2. ID33.3. C4.53.4. CART3.5. sklearn实现4. 几个注意点(面试问题)5. 运行&am…...

一文搞懂CAS实现原理——怀玉

点个关注,必回关 文章目录CAS原理剖析1、参数解密CAS底层指令CAS(Compare and swap)是一种用于在多线程环境下实现同步功能的机制CAS原理剖析 CAS 被认为是一种乐观锁,有乐观锁,相对应的是悲观锁。 在上述示例中&…...

typora每次复制文档都要附带图片文件夹?学会配置gitee图床

0. 引言 作为开发人员,我们习惯使用md格式来编写文档,特别是typora编辑器更是日常使用的软件。但作为轻量化的文档编辑器,我们在默认插入图片时,一般typora会将图片保存到本地或者引用一个本地图片的路径 当文档还在我们本地打开…...

Linux--gdb

gdb用于实现在linux下通过gdb进行调试。由于gcc、g生成的文件是release文件,而不是用于调试的debug文件,所以需要使用gcc -g命令,生成debug文件 调试器:核心工作,主要是为了定位问题 所有查看内容的指令,不…...

c++11 标准模板(STL)(std::multimap)(二)

定义于头文件 <map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class multimap;(1)namespace pmr { template <class Key, class T…...

【数据结构】二叉排序树——平衡二叉树的调整

文章目录前置概念一、构造平衡二叉树的基本思想二、一个示例三、平衡二叉树的调整细节&#xff08;1&#xff09;LL型&#xff08;顺时针 &#xff09;举例&#xff08;2&#xff09;RR型&#xff08;逆时针&#xff09;&#xff08;3&#xff09;LR型&#xff08;先逆时针再顺…...

03- pandas 数据库可视化 (数据库)

pandas库的亮点: 一个快速、高效的DataFrame对象&#xff0c;用于数据操作和综合索引&#xff1b;用于在内存数据结构和不同格式之间读写数据的工具&#xff1a;CSV和文本文件、Microsoft Excel、SQL数据库和快速HDF 5格式&#xff1b;智能数据对齐和丢失数据的综合处理&#…...

第三方电容笔怎么样?开学适合买的电容笔

随着科学技术的进步&#xff0c;很多新型的电子产品和数码设备都出现了。比如手机&#xff0c;IPAD&#xff0c;蓝牙耳机&#xff0c;电容笔等等。实际上&#xff0c;如果你想要更好的使用ipad&#xff0c;那么你就需要一支电容笔。比如ipad&#xff0c;我们用ipad来做笔记&…...

Java学习-IO流-字节输出流

Java学习-IO流-IO流的体系和字节输出流基本用法 //IO流 → 字节流 → 字节输入流&#xff1a;InputStream // ↘ ↘ 字节输出流&#xff1a;OutputStream // ↘ 字符流 → 字符输入流&#xff1a;Reader // ↘ 字符输出流&#xff1a;WriterFileInputStream…...

linux性能分析 性能之巅学习笔记和内容摘录

本文只是在阅读《性能之巅》的过程中&#xff0c;对一些觉得有用的地方进行的总结和摘录&#xff0c;并附加一些方便理解的材料&#xff0c;完整内容还请阅读Gregg的大作 概念和方法 性能分析领域一词的全栈代表了整个操作系统的软硬件在内的所有事物 软件生命周期和性能规划…...

机器学习笔记之生成模型综述(三)生成模型的表示、推断、学习任务

机器学习笔记之生成模型综述——表示、推断、学习任务引言生成模型的表示任务从形状的角度观察生成模型的表示任务从概率分布的角度观察生成模型的表示任务生成模型的推断任务生成模型的学习任务引言 上一节介绍了从监督学习、无监督学习任务的角度介绍了经典模型。本节将从表…...

第八章 Flink集成Iceberg的DataStreamAPI、TableSQLAPI详解

1、概述 ​ 目前Flink支持使用DataStream API 和SQL API方式实时读取和写入Iceberg表&#xff0c;建议使用SQL API方式实时读取和写入Iceberg表。 Iceberg支持的Flink版本为1.11.x版本以上&#xff0c;以下为版本匹配关系&#xff1a; Flink版本Iceberg版本备注Flink1.11.XI…...

蒲江网站建设/现代网络营销的方式

不被支持 原来写错勒转载于:https://blog.51cto.com/xitingguic/514381...

成都个人学做网站/二十条优化疫情措施

今早8点&#xff0c;《梦幻西游》手游再次迎来了大维护。那么这次维护都有哪些新的玩法加入&#xff0c;有哪些功能的优化呢?下面就来回顾下维护的相关内容吧!以下内容在部分服务器放出(客户端升级至1.17.0版)&#xff1a;1、帮派竞赛玩法继续在再续前缘、花样年华、梦回唐朝、…...

签证网站建设/手机建站

改函数的功能就是读取NV之前保存的网络信息&#xff0c;将之前写进NV中的信息读出来&#xff1a;uint8 ZDApp_RestoreNetworkState( void ){uint8 nvStat;nwkActiveKeyItems keyItems;// Initialize NWK NV itemsnvStat NLME_InitNV();if ( nvStat ! NV_OPER_FAILED ){if ( NL…...

科技公司网站首页/seo专员是什么

恶意吸费之后&#xff0c;你渴望开放还是开源&#xff1f;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />文 小刀马近期&#xff0c;有媒体报道Android身陷恶意扣费门。如果用户下载使用了这些内置恶意扣费的Android应用软件&…...

网站做微信支付宝支付宝/百度seo如何做

Pytorch快速入门学习-数据操作和数据预处理加载数据DataSet类代码实战Tensorboard的使用加载数据 DataSet:提供一种方式获取数据以及它的标签DataLoader:为后面的网络提供不同的数据形式 复习一下anaconda操作&#xff1a; 查看现有的虚拟环境 conda info -e激活指定的虚拟环…...

西安建设学院网站/百度售后服务电话人工

最近要写一个右键菜单 上百度一看 发现有很多插件&#xff0c;但是因为本人能力有限啊&#xff0c;不会去改插件来满足后台小哥哥的要求&#xff0c;因此&#xff0c;就像算啦&#xff0c;干嘛不自己写&#xff0c;难道真的那么难么&#xff1f;先插入html吧 1 <!--右键--&…...