synchronized

synchronized关键字来保证线程安全的,被sychronized锁住的代码部分,同一时刻只能有一个线程可以访问,其他线程会block(同一个对象内,不同对象间不会影响)。由于synchronized的机制是在同一时刻只能有一个线程操作,其他的线程阻塞或者轮询等待,在线程竞争激烈的情况下,这种方式的效率会非常的低下。

锁的范围

synchronized锁住的范围越小越好,类 > 方法 > 代码块。

锁的对象

可以锁类、实例

1、类锁

  • 锁定整个类(即Class对象)。
  • 同一时间只有一个线程可以执行同步的代码块,不管有多少个实例
public class MyClass {
    public void someMethod() {
        synchronized (MyClass.class) {
            // 同步代码
        }
    }
}

2、实例锁

  • 锁定当前对象(即实例对象)。
  • 同一时间只有一个线程可以执行同步代码块。不同实例间没有影响
复制代码
// 代码块
public class MyClass {
    public void someMethod() {
        synchronized (this) {   // 注意,不能锁MyClass
            // 同步代码
        }
    }
}
// 方法
public class MyClass {
    public synchronized void synchronizedInstanceMethod() {
        // 同步代码
    }
}
复制代码

3、字段锁

  • 锁定指定的对象实例。适用于更细粒度的控制锁。
  • 同一时间只有一个线程可以执行同步的代码块。不同实例间没有影响。
复制代码
public class MyClass {
    private final Object lock = new Object();

    public void someMethod() {
        synchronized (lock) {
            // 同步代码
        }
    }
}
复制代码

 

posted @   zhegeMaw  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示