synchronized 修饰在 static方法和非static方法的区别

简介: Java中synchronized用在静态方法和非静态方法上面的区别在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个

Java中synchronized用在静态方法和非静态方法上面的区别

在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。

上代码

package TestSynchronizedStaticOrNot;

public class TestSynchronizedStaticOrNot {

    public static synchronized void staticFunction(String name)
            throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println(name + " --- static function running ...");
        }
    }

    public synchronized void function(String name) throws InterruptedException {
        for (int i = 0; i < 3; i++) {
            Thread.sleep(1000);
            System.out.println(name + " +++ function running ...");
        }
    }

    public static void main(String[] args) {

        final TestSynchronizedStaticOrNot demo = new TestSynchronizedStaticOrNot();

        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    staticFunction("1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread11 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    staticFunction("2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.function("1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread23 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    demo.function("12");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread thread22 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    new TestSynchronizedStaticOrNot().function("2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        thread11.start();
        thread1.start();
        thread2.start();
        thread23.start();
        thread22.start();
    }
}

这里写图片描述

根据结果很容分析到,加在类上面的锁,加载对象上面的锁。如果上了对象锁,同一个对象是不能再获取锁的,必须等待释放,如果是不同的实例还是可以去获取锁的。

那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。

目录
相关文章
|
8月前
|
数据采集 自然语言处理 监控
你的模型真的“学”会了吗?微调效果评估实战指南
本文系统讲解大模型微调效果评估的核心方法论:强调评估比训练更重要,涵盖目标对齐、技术指标(Loss/PPL/BLEU/ROUGE)、人工评估四维度、业务验证(A/B测试、端到端场景)、泛化性检验及四步实战流程,并提供避坑指南与工具建议。重在目标驱动、多层验证、快速闭环。(239字)
902 1
|
3月前
|
存储 缓存 前端开发
亿级图片业务落地全方案:阿里云OSS+CDN+数据万象完整架构搭建、降本70%实战教程
在电商、自媒体、本地生活、社区UGC等数字化业务高速扩张的2026年,海量商品图、用户晒单、短视频截图、宣传物料持续爆发式增长,大量中小团队初期选择自建图片服务器,随着素材规模突破百万甚至亿级,存储成本、图片处理延迟、全国访问卡顿、内容安全等多重瓶颈集中爆发,严重影响业务稳定性与运营成本。以中型电商平台真实业务为例,业务上线半年图片总量从100万暴涨至2亿张,单张原图平均3MB,日均新增80万张素材,传统NFS+ImageMagick自建架构在流量高峰期全线崩溃,缩略图生成延迟飙升至2秒,存储、带宽、服务器月度总成本突破8万元,还频繁出现存储单点故障导致全站图片404访问异常,运维团队需要3人
327 0
|
5月前
|
人工智能 移动开发 自然语言处理
2026互联网医院系统源码开发方案:APP+小程序+HIS一体化
随着智慧医疗快速发展,互联网医院系统正在成为医疗机构数字化转型的重要方向。本文从行业趋势出发,深入解析2026互联网医院系统源码开发方案,包括APP、小程序、HIS系统一体化搭建模式,并详细介绍在线问诊、电子处方、AI导诊、私有化部署等核心功能。适合医疗机构、创业团队及软件开发企业参考阅读。
|
6月前
|
监控 网络协议 Java
实测分享|安心联JT/T808车载监控系统单机支撑5万车辆高并发接入实战
本文基于普通i5办公主机(16GB内存),通过ZGC调优、轻量连接池与异步IO架构,实测单机稳定支撑5万JT/T 808终端长连接,峰值TPS 3356,平均延迟328ms,验证了低成本硬件实现高并发车载监控的可行性,为中小车队提供可复用的高性能单机方案。
|
7月前
|
数据采集 API 数据安全/隐私保护
新手必看:Python代理常见错误及快速修复方法
本文详解Python使用HTTP代理时的三类高频错误:代理连接失败、超时及身份验证错误,分别给出代码示例与实用解决方案,涵盖IP端口核对、timeout调优、认证方式适配等关键点,助你提升爬虫与API调用的稳定性。
|
9月前
|
存储
RAG 为什么总是“看起来能用,实际不好用”?
RAG效果不佳?问题往往不在模型,而在于文档切分。错误的切分会导致语义断裂、关键信息丢失,使召回内容“看似相关却无用”。本文深入剖析切分误区:固定长度切割、过度依赖overlap、忽视文档结构等,并提出核心原则——保障语义完整性。不同文档需定制切分策略,FAQ按问答切,技术文档依章节分,流程类保完整上下文。切分是RAG的地基,而非细节,唯有夯实,才能让检索与生成真正生效。
|
JSON API 开发者
闲鱼商品详情API接口(闲鱼API系列)
闲鱼商品详情API为开发者提供便捷、高效且合规的途径,获取闲鱼平台上特定商品的详细信息,如标题、价格、描述和图片等。该接口采用GET请求方式,需传入app_key、item_id、timestamp和sign等参数,返回JSON格式数据。示例代码展示了如何使用Python调用此API,包括生成签名和处理响应。开发者需替换实际的app_key、app_secret和商品ID,并关注官方文档以确保接口使用的准确性。
4065 1
|
人工智能 语音技术 决策智能
魔搭社区每周速递(9.28-10.12)
503个模型、189个数据集、82个创新应用、9篇应用文章
|
Ubuntu 开发者 Python
|
Java Maven
解决 idea maven plugins 报红波浪线
解决 idea maven plugins 报红波浪线
3908 5