首页 > 其他分享 >synchronized 原理

synchronized 原理

时间:2023-11-22 15:44:06浏览次数:31  
标签:同步 synchronized Phone new 原理 方法 邮件

  • 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,
    其他线程都只能等待,换句话说,某一个时刻内,只能有唯一的一个线程去访问这些synchronized方,
    锁的是当前对象this,被锁定后,其他的线程都不能进入到当前对象的其他synchronized方法
  • 对于普通 synchronized同步方法,锁的是实例对象(对象锁),而静态 static synchronized同步方法,锁的是整个类(类锁)
  • 所有的普通同步方法用的都是同一把锁--------实例对象本身,就是new出来的具体实例对象,本类this
  • 所有的静态同步方法用的也是同一把锁--------类对象本身,Class
  • 具体的实例对象this和唯一模板Class,是两个不同的对象,所以静态同步方法和普通同步方法是不会有竟态条件

    以下是示例代码,可以自己注释模拟以下8种情况,更加深刻体会synchronized的锁原理

         ab两个线程:

  1. 标准访问,先打印邮件还是短信
  2. sendEmail方法中加入暂停3s钟,先打印邮件还是短信
  3. 添加一个普通hello方法,先打印邮件还是hello
  4. 有两部手机,new 两个 Phone,先打印邮件还是短信
  5. 有两个静态同步方法,1部手机,先打印邮件还是短信
  6. 有两个静态同步方法,2部手机,先打印邮件还是短信
  7. 有一个静态同步方法,有一个普通同步方法,有1部手机,先打印邮件还是短信
  8. 有一个静态同步方法,有一个普通同步方法,有2部手机,先打印邮件还是短信

     1 class Phone{
     2     public static synchronized void sendEmail()throws Exception {
     3           TimeUnit.SECONDS.sleep(3);
     4           System.out.println("-----sendEmail");  
     5     }
     6 
     7     public synchronized void sendSms() {
     8           System.out.println("-----sendSms");  
     9     }
    10 
    11     public void hello() {
    12           System.out.println("-----hello");  
    13     }
    14 }
    15 
    16 public class Lock8Demo{
    17 
    18     Phone phone1 = new Phone();
    19     Phone phone2 = new Phone();
    20 
    21     public static void main(String[] args){
    22         new Thread(()->phone1.sendEmail()).start();
    23         new Thread(()->phone1.sendSms()).start();
    24         new Thread(()->phone1.hello()).start();
    25         new Thread(()->phone2.sendEmail()).start();
    26     }
    27 }    

     

标签:同步,synchronized,Phone,new,原理,方法,邮件
From: https://www.cnblogs.com/luoq996/p/17849103.html

相关文章

  • Beamforming 原理和背景
    转自知乎 https://zhuanlan.zhihu.com/p/110251527关于Beamforming,现在越来越多的走入了实际生活中。最先将Beamforming带入实际生产生活中的应该是802.11n,但当时还是optional,而不是critical,直接导致大部分当时的产品没有上Beamforming技术。如今,技术的发展,Beamforming已经......
  • 上拉电阻和下拉电阻 原理
    1.拉电流和灌电流电子元器件在广义上分为有源器件和无源器件。有源器件需要电源(能量)才能实现其特定的功能,比如运算放大器在有输入信号的前提下,如果不提供电源,运算放大器无法实现其放大功能。无源器件在工作时,不需要外加电源,只要输入信号就能正常工作,比如在信号线上串联33Ω的......
  • 原生开发与Hybrid App的流程对比与原理解析
    狭义的Hybrid:也是现在大家普遍认知的,Hybrid就是一种给WebView增加一些js通信可以调用原生API的方式。广义Hybrid:前端的开发思路与客户端原生的开发思路相结合。通过原生的配合,把原本jsor前端开发做不到的事情做到了,用原生的方式增强了原本的前端技术能力。WebVie......
  • 第三方登录实现及基本原理
    一、什么是第三方登录?简单来讲,就是用户可以通过已有网站或应用的账号,登录我们自己的应用;如常见的QQ,微信,微博;效果是,如果不需要在我们应用再次注册账户,直接使用QQ,微信,微博等平台账户就可以登录我们的应用。如图: 第三方登录解决了什么问题?降低用户使用产品的门槛;因为,注册和登......
  • VUE框架实现原理及代码构成结构详解------前端
    VUE框架实现原理及代码构成结构详解------VUE框架<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title&......
  • day01 容器化的几种架构方式-pod创建过程原理-Scheduler的多种调度策略总结 (1.1-1.3
    一、容器化的几种架构方式1.、容器的由来及变迁史Docker->Docker-compose->Docerswarm->Kubernetes2、微服务容器化的几种解决方案特性DockerSwarm  Kubernetes安装和集群配置安装简单,集群不强大但在很复杂,集群非常强大图形用户界面没有官方图形界面,依托......
  • 回声消除原理、算法-LMS(Least Mean Square)
    回声消除是语音通信前端处理中的一种重要技术,产生的原因是:在实时音视频通话中,扬声器播放的声音有再次录进了麦克风去。在即时通讯应用中,需要进行双方,或是多方的实时语音交流,在要求较高的场合,通常都是采用外置音箱放音,这样必然会产生回音,即一方说话后,通过对方的音箱放音,然后又被对......
  • C++与Lua交互之配置&交互原理&示例
    Lua简介Lua是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放。某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为。而修改函数行为这种事,很难用简单的更改数据的方式来实现,若在源代码层面上改又得重新编译生成,导......
  • 滚动更新和回滚部署在 Kubernetes 中的工作原理
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。在过去的几年中,Kubernetes在生产环境中被广泛使用,它通过其声明式API提供了大量解决方案,用于编排容器。Kubernetes的一个显著特性是其具有弹性的能力,能够执行滚动更新和回滚部署,而能够完成这......
  • 关于AD原理图中的Floating Net Label错误
    编译之后提示如下:直接双击错误跳转这是说标签浮空,没有连接到导线上这里将导线和电阻重新连接,就解决了报错还有另外一种常见的错误如下:这是标签没有连接到导线上,放大原理图并选中标签,结果如下标签左下角有个十字,必须将它放到导线上,放完之后即可解决问题(如果不好调整可以......