全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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小时内与您取得联系。