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对象 | 全局资源同步 |
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


