一、Synchronized修饰实例方法,实际上是对调用该方法的对象加锁,俗称“对象锁”

情况一:​同一个对象在两个线程中分别访问该对象的两个同步实例方法

结果:会产生互斥​

原因:因为锁针对的是对象,当对象调用​一个synchronized方法时,其他同步方法需要等待其执行结束并释放锁之后才能执行

例子:

synchronized修饰实例方法情况一

​运行结果:(可能出现的情况)

1、Thread-0

得到锁​-->10s之后-->Thread-0

释放锁-->Thread-1

得到锁​-->Thread-1

释放锁​

2、Thread-1

得到锁​-->Thread-1

释放锁-->​​Thread-0

得到锁​-->10s之后-->Thread-0

释放锁

情况二:不同对象在两个线程中分别调用同一个​同步实例方法

结果:不会互斥

原因:因为是两个对象,锁针对的是对象,并不是方法,所以可以并发执行,不会互斥。

例子:

synchronized修饰实例方法情况二

​运行结果:(可能出现的情况)

1、​Thread-0

得到锁​-->Thread-1

得到锁​-->Thread-1

释放锁​-->10s之后-->Thread-0释放锁

2、Thread-1 得到锁​-->Thread-1

释放锁-->​​Thread-0

得到锁​-->10s之后-->Thread-0

释放锁

3、​Thread-0

得到锁​-->Thread-1

得到锁-->​​Thread-1

释放锁​-->10s之后-->Thread-0

释放锁

4、​Thread-1

得到锁​-->Thread-0

得到锁-->​​Thread-1

释放锁​-->10s之后-->Thread-0

释放锁​

二、Synchronized修饰静态方法,实际上是对该类对象,俗称“类锁”​

情况一:用类直接在两个线程中调用两个不同的同步静态方法

结果:会产生互斥

原因:因为对静态方法加锁,实际上是对类加锁,类只有一个。因此当一个同步静态方法被访问时,该类已处于被锁状态。此时其他同步静态方法不能被访问​(未用Synchronized修饰的静态方法仍可以访问)

例子:

synchronized修饰静态方法情况一

​运行结果:(可能出现的情况)

1、Thread-1 得到锁-->Thread-1

释放锁-->Thread-0

得到锁-->10s之后-->Thread-0 释放锁

2、​Thread-0

得到锁-->10s之后-->Thread-0

释放锁-->Thread-1 得到锁-->Thread-1释放锁

情况二:用一个类的静态对象在两个线程中调用同步静态方法

结果:会产生互斥

原因:与​​同一个对象在两个线程中分别访问该对象的两个同步实例方法情况相同。本质上还是对类的加锁

例子:

synchronized修饰静态方法情况二

​运行结果:(可能出现的情况)

1、Thread-0 得到锁-->10s之后-->Thread-0

释放锁-->Thread-1 得到锁-->Thread-1 释放锁

2、​Thread-1

得到锁-->Thread-1 释放锁-->Thread-0

得到锁-->10s之后-->Thread-0 释放锁

​情况三:一个对象在两个线程中分别调用一个同步静态方法和一个同步实例方法

结果:不会产生互斥

原因:虽然是一个对象调用,但是两个方法的锁类型不同,调用静态方法实际上是对类对象在调用,而调用实例方法实际上是对实例对象在调用。因为这两个方法并不是一个对象锁,因为不会互斥,会并发执行

例子:

synchronized修饰静态方法情况三

​运行结果:(可能出现的情况)

1、Thread-0 得到锁-->Thread-1

得到锁-->10s之后-->Thread-1

释放锁-->Thread-0 释放锁

2、Thread-0 得到锁-->Thread-1

得到锁-->10s之后-->Thread-0

释放锁-->Thread-1 释放锁​

3、Thread-1 得到锁-->Thread-0

得到锁-->10s之后-->Thread-0

释放锁-->Thread-1

释放锁​​

3、Thread-1 得到锁-->Thread-0

