synchronized修饰静态方法和普通方法的区别

【Android面试八股文】synochnized修饰普通方法和静态方法的区别?什么是原子性、可见性、有序性? 是否了解Java并发编程的相关知识synchronized 关键字可以修饰方法,也可以使用 synchronized(obj) {} 定义同步代码块。通过修饰方法或代码块,可以确保在同一时间只有一个线程能够访问被修饰的代码,从而保证线程安全。正确的方式是使用 synchronized(this) 来锁定当前实例对象,以及使用 synchronized(Classname.class) 来锁定当前类对象。 阅读详情

synchronized具有同步功能,是一种互斥锁,锁的是对象,synchronized修饰普通方法时,锁对象是this对象。修饰静态方法时,锁对象是字节码文件对象。
synchronized可以用来修饰代码块和方法。
synchronized可以保证原子性,有序性,可见性。

synchronized的缺点:
1、synchronized底层是由jvm实现,因此不能手动控制锁的释放,不如lock锁灵活,synchronized修饰的方法一旦出现异常,jvm保证锁会被释放(lock锁需要在finally中释放)。
2、synchronized是非公平锁,不保证公平性。

2、同步方法
synchronized修饰普通方法

public synchronized void run()  {
    System.out.println(1);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(2);
}

使用同一对象访问

Demo demo = new Demo();
new Thread(() -> demo.run()).start();
new Thread(() -> demo.run()).start();

那么结果是同步的
在这里插入图片描述
如果使用不同的对象访问

Demo demo = new Demo();
new Thread(() -> demo.run()).start();
Demo demo2 = new Demo();
new Thread(() -> demo2.run()).start();

那么结果可能不会同步,因为synchronized修饰普通方法时锁对象是this对象,而使用两个对象去访问,不是同一把锁。

在这里插入图片描述

synchronized修饰静态方法

