Java中Synchronized和Static Synchronized的区别及说明

 更新时间:2025年05月16日 16:40:21   作者:二六八  
这篇文章主要介绍了Java中Synchronized和Static Synchronized的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Synchronized和Static Synchronized的区别

synchronized 是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是 “类的当前实例” , 类的两个不同实例就没有这种约束了。

那么 static synchronized 恰好就是要控制类的所有实例的访问了, static synchronized 是限制线程同时访问jvm中该类的所有实例同时访问对应的代码块。

一个日本作者-结成浩的《java多线程设计模式》

一个列子

pulbic class Something(){
    public synchronized void isSyncA(){}
    public synchronized void isSyncB(){}
    public static synchronized void cSyncA(){}
    public static synchronized void cSyncB(){}

那么,加入有Something类的两个实例a与b

下列组方法何以被1个以上线程同时访问呢

a. x.isSyncA()与x.isSyncB() 
b. x.isSyncA()与y.isSyncA()
c. x.cSyncA()与y.cSyncB()
d. x.isSyncA()与Something.cSyncA()
  • a . 都是对同一个实例的synchronized域访问,因此不能被同时访问
  • b . 是针对不同实例的,因此可以同时被访问
  • c . 因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()Something.isSyncB()了,因此不能被同时访问。
  • d . 可以被同时访问的,理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。

说下结论:

  • A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
  • B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。

总结

有如下几点:

  1. 对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性
  2. 在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样。
  3. 关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同。比如 new A().x()new A().x(),对象不同,锁不同,如果A的单利的,就能互斥。
  4. 静态方法加锁,能和所有其他静态方法加锁的 进行互斥。
  5. 静态方法加锁,和xx.class 锁效果一样,直接属于类的。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java 内存溢出的原因和解决方法

    Java 内存溢出的原因和解决方法

    这篇文章主要介绍了Java 内存溢出的原因和解决方法,帮助大家更好的维护Java程序,保持稳定性,感兴趣的朋友可以了解下
    2020-12-12
  • SpringBoot使用Mybatis-Plus中分页插件PaginationInterceptor详解

    SpringBoot使用Mybatis-Plus中分页插件PaginationInterceptor详解

    文章介绍SpringBoot高版本中使用MyBatisPlusInterceptor替代旧分页插件,需配置多个InnerInterceptor功能模块(如分页、多租户、动态表名等),并强调插件顺序和mapper.xml中SQL语句不能以分号结尾,以避免分页语法错误
    2025-07-07
  • Mybatis分页的实现及使用注解开发操作

    Mybatis分页的实现及使用注解开发操作

    这篇文章主要介绍了Mybatis分页的实现及使用注解开发操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • tomcat请求流程源码解进阶篇

    tomcat请求流程源码解进阶篇

    这篇文章主要为大家介绍了tomcat请求流程源码解进阶,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java实现水仙花数的计算

    java实现水仙花数的计算

    这篇文章主要为大家详细介绍了java实现水仙花数的计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java并发编程包中atomic的实现原理示例详解

    Java并发编程包中atomic的实现原理示例详解

    这篇文章主要给大家介绍了关于Java并发编程包中atomic的实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Java HashMap底层实现原理

    Java HashMap底层实现原理

    HashMap在不同的JDK版本下的实现是不同的,在JDK1.7时,HashMap 底层是通过数组+链表实现的;而在JDK1.8时,HashMap底层是通过数组+链表或红黑树实现的,本详细介绍了HashMap底层是如何实现的,需要的朋友可以参考下
    2023-05-05
  • 用Java打造简易计算器的实现步骤

    用Java打造简易计算器的实现步骤

    这篇文章主要介绍了如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • java的Map集合中按value值进行排序输出的实例代码

    java的Map集合中按value值进行排序输出的实例代码

    下面小编就为大家带来一篇java的Map集合中按value值进行排序输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Spring定时任务@Scheduled注解(cron表达式fixedRate fixedDelay)

    Spring定时任务@Scheduled注解(cron表达式fixedRate fixedDelay)

    这篇文章主要为大家介绍了Spring定时任务@Scheduled注解(cron表达式fixedRate fixedDelay)使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11

最新评论