Java 同步锁(synchronized)详解及实例

Java中cpu分给每个线程的时间片是随机的并且在Java中好多都是多个线程共用一个资源,比如火车卖票,火车票是一定的,但卖火车票的窗口到处都有,每个窗口就相当于一个线程,这么多的线程共用所有的火车票这个资源。如果在一个时间点上,两个线程同时使用这个资源,那他们取出的火车票是一样的(座位号一样),这样就会给乘客造成麻烦。比如下面程序:
package com.pakage.ThreadAndRunnable;
public class Runnable_demo implements Runnable{
private int ticket=10;
public Runnable_demo(){
}
@Override
public void run() {
for(int i=0;i<20;i++){
if(this.ticket>0){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票");
}
}
}
public static void main(String args[]){
Runnable_demo demo=new Runnable_demo();
//基于火车票创建三个窗口
new Thread(demo,"a").start();
new Thread(demo,"b").start();
new Thread(demo,"c").start();
}
}
程序运行结果:
我们可以看到c号窗口和和b号窗口都卖出了10号票,并且a号和b号窗口分别卖出了0号和-1号票。造成这种情况的原因是1、c线程和b线程在ticket=10的时候,c线程取出10号票以后,ticket还没来的及减1,b线程就取出了ticket此时ticket还等于10;2、在ticket=1时,c线程取出了1号票,ticket还没来的及减1,a、b线程就先后进入了if判断语句,这时ticket减1了,那么当a、b线程取票的时候就取到了0号和-1号票。
出现了上述情况怎样改变呢,我们可以这样做:当一个线程要使用火车票这个资源时,我们就交给它一把锁,等它把事情做完后在把锁给另一个要用这个资源的线程。这样就不会出现上述情况。 实现这个锁的功能就需要用到synchronized这个关键字。
synchronized这个关键字有两种用法1、放方法名前形成同步方法;2、放在块前构成同步块。
1、使用同步方法将上面的例子该为:
package com.pakage.ThreadAndRunnable;
public class Runnable_demo implements Runnable{
private int ticket=10;
public Runnable_demo(){
}
@Override
public void run() {
for(int i=0;i<20;i++){
if(this.ticket>0){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
this.sale();
}
}
}
public synchronized void sale(){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票");
}
}
public static void main(String args[]){
Runnable_demo demo=new Runnable_demo();
//基于火车票创建三个窗口
new Thread(demo,"a").start();
new Thread(demo,"b").start();
new Thread(demo,"c").start();
}
}
程序的输出结果为:
2、使用同步块修改上面的例子:
package com.pakage.ThreadAndRunnable;
public class Runnable_demo implements Runnable{
private int ticket=10;
public Runnable_demo(){
}
@Override
public void run() {
for(int i=0;i<20;i++){
<span style="color:#ff0000">synchronized</span>(this){
if(this.ticket>0){
//休眠1s秒中,为了使效果更明显,否则可能出不了效果
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票");
}
}
}
}
public static void main(String args[]){
Runnable_demo demo=new Runnable_demo();
//基于火车票创建三个窗口
new Thread(demo,"a").start();
new Thread(demo,"b").start();
new Thread(demo,"c").start();
}
}
程序的输出结果:
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java
# 同步锁
# synchronized
# 同步锁详解
# Java中的synchronized有几种加锁方式(实例详解)
# java synchronized 锁机制原理详解
# 解析Java编程之Synchronized锁住的对象
# Java同步锁synchronized用法的最全总结
# java中synchronized锁的升级过程
# Java Synchronized锁失败案例及解决方案
# Java synchronized的锁升级过程详解
# 一文详细讲解Java中有哪些锁
# 出了
# 没来
# 都是
# 卖出了
# 都有
# 放在
# 多个
# 这么多
# 我们可以
# 希望能
# 这样做
# 要用
# 可以看到
# 这种情况
# 会给
# 有两种
# 谢谢大家
# 完后
# 给它
# 要使
相关文章:
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
建站主机SSH密钥生成步骤及常见问题解答?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
湖北网站制作公司有哪些,湖北清能集团官网?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
音乐网站服务器如何优化API响应速度?
制作销售网站教学视频,销售网站有哪些?
深圳网站制作案例,网页的相关名词有哪些?
定制建站方案优化指南:企业官网开发与建站费用解析
如何选择高效稳定的ISP建站解决方案?
高防服务器:AI智能防御DDoS攻击与数据安全保障
建站之星价格显示格式升级,你的预算足够吗?
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
如何优化Golang Web性能_Golang HTTP服务器性能提升方法
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
如何批量查询域名的建站时间记录?
Python lxml的etree和ElementTree有什么区别
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
太原网站制作公司有哪些,网约车营运证查询官网?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
建站主机与虚拟主机有何区别?如何选择最优方案?
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
建站之星代理如何获取技术支持?
html制作网站的步骤有哪些,iapp如何添加网页?
C++中引用和指针有什么区别?(代码说明)
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
孙琪峥织梦建站教程如何优化数据库安全?
如何在IIS管理器中快速创建并配置网站?
如何配置FTP站点权限与安全设置?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
,交易猫的商品怎么发布到网站上去?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
岳西云建站教程与模板下载_一站式快速建站系统操作指南
如何设计高效校园网站?
网站制作企业,网站的banner和导航栏是指什么?
如何构建满足综合性能需求的优质建站方案?
建站之星会员如何解锁更多建站功能?
如何快速查询网址的建站时间与历史轨迹?
宝塔建站后网页无法访问如何解决?
常州自助建站费用包含哪些项目?
网站制作公司,橙子建站是合法的吗?
网站制作难吗安全吗,做一个网站需要多久时间?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
建站之星CMS建站配置指南:模板选择与SEO优化技巧
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
*请认真填写需求信息,我们会在24小时内与您取得联系。