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) { // 同步代码 } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统