当前位置: 首页 > 编程日记 > 正文

Java学习总结:28

线程的同步和死锁

在程序开发中,所有程序都是通过主方法执行的,而主方法本身就属于一个主线程,所以通过主方法创建的新的线程对象都是子线程。
利用子线程可以进行异步的操作处理,这样可以在不影响主线程运行的前提下进行其他操作,程序的执行速度不仅变快了,并且操作起来也不会产生太多的延迟。

同步操作

所谓同步操作就是一个代码中的多个操作在同一个时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行。
同步的操作
在Java中可以使用synchronized关键字实现线程的同步,该关键字可以通过以下两种方式进行使用:
1.同步代码块:利用synchronized包装的代码块,但是需要指定同步对象,一般设置为this;
2.同步方法:利用synchronized定义的方法。

例:观察同步代码块

package Project.Study.Multithreading;class MyThread7 implements Runnable{private int ticket=10;			//一共有10张票@Overridepublic void run(){for (int x=0;x<10;x++){synchronized(this){		//定义同步代码块if(this.ticket>0){	//判断当前是否还有剩余票try {Thread.sleep(100);	//休眠1s,模拟延迟}catch (InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+",卖票,ticket="+this.ticket--);}}}}}
public class Test7 {public static void main(String [] args){MyThread7 mt=new MyThread7();new Thread(mt,"票贩子A").start();		//启动多线程new Thread(mt,"票贩子B").start();new Thread(mt,"票贩子C").start();new Thread(mt,"票贩子D").start();}
}
//结果:
//票贩子A,卖票,ticket=10
//票贩子A,卖票,ticket=9
//票贩子A,卖票,ticket=8
//票贩子A,卖票,ticket=7
//票贩子A,卖票,ticket=6
//票贩子A,卖票,ticket=5
//票贩子A,卖票,ticket=4
//票贩子A,卖票,ticket=3
//票贩子A,卖票,ticket=2
//票贩子A,卖票,ticket=1

例:使用同步方法解决问题

package Project.Study.Multithreading;class MyThread8 implements Runnable{private int ticket=10;          //一共有10张票@Overridepublic void run(){for (int x=0;x<20;x++){this.sale();            //卖票操作}}public synchronized void sale(){//同步方法if (this.ticket>0){         //判断当前是否还有剩余票try{Thread.sleep(100);//休眠1s,模拟延迟}catch (InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+",卖票,ticket="+this.ticket--);}}
}
public class Test8 {public static void main(String []args){MyThread8 mt=new MyThread8();new Thread(mt,"票贩子A").start();//启动多线程new Thread(mt,"票贩子B").start();new Thread(mt,"票贩子C").start();new Thread(mt,"票贩子D").start();}
}
//结果:
//票贩子A,卖票,ticket=10
//票贩子A,卖票,ticket=9
//票贩子A,卖票,ticket=8
//票贩子A,卖票,ticket=7
//票贩子A,卖票,ticket=6
//票贩子A,卖票,ticket=5
//票贩子A,卖票,ticket=4
//票贩子A,卖票,ticket=3
//票贩子A,卖票,ticket=2
//票贩子A,卖票,ticket=1

注意:
1.method、static、native、synchronized都不能和"abstract"同时声明方法。
2.当一个线程进入一个对象synchronized方法后,其他线程不能访问此对象的其他方法。
3.同步的代码性能会较低,但是数据的安全性会高(线程安全性高);异步的代码则往往更有效率,不过线程安全性则较低(其数据多是共享数据,即被其它线程使用过了)。

死锁

过多的同步操作有可能会带来死锁问题,导致程序进入停滞状态。所谓死锁就是指两个线程都在等待彼此先完成,造成了程序的停滞状态,一般程序的死锁都是在程序运行时出现的。

例:程序死锁操作

package Project.Study.Multithreading;class A{public synchronized void say(B b){System.out.println("A先生说:把你的笔记本给我,我给你笔,否则不给!");b.get();}public synchronized void get(){System.out.println("A先生:得到了笔记本,付出了笔,还是什么都干不了!");}
}
class B{public synchronized void say(A a){System.out.println("B先生说:把你的笔给我,我给你笔记本,否则不给!");a.get();}public synchronized void get(){System.out.println("B先生:得到了笔,付出了笔记本,还是什么都干不了");}
}
public class Test9 implements Runnable{private static A a=new A();                 //定义类对象private static B b=new B();public static void main(String[]args){new Test9();                            //实例化本类对象}public Test9(){                             //构造方法new Thread(this).start();        //启动线程b.say(a);                               //互相引用}@Overridepublic void run(){a.say(b);                               //互相引用}
}
//结果:
//B先生说:把你的笔给我,我给你笔记本,否则不给!
//A先生说:把你的笔记本给我,我给你笔,否则不给!
//(程序将不会再向下执行,并且不会退出,此为死锁情况出现)

上程序由于两个类都使用了同步的方法定义,就会造成a对象等待b对象执行完毕,而b对象等待a对象执行完毕,这样就会出现死锁现象。

相关文章:

BZOJ1202: [HNOI2005]狡猾的商人

Description 刁姹接到一个任务&#xff0c;为税务部门调查一位商人的账本&#xff0c;看看账本是不是伪造的。账本上记录了n个月以来的收入情况&#xff0c;其中第i 个月的收入额为Ai(i1,2,3...n-1,n)&#xff0c; 。当 Ai大于0时表示这个月盈利Ai 元&#xff0c;当 Ai小于0时表…

导出swagger2生成的文档

百度了好多篇用法&#xff0c;没法用。特此记录一下 一、下载项目 下载https://github.com/Swagger2Markup/spring-swagger2markup-demo下的项目&#xff0c;保存&#xff0c;注意文件路径不要有中文。我们称这个项目为A项目。 没错这个项目就是专门根据json解析生成文档的。…

把三千行代码重构为15行

2019独角兽企业重金招聘Python工程师标准>>> 如果你认为这是一个标题党&#xff0c;那么我真诚的恳请你耐心的把文章的第一部分读完&#xff0c;然后再下结论。如果你认为能够戳中您的G点&#xff0c;那么请随手点个赞。 把三千行代码重构为15行 那年我刚毕业&#…

一起学WPF系列(2):第一个WPF应用程序

概述 Windows Presentation Foundation (WPF) 是下一代显示系统&#xff0c;用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序。使用 WPF&#xff0c;您可以创建广泛的独立应用程序以及浏览器承载的应用程序。一直以来&#xff0c;我对界面的东西是不怎么感兴趣的&am…

Java学习总结:29

线程间的经典操作案例——生产者与消费者案例 程序基本模型&#xff1a; package Project.Study.Multithreading;class Message{private String title; //保存信息的标题private String content; //保存信息的内容public void setTitle(String title) {this.title title;}…

Blender终极角色创造:从初学者到专业人士

Ultimate character creation in Blender: From beginner to pro 流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |大小解压后:24.8 GB 含建模参考图 |时长…

2022-2028年中国离心机行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国离心机行业市场行业相关概述、中国离心机行业市场行业运行环境、分析了中国离心机行业市场…

Shell 十三问 的学习记录

在 BBS上看到了Shell十三问的帖子&#xff0c;由于比较就远了&#xff0c;怕以后再也找不到了&#xff0c;就把笔记贴过来了&#xff0c; 原帖地址&#xff1a; shell 十三问http://bbs.chinaunix.net/thread-2033675-1-1.html 贴出我做的笔记&#xff1a; <一>、为何叫做…

图解八大排序算法——我见过的最详细的讲解(转)

一、分类 1.内部排序和外部排序  内部排序&#xff1a;待排序记录存放在计算机随机存储器中&#xff08;说简单点&#xff0c;就是内存&#xff09;进行的排序过程。外部排序&#xff1a;待排序记录的数量很大&#xff0c;以致于内存不能一次容纳全部记录&#xff0c;所以在排…

UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter

UE4创建第一人称射击游戏学习教程本课程包含38节视频课&#xff0c;将逐步指导您完成以下主题: 云桥网络 平台获取课程&#xff01; 如何创建6种可定制的武器(包括手枪、突击步枪、猎枪、狙击枪、榴弹发射器和火箭发射器) 如何制作基于命中扫描和投射的武器 如何制作第一人…

PS多形式的部分之间复制“笨办法”

PS剪切页面&#xff0c;有时候你可能会遇到这样的情况&#xff1a;设计改进&#xff0c;但是&#xff0c;我们要具有相同的切片。 在此假设&#xff0c;可以直接用于切割片。我们可以节省大量的时间&#xff0c;又分为片。 但是&#xff0c;人们一般不会在你的上跨片设计PSD在变…

Java学习总结:30

线程的生命周期 suspend()方法&#xff1a;暂时挂起线程&#xff1b; resume()方法&#xff1a;恢复挂起的线程&#xff1b; stop()方法&#xff1a;停止线程。 对于以上三个方法不推荐使用&#xff0c;它们已经被慢慢废除掉了&#xff0c;主要原因是这三个方法在使用时容易产…

SVN优化(一) SVN忽略maven项目的target

SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二 解决办法 方式一&#xff1a; 在项目代码路径,如: F:\xyx\sl 鼠标右键,“TortoiseSVN”-- >“Settings” -->"Subversion"-->"Global ignore pattern" 添加:target *.…

“WPF老矣,尚能饭否”—且说说WPF今生未来(上):担心

2019独角兽企业重金招聘Python工程师标准>>> 近日微软公布了最新的WPF路线图&#xff0c;一片热议&#xff1b;对于老牌控件提供商葡萄城来说&#xff0c;这是WPF系列控件一个重要的机遇&#xff0c;因此&#xff0c;Spread Studio for WPF产品做了一次重要更新&…

C语言新手写扫雷攻略3

界面绘制好后&#xff0c;雷数也布置了&#xff0c;接下来就是游戏的运行过程了&#xff0c;今天先不说具体过程&#xff0c;再来看看需要用到的辅助函数 先是简单的画红旗&#xff0c;鼠标右键的功能是画红旗&#xff0c;至此我们都是在使用函数自己绘图&#xff0c;效率是低&…

制作欧比旺·克诺比逼真的CG角色学习教程

艺术站-制作欧比旺克诺比逼真的Cg角色 大小解压后&#xff1a;4.98G 含课程素材文件 1920X1080 .mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 课程获取&#xff1a;制作欧比旺克诺比逼真的CG角色学习教程 信息: 欧比旺是我一直以来…

Java学习总结:31(StringBuffer类)

StringBuffer类 在Java中String类不适合使用于频繁修改字符串的操作上(因为其字符串常量一旦声明则不可改变&#xff0c;只能改变字符串对象&#xff0c;改变的是其内存地址的指向)&#xff0c;所以我们可以使用StringBuffer类方便用户进行内容的修改。 例&#xff1a;观察Str…

c语言常用数据类型转换整理

你要发送原始数据流 还是 格式化输出&#xff1f; 如果是格式化 按原子说的 &#xff0c;用sprintf / printf; 如果发送原始内存数据流&#xff0c; 可按下面发送&#xff0c; 发送 #define BYTE0(pointer) (*((char*)(&pointer)0)); #define BYTE1(pointer) (*((char…

2022-2028年中国老年旅游市场深度调研及开发战略研究报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国老年旅游行业市场行业相关概述、中国老年旅游行业市场行业运行环境、分析了中国老年旅游行…

Andriod使用webview控件往APP里内嵌网页

1.布局文件片段&#xff1a;res-layout <WebView android:id"id/Toweb" android:layout_width"fill_parent" android:layout_height"fill_parent" /> 2.Java片段&#xff1a;src Overrideprotected void onCreate(Bundle savedInstance…

垃圾回收器ZGC应用分析总结

ZGC 是一款低延迟、高吞吐的垃圾回收器,由 Oracle 公司开发。它适用于大型、多核、内存容量较大的应用程序。ZGC 的设计目标是在最大限度地减少停顿时间的同时,为大型内存提供可伸缩性,并为生产部署提供高吞吐量和稳定性。它的目标是以不到 10 毫秒的暂停时间来控制 100MB 到 4TB 的内存。此外,ZGC 还致力于避免全局 JVM 暂停,从而提高系统的可用性。简单来说,它的设计目标是在不超过 10 毫秒的暂停时间内,尽可能地回收大量的堆内存。低延迟:ZGC 的主要目标是最小化 GC 暂停时间。

14个Java并发容器,你用过几个?

不考虑多线程并发的情况下,容器类一般使用ArrayList、HashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMap、ArrayBlockingQueue等线程安全的容器类,虽然牺牲了一些效率,但却得到了安全。上面提到的线程安全容器都在java.util.concurrent包下,这个包下并发容器不少,今天全部翻出来鼓捣一下。仅做简单介绍,后续再分别深入探索。ConcurrentHashMap:并发版HashMap。

MySQL主从复制(基于binlog日志方式)

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。主从复制的作用1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。2.架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。3.读写分离,使数据库能支撑更大的并发。a.从服务器可以执行查询工作(就是我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)

RabbitMQ安装

windows上安装过程&#xff1a;https://blog.csdn.net/linsongbin1/article/details/80170567运行中给新建用户赋权限&#xff0c;如果界面创完用户忘给权限了可以用这个方法&#xff1a;https://blog.csdn.net/hello_world_php/article/details/83859767 备注&#xff1a;我的…

Complete C# Unity Game Developer 2D

你会学到什么 从头开始学习C#&#xff0c;一门强大的现代语言。没有编程经验是必要的。 在使用Unity游戏引擎方面变得优秀。 为游戏设计和游戏开发打下坚实的基础&#xff0c;这将有助于您构建自己的游戏。 了解面向对象编程在实践中如何工作。 创建可玩的游戏项目——对你的投…

玩转android自定义控件二——自定义索引栏listview

带索引栏的listview&#xff0c;在android开发非常普遍&#xff0c;方便用户进行字母索引&#xff0c;就像微信通讯录这样&#xff1a; 今天&#xff0c;我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了&#xff0c;我们应当梳理出一个思路。 ①首先应当将字母…

172. 阶乘后的零

给定一个整数 n&#xff0c;返回 n! 结果尾数中零的数量。 示例 1: 输入: 3 输出: 0 解释: 3! 6, 尾数中没有零。示例 2: 输入: 5 输出: 1 解释: 5! 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。 话不多说&#xff0c;先上代码&#xff1a; class So…

Mysql函数group_concat、find_in_set 多值分隔字符字段进行数据库字段值翻译

Mysql函数group_concat、find_in_set进行数据库字段值翻译 场景 配方表&#xff1a;记录包含的原料 sources表示原料&#xff0c;字段值之间用逗号分隔 原料表&#xff1a;对应原料id和原料名称 现需要查询出的原料结果显示为原料名称&#xff0c;并以逗号分隔。可通过函数g…

网站速度优化-前端篇

2019独角兽企业重金招聘Python工程师标准>>> 页面中最好不要有js片段&#xff0c;合并多个js为一个js&#xff0c;并将js压缩 &#xff08;百度搜索&#xff0c;有在线js压缩、解压缩工具&#xff09;&#xff0c;并放在文档底部页面中最好不要有css片段&#xff0c…

HashMap总结

为什么用HashMap HashMap是一个Hash桶(数组链表)&#xff0c;桶存储的内容是键值对(Key-value)映射HashMap采用了数组和链表的数据结构&#xff0c;能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized&#xff0c;所以HashMap很快(哈哈哈)与HashT…