synchronized用法举例说明
下文笔者讲述"synchronized用法"的示例说明,如下所示
synchronized用法简介
`synchronized`是Java中用于实现线程同步的关键字, 可确保多线程环境下对共享资源的安全访问
synchronized用法示例分享
1.修饰实例方法 锁住是当前对象实例(即 `this`) 多个线程调用同一个对象的该方法时会互斥执行。 public class Counter { private int count = 0; public synchronized void increment() { count++; } public int getCount() { return count; } } 多个线程调用`increment()`方法时 只有一个线程能进入该方法 保证[count]线程安全 2.修饰静态方法 锁住是类`Class`对象 所有该类的实例共享同一把锁 public class Singleton { private static int instanceCount = 0; public static synchronized void createInstance() { instanceCount++; } public static int getInstanceCount() { return instanceCount; } } 所有线程调用createInstance()方法都会互斥运行 即使创建多个`Singleton`实例 3.修饰代码块(推荐) 更灵活、粒度更细的同步控制 可指定锁对象 public class Task { private final Object lock = new Object(); private int value = 0; public void doSomething() { synchronized (lock) { value++; } } } 使用私有锁对象`lock` 控制同步代码块 避免锁定整个方法 提高并发性能 4.与`this`配合使用的代码块 锁住当前对象实例 等价于在方法上加`synchronized` public class DataProcessor { private int data = 0; public void processData() { synchronized (this) { data += 10; } } } 所有调用`processData()`线程 会互斥访问该同步代码块 5.与`Class`对象配合使用代码块 实现类级别的同步 适用于保护类级别资源 public class Logger { public void log(String message) { synchronized (Logger.class) { System.out.println(message); } } } 所有`Logger`实例 调用`log()`方法时都会互斥运行
synchronized用法总结
使用方式 | 锁对象 | 特点 |
实例方法 | 当前对象(`this`) | 保护对象内部状态 |
静态方法 | 类的 Class 对象 | 保护类级别共享资源 |
同步代码块(对象锁) | 指定对象 | 粒度细,推荐使用 |
同步代码块(类锁) | 类的Class对象 | 全局资源同步 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。