说说自己是怎么使用 synchronized 关键字?
1 个回答
回眸一笑百媚生,六宫粉黛无颜色。王林### 如何使用 `synchronized` 关键字 `synchronized` 关键字在 Java 中用于解决多线程环境下资源同步问题。以下是详细的用法和相关的注意事项: #### 1. 修饰实例方法 **作用**: - 对当前对象实例加锁,进入同步代码前需要获得当前对象实例的锁。 **示例**: ```java public class Example { public synchronized void instanceMethod() { // 需要同步的代码 } } ``` **说明**: - 当一个线程调用对象的 `synchronized` 实例方法时,它必须获得该对象的锁。 - 其他线程在调用同一对象的任何 `synchronized` 实例方法时,都将被阻塞,直到当前线程释放该对象的锁。 #### 2. 修饰静态方法 **作用**: - 对当前类加锁,进入同步代码前需要获得当前类的锁。 - 静态成员属于类,不属于任何一个实例对象,所以静态方法加锁会作用于类的所有实例对象。 **示例**: ```java public class Example { public static synchronized void staticMethod() { // 需要同步的代码 } } ``` **说明**: - 当一个线程调用类的 `synchronized` 静态方法时,它必须获得该类的锁。 - 其他线程在调用同一类的任何 `synchronized` 静态方法时,都将被阻塞,直到当前线程释放该类的锁。 #### 3. 修饰代码块 **作用**: - 对指定的对象加锁,进入同步代码块前需要获得给定对象的锁。 **示例**: ```java public class Example { private final Object lock = new Object(); public void method() { synchronized (lock) { // 需要同步的代码 } } } ``` **说明**: - 使用 `synchronized` 代码块可以灵活指定加锁对象,通常用于只需在方法的一部分代码中进行同步的情况。 - 进入同步代码块前,必须先获得给定对象的锁。 #### 4. 注意事项 **静态方法和实例方法的锁不同**: - `synchronized` 修饰的静态方法使用的是类锁(`Class` 对象的锁)。 - `synchronized` 修饰的实例方法使用的是对象锁(实例对象的锁)。 - 因此,线程 A 可以调用一个实例对象的非静态 `synchronized` 方法,同时线程 B 调用同一个类的静态 `synchronized` 方法,不会发生互斥现象,因为它们使用的锁不同。 **避免使用字符串常量作为锁**: - 尽量不要使用 `synchronized(String a)`,因为 JVM 中字符串常量池具有缓存功能,可能导致意外的锁重用问题。 **总结**: - `synchronized` 关键字加在 `static` 静态方法和 `synchronized(class)` 代码块上时,是给 `Class` 类上锁。 - `synchronized` 关键字加在实例方法上时,是给对象实例上锁。 ### 示例总结 ```java public class Example { // 修饰实例方法 public synchronized void instanceMethod() { // 需要同步的代码 } // 修饰静态方法 public static synchronized void staticMethod() { // 需要同步的代码 } // 修饰代码块 private final Object lock = new Object(); public void method() { synchronized (lock) { // 需要同步的代码 } } // 避免使用字符串常量作为锁 private final String lockString = new String("lock"); public void stringLockMethod() { synchronized (lockString) { // 需要同步的代码 } } } ``` 通过以上示例和解释,可以更好地理解 `synchronized` 关键字的用法以及它在不同场景下的应用。发布于 2024-07-21 01:40 •IP属地 贵州举报评论收藏
公众号进入网站体验更佳