得到锁-->10s之后-->Thread-1

释放锁-->Thread-0释放锁​

​三、结论

​1、静态方法的锁和实例方法的锁,默认是不同的对象锁

2、静态方法加锁,能和该类中所有用synchronized修饰静态方法的相互互斥,和​未用synchronized修饰的静态方法不互斥

3、静态​方法锁实际是对类对象加锁,实例方法加锁实际是对实例对象加锁

四、参考文章

java synchronized 静态_Java之Synchronized修饰实例方法和静态方法相关推荐

  1. java synchronized静态_Java中Synchronized的用法(简单介绍)

    简单介绍 synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调 ...

  2. java synchronized 使用_Java中Synchronized的用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...

  3. java 内存 静态_Java内存的 静态方法和实例方法的区别及使用场景

    注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...

  4. java static 可见性_Java多线程 synchronized与可见性的关系以及可见性问题总结

    作者:七里香的编程之路 出自:OSCHINA 原文:my.oschina.net/u/4098550/blog/4548274 能保证可见性的措施 除了volatile 可以让变量保证可见性外.hap ...

  5. java synchronized 使用_Java中synchronized的使用实例

    Java中synchronized的使用实例 synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C.D等)正在用这个 ...

  6. java全局变量加锁_Java锁Synchronized,对象锁和类锁举例

    4. 同步加锁的是对象,而不是代码.因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可. 5. 不同的对象实例的synchronized方 ...

  7. synchronized 异常_Java:synchronized的深度解析

    一.简介 1.作用 能够保证在同一时刻最多只有一个线程执行该代码,以保证并发安全的效果. 2.地位 Synchronized是Java关键字,Java原生支持 最基本的互斥同步手段 并发编程的元老级别 ...

  8. java 内存 静态_java中内存分配以及static的用法(转)

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  9. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...

最新文章

  1. 常考数据结构与算法:最小的k个数
  2. 【3】python核心编程 第六章-序列:字符串、列表和元组
  3. BUAA-OO-2019 第三单元总结
  4. 三维插值(MATLAB)——TriScatteredInterp/scatteredInterpolant函数
  5. Android 系统(260)---Android 读取SIM卡参数
  6. 【转】凡是能拉进与妹子距离的产品都是好产品
  7. asp.net 读写 XML 小结
  8. [120_移动开发Android]012_android开发之动画播放
  9. Android适配之百分比的简单用法
  10. 组建局域网_组网方案图文教程,双路由器有线搭建网络,公司家庭组建局域网...
  11. [USACO06DEC]最少的硬币The Fewest Coins
  12. 自己做量化交易软件(12)通通量化AI框架的使用1-与通通AI对话聊天
  13. ssm与springboot常见注解
  14. Linux服务器下载日志到本地
  15. java和js实现省市县级连
  16. putty软件下载和教程
  17. 保险从业人员有资格证书,每年还要继续教育吗
  18. 计算机程序UI设计员SWOT分析,计算机专业学生个人SWOT分析案例.doc
  19. 在linux下安装五笔和微软字体
  20. 2021年G2电站锅炉司炉免费试题及G2电站锅炉司炉考试试卷

热门文章

  1. 征服用计算机弹法,征服WIN7
  2. 服务器图文消息发送规则,群发图文规则 - CurtainRight的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. html5的新标记,HTML5 新标记
  4. 计算机组装与维护预实验报告,计算机组装与维护实验报告.doc
  5. eclipse导入项目pom文件报错_eclipse导入maven管理的项目时,pom.xml第一行报错。错误如图1。而且dubbo的xml也不识别。...
  6. html异形轮播,异形滚动
  7. numpy将bool值转换成数值
  8. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 23丨学生们参加各科测试的次数【难度简单】​
  9. Java Web开发技术详解~MIME类型
  10. 单招湖南工业技术学院计算机难吗,解读湖南三一工业职业技术学院单招考试难吗...