public static synchronized void run()  {
   System.out.println(1);
   try {
       Thread.sleep(1000);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
   System.out.println(2);
}

使用不同的对象访问

Demo demo = new Demo();
new Thread(() -> demo.run()).start();
Demo demo2 = new Demo();
new Thread(() -> demo2.run()).start();

可以看到结果是同步的,因为当修饰静态方法时,锁对象是class字节码文件对象,而两个对象是同一个class文件,所以使用的是一个锁。

在这里插入图片描述

java synchronized同步静态方法和同步非静态方法的异同 主要介绍了java synchronized同步静态方法和同步非静态方法的异同的相关资料,需要的朋友可以参考下 立即下载

相关推荐

Centos7搭建OpenStack+创建iaas云主机

主要说明在控制节点和计算节点上,通过脚本的形式,安装OpenStack的iaas安装步骤和创建可运行的云主机。提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

weixin_48218106的博客 1万+

Synchronized加在静态方法和普通方法的区别

当多个线程同时访问同一个共享对象的同步方法时,synchronized可以确保每个线程依次执行方法中的代码块,从而防止多个线程同时修改对象的状态,从而导致数据不一致的问题。相反,如果一个类中有多个普通方法,这些方法都加上了synchronized关键字,那么这些方法将会使用不同的对象作为锁。这意味着即使有多个线程同时访问这些方法,只要它们操作的是不同的对象,它们也可以并发执行,因为每个对象都有自己的锁。这意味着同一时刻只有一个线程可以访问这些方法,即使这些方法操作的是不同的对象。

qq_46130027的博客 1341

颠覆性创新的测量框架与跨领域实证分析

颠覆性创新作为科技发展的重要驱动力,其核心在于实现知识体系的范式转换。从技术原理看,这类创新通常具备知识替代、网络重构和跨领域渗透三大特征,通过引用网络分析和文本挖掘等方法可量化评估其影响力。在工程实践中,CD指数、DI指数等测量工具帮助研究者识别具有突破潜力的成果,而深度学习等新兴技术进一步提升了评估精度。当前AI、半导体等领域的热门技术发展表明,模块化架构和产业协同能有效促进颠覆性创新。面对全球范围内创新颠覆性下降的趋势,优化科研评价体系、构建跨学科协作网络成为关键应对策略。

weixin_29735807的博客 321

Java 并发编程面试题总结(一)

周末写

Mr.Dong的博客 334

ChatBI告别“NL2SQL依赖症”!从准确率50%到90%,3大技术路线+4个企业案例拆解核心玩法

摘要: ChatBI通过自然语言交互实现数据民主化,其核心是“语义理解+数据执行+知识沉淀”的全链路能力,而非单一的NL2SQL技术。行业采用三大技术路线提升准确率:专有知识库(提升30%)、指标标签语义层(准确率85%)、JSON中间层(多轮对话提升25%)。数据执行方案包括NL2SQL、NL2API等,需结合场景选择。企业落地需解决四大痛点:跨表查询准确率低(引入拓扑图)、模糊查询(用户干预机制)、响应慢(预计算缓存)、多轮对话(上下文池)。Spring AI Alibaba提供轻量级集成方案,助力企业

weixin_52610848的博客 1650

CMMI AIM 人工智能成熟度框架:31个过程域的157项AI实践集成

CMMI AIM人工智能成熟度框架为企业提供了系统化管理AI项目全生命周期的解决方案,包含31个过程域的157项AI实践。该框架通过四个演进阶段(混沌与风险、结构与凝聚、验证与信任、价值与增长),帮助组织建立可持续的AI能力成长路径,降低项目失败率并提升商业价值。

weixin_42613501的博客 346

sychronied修饰普通方法和静态方法的区别?什么是可见性?

sychronied修饰普通方法和静态方法的区别?什么是可见性? 对象锁是用于对象实例方法,或者一个对象实例上的 类锁:作用于类的静态方法或者一个类的class对象上的. 我们知道类的对象有很多个,但是每一个类 只有一个class对象,所以不同对象实例的对象锁是互相不干扰的,但是每个类只有一个类锁 类锁其实锁的是每一个类的对应的class对象,类锁和对象锁之间是相互不干扰的 可见性是指多个线程访问同一个变量时候,其中一个线程修改了这个变量的值,其他线程能够立即看到修...

qq_26414049的博客 729

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 717

synchronized修饰静态方法和普通方法有什么区别

在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。 在static方法前加synchronizedstatic:静态方法属于类方法,它属于这个类,获取到的锁,是属于类的锁。 在普通方法前加synchronizedstatic:非static方法获取到的锁,是属于当前对象的锁。

qq_35181209的博客 1万+

PX4从放弃到精通(五):PX4中的姿态表示方法及转换关系

文章目录机体坐标系与地理坐标系一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 机体坐标系与地理坐标系 在实际应用中,加速度计的测量轴是由运动平台安装固定此器件的轴向决定的。这些坐标轴就形成了载体坐标系,定义如下: 坐标原点设在载体质心(这样可简化运动方程的推导); y轴指向载体前方,称为横滚轴,横滚角以y轴为起始旋转轴而得到,符合右手定则; x轴与y轴夹角90°,指向载体横向,称为俯仰轴,俯仰角以x轴为起始旋转轴而得到,符合右手定则; z轴与x轴、y轴构成右手笛卡儿坐标系,指向载体垂直方向

超维空间科技的博客 8110

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1547

synchronized修饰静态方法与普通方法的区别详解

synchronized修饰静态方法与普通方法的区别详解

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 6859

多物理场耦合仿真-主题032-电磁-流体耦合

电磁-流体耦合,即磁流体动力学(MHD, Magnetohydrodynamics),是研究导电流体在电磁场中运动规律的学科,涉及电磁场与流体力学的深度耦合。本主题系统阐述磁流体动力学的基本理论、控制方程和数值方法。首先介绍MHD的基本概念和物理基础,包括导电流体的性质、电磁场基本方程;然后详细推导MHD控制方程组,包括连续性方程、动量方程、能量方程和电磁场方程;接着讨论MHD流动的特征参数,如Hartmann数、磁雷诺数、相互作用参数等;最后通过六个典型工程案例展示MHD分析的实际应用,包括电磁泵、磁流体

2401_87715305的博客 423

Java面试必备:Synchronized修饰静态方法和修饰普通方法的区别

在Java多线程编程中,`synchronized`关键字是保证线程安全的重要工具。它可以修饰代码块、普通方法和静态方法,但不同用法之间的区别常常让开发者感到困惑。本文将重点探讨`synchronized`修饰静态方法与普通方法的区别,并通过流程图帮助理解这些概念。

qq_58299462的博客 951

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Synchronized 修饰静态方法和修饰普通方法有什么区别?

在 Java 中,关键字用于实现线程同步,确保多线程环境下共享资源的安全访问。当它修饰静态方法和普通(非静态)方法时,核心区别在于,这直接影响了同步的范围和效果。this。

weixin_43521001的博客 457

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于java线程锁synchronized修饰普通方法与静态方法的区别

最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下:   private static int num=0;   private synchronized void printNum(String tag){     try {     if(tag.equals("a")){       n...

代码学习之路的博客 284

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

synchronized 修饰普通方法与静态方法的区别

面试时候被问的问题,当时脑子里闪了一下,但是没答出来 先说结论: synchronized 修饰普通方法时,锁的是当前对象的方法,等价于 synchronized (this) synchronized 修饰静态方法时,锁的是所有对象的方法,等价于 synchronized (Xxx.class) 我们知道,普通方法从属于对象,而静态方法从属于类 带着疑惑,来看代码吧 情景1:当 synchronized 修饰 普通方法后,同一个对象被两个线程调用 结果 public class TestM.

HappyCode 1814

Java多线程--synchronized修饰普通方法和修饰静态方法的区别

初始化一个对象时,会自动生成一个与该对象对应的对象锁,被synchronized 修饰的方法就得依靠对象锁工作。当多线程同时访问某个被synchronized修饰的方法时,一旦某个进程抢得对象锁之后,其他的进程只有排队对待。 一、synchronized修饰普通方法 初始化一个对象时,会自动生成一个与该对象对应的对象锁,被synchronized 修饰的方法就得依靠对象锁工作。当多线程同时...

学亮编程手记 1641

synchronized修饰普通方法和静态方法区别

synchronized关键字修饰普通方法时,获得的锁是对象锁,也就是this对应的实例,如果多个线程通过不同的对象来调用方法,那么他们的锁就是不一样的,不会造成阻塞。 而修饰静态方法时,锁是类锁,也就是类名.class,多个线程调用该类的同步的静态方法时,都会阻塞。 ...

MrLiar的博客 1588

synchronized修饰静态方法和普通方法的区别 和 应用

synchronized 修饰静态方法和实例方法的区别

qq_34654085的博客 550

synchronized修饰静态方法、普通方法与代码块的区别.

https://www.jianshu.com/p/3cfdf32bd37e

今晚会有星星么 692

synchronized修饰普通方法与静态方法的区别及可见性解析

可见性是指当一个线程修改了共享变量的值后,其他线程能够立即感知到这个修改的特性。CPU缓存不一致:各线程可能读取自己CPU缓存中的副本指令重排序:编译器和处理器优化可能导致代码执行顺序改变。

斗锋在干嘛的博客 985
上一篇: String不可改变的类
下一篇: spring boot整合mybatis plus
ROAOR1
博客等级 码龄9年 33粉丝 38原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值