java中synchronized的使用

Java中的synchronized关键字用于实现同步,确保在同一时刻只有一个线程可以访问特定的代码块或方法。synchronized可以应用于静态方法、非静态方法和代码块。以下是synchronized在不同场景下的互斥情况:

  1. 静态方法:

当synchronized作用于静态方法时,它锁定的是类的Class对象。在同一时刻,只有一个线程可以访问这个类的所有同步静态方法。其他线程需要等待锁释放。

java 复制代码
public class MyClass {
    public static synchronized void staticMethod() {
        // 同步代码
    }
}
  1. 非静态方法:

当synchronized作用于非静态方法时,它锁定的是当前实例对象。在同一时刻,只有一个线程可以访问这个实例对象的所有同步非静态方法。其他线程需要等待锁释放。

java 复制代码
public class MyClass {
    public synchronized void instanceMethod() {
        // 同步代码
    }
}
  1. 代码块:

当synchronized作用于代码块时,它锁定的是指定的对象。在同一时刻,只有一个线程可以访问这个对象的同步代码块。其他线程需要等待锁释放。

java 复制代码
public class MyClass {
    private final Object lock = new Object();

    public void method() {
        synchronized (lock) {
            // 同步代码
        }
    }
}

互斥情况总结:

  • 当多个线程访问同一个类的同步静态方法时,它们会互斥。
  • 当多个线程访问同一个实例对象的同步非静态方法时,它们会互斥。
  • 当多个线程访问不同实例对象的同步非静态方法时,它们不会互斥。
  • 当多个线程访问同一个对象的同步代码块时,它们会互斥。
  • 当多个线程访问不同对象的同步代码块时,它们不会互斥。
  • 当多个线程访问同一个类的同步静态方法和非同步的静态方法时,它们不会互斥。

注意:在使用synchronized时,需要确保锁定的对象具有唯一性,以避免出现意外的互斥情况。

当多个线程访问同一个类的同步静态方法和非同步的静态方法时,它们不会互斥。

synchronized关键字作用于静态方法时,它锁定的是类的Class对象。只有同步静态方法之间会互斥,因为它们共享相同的锁。而非同步的静态方法没有锁定任何对象,因此它们不会与同步静态方法互斥。

例如:

java 复制代码
public class MyClass {
    public static synchronized void syncStaticMethod() {
        // 同步代码
    }

    public static void nonSyncStaticMethod() {
        // 非同步代码
    }
}

在这个例子中,syncStaticMethod()是一个同步静态方法,nonSyncStaticMethod()是一个非同步静态方法。当多个线程同时访问这两个方法时,它们不会互斥。一个线程可以在另一个线程执行同步静态方法时执行非同步静态方法。

然而,需要注意的是,虽然它们不会互斥,但在多线程环境下,非同步静态方法可能会遇到线程安全问题。如果非同步静态方法访问共享资源或修改共享状态,可能会导致数据不一致或其他意外行为。在这种情况下,需要考虑使用其他同步机制(如synchronized代码块、ReentrantLock等)来确保线程安全。

相关推荐
悟天特斯12 小时前
安防一体化:从“各管各的“到“全局联动“
java·大数据·网络·人工智能·物联网
70后写java的老码农12 小时前
Spring Boot 3.x + ShardingSphere 5.x + MyBatis-Plus 3.x:订单分库分表实战(含两个踩坑记录)
java
霸道流氓气质12 小时前
AI 翻译插件:翻译记忆级联复用、术语混合检索与结构化质量门禁的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
斯维赤12 小时前
OCR到底是接入第三方API 还是自己封装?
java·ocr
码智社13 小时前
Redis 哨兵模式详解:从原理到生产实践
java·redis
救救孩子把13 小时前
结构化输出为何“格式正确、答案错误”?JSON Schema 的能力边界
android·java·json·agent·agent服务
silvamux_13 小时前
微头条爆款体平台适配实测:把交付要求变成可计算的指标
java·线性代数·算法·决策树·矩阵
论文复现现场13 小时前
DeepSeek V4.1 Flash 和 V4 Pro 有什么区别?API 价格、性能与迁移建议
java·服务器·人工智能·python·大模型api·deepseek·deepseek v4.1
郭小李13 小时前
转发与重定向
java·服务器·数据库
你看我名字13 小时前
数眼智能 Search + Reader 实战:联网问答怎样避免“搜到了,却引用错了”
android·java·开发语言