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程序中foreach用法示例

    java程序中foreach用法示例

    这篇文章主要介绍了java程序中foreach用法示例,需要的朋友可以参考下
    2014-04-04
  • java飞行棋实现思路

    java飞行棋实现思路

    这篇文章主要为大家详细介绍了java飞行棋的实现思路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • Java中Executor和Executors的区别小结

    Java中Executor和Executors的区别小结

    在Java并发编程中,Executor是一个核心接口,提供了任务执行的抽象方法,而Executors是一个工具类,提供了创建各种线程池的工厂方法,Executor关注任务的执行,而Executors关注如何创建适合的执行器,感兴趣的可以了解一下
    2024-10-10
  • SpringMVC整合SSM实现表现层数据封装详解

    SpringMVC整合SSM实现表现层数据封装详解

    这篇文章主要介绍了SpringMVC整合SSM实现表现层数据封装,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • Spring和SpringMVC扫描注解类冲突的解决方案

    Spring和SpringMVC扫描注解类冲突的解决方案

    这篇文章主要介绍了Spring和SpringMVC扫描注解类冲突的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java用Arrays.asList初始化ArrayList实例方法

    Java用Arrays.asList初始化ArrayList实例方法

    在本篇文章里小编给大家分享的是关于Java中使用Arrays.asList初始化ArrayList的知识点内容,需要的朋友们参考下。
    2019-10-10
  • windows 32位eclipse远程hadoop开发环境搭建

    windows 32位eclipse远程hadoop开发环境搭建

    这篇文章主要介绍了windows 32位eclipse远程hadoop开发环境搭建的相关资料,需要的朋友可以参考下
    2016-07-07
  • 基于springboot+enum配置化的方法

    基于springboot+enum配置化的方法

    本文主要介绍利用Springboot结合枚举类enum进行自定义参数的初始化和应用,通过@Value注解实现参数的动态注入,以实现灵活可维护的配置管理,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • Java微信授权登录小程序接口流程

    Java微信授权登录小程序接口流程

    微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码,下面给大家介绍Java微信授权登录小程序接口流程,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • SpringBoot和前端联动实现存储浏览记录功能

    SpringBoot和前端联动实现存储浏览记录功能

    这篇文章主要介绍了SpringBoot和前端联动实现存储浏览记录功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01

最新评论