synchronized关键字的用法-Java多线程

这个我会跟据大家的反馈,不断修改,迭代版本,做一个负责任有担当的博主,你们收藏与点赞就是博主坚持走下去的动力,我们一起加油,大家有什么不懂的可以评论区留言或者私聊博主!

synchronized关键字的用法

A. 普通方法
class Example {
    // 普通方法,使用 synchronized 修饰
    public synchronized void method1() {
        // 该方法被同步,锁定的是当前实例对象
        System.out.println("Method1 is executing");
        // 在这里执行一些需要同步的操作
    }

    public synchronized void method2() {
        // 该方法也被同步,锁定的是当前实例对象
        System.out.println("Method2 is executing");
    }
}
  • 同实例同方法:多个线程访问同一实例的同一个方法时,会排队。
    • 例如,线程 A 和线程 B 同时调用 example.method1(),线程 A 会先获得锁,线程 B 会被阻塞,直到线程 A 释放锁。
  • 同实例不同方法:多个线程访问同一实例的不同方法时,不会排队。
    • 例如,线程 A 调用 example.method1(),线程 B 调用 example.method2(),它们可以同时执行,因为它们锁定的是同一实例的不同方法。
  • 不同实例同方法:不同实例的同一个方法可以并发执行。
    • 例如,若有 Example example1 = new Example();Example example2 = new Example();,线程 A 调用 example1.method1(),线程 B 调用 example2.method1(),它们不会互相阻塞。
  • 不同实例不同方法:不同实例的不同方法可以并发执行。
    • 例如,线程 A 调用 example1.method1(),线程 B 调用 example2.method2(),它们可以同时执行。
B. 静态方法
class Example {
    // 静态方法,使用 synchronized 修饰
    public static synchronized void staticMethod1() {
        // 静态方法被同步,锁定的是类对象
        System.out.println("Static Method1 is executing");
    }

    public static synchronized void staticMethod2() {
        // 静态方法也被同步,锁定的是类对象
        System.out.println("Static Method2 is executing");
    }
}
  • 同实例同方法:多个线程访问同一个实例的同一个静态方法时,会排队。
    • 例如,线程 A 和线程 B 同时调用 Example.staticMethod1(),线程 A 会先获得锁,线程 B 会被阻塞。
  • 同实例不同方法:多个线程访问同一个实例的不同静态方法时,会排队。
    • 例如,线程 A 调用 Example.staticMethod1(),线程 B 调用 Example.staticMethod2(),它们会互相阻塞,因为它们都是静态方法,锁定的是类对象。
  • 不同实例同方法:不同实例的同一个静态方法会排队。
    • 例如,线程 A 调用 Example.staticMethod1(),线程 B 调用 Example.staticMethod1(),它们会互相阻塞,因为静态方法锁定的是类对象。
  • 不同实例不同方法:不同实例的不同静态方法可以并发执行。
    • 例如,线程 A 调用 Example.staticMethod1(),线程 B 调用 Example.staticMethod2(),它们可以同时执行。

C. 代码块

class Example {
    // 非同步方法
    public void method() {
        // 执行一些非同步操作
        System.out.println("Non-synchronized part");

        // 同步代码块,锁定当前实例
        synchronized (this) {
            // 只有在此代码块内的操作会被锁定
            System.out.println("Synchronized block is executing");
            // 在这里执行需要同步的操作
        }

        // 继续执行其他非同步操作
        System.out.println("After synchronized block");
    }
}
  • 只锁代码块一部分:使用 synchronized 锁定特定的代码块,而不是整个方法。
    • 这样可以提高并发性,因为只有在执行特定代码块时才会获取锁,其他非同步代码不会被阻塞。

总结:

  • synchronized 关键字用于实现线程同步,以防止多个线程同时访问共享资源。
  • 普通方法和静态方法的锁定行为不同,影响线程的排队和执行。
  • 使用代码块可以更灵活地控制锁的范围,提高程序的并发性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值