Synchronized 4种用法:
同步静态方法(Synchronized Static Method):
public class MyClass {
private static int counter = 0;
public static synchronized void synchronizedStaticMethod() {
// 同步静态方法体
counter++;
System.out.println("在 synchronizedStaticMethod 方法中,计数器值为:" + counter);
}
}
在这个示例中,synchronizedStaticMethod
方法被声明为静态方法,并且使用了 synchronized
关键字。这样做的作用是确保在整个应用程序中,每次只有一个线程可以调用 synchronizedStaticMethod
方法。这对于确保静态方法中的操作是线程安全的很有用,例如在多个线程同时对静态变量进行递增操作时。
同步类(Synchronized Class)
public class MyClass {
private static int counter = 0;
public void someMethod() {
synchronized (MyClass.class) {
// 同步类的代码块
counter++;
System.out.println("在 synchronized 类块中,计数器值为:" + counter);
}
}
}
在这个示例中,someMethod
方法包含一个同步代码块,它使用了 MyClass.class
作为锁。这样做的作用是确保在整个 MyClass
类中,每次只有一个线程可以执行同步代码块中的操作。这对于确保对类级别的共享资源的安全访问很有用。
同步 this 实例(Synchronized This Instance):
public class MyClass {
private int counter = 0;
public synchronized void synchronizedThisMethod() {
// 同步 this 实例方法体
counter++;
System.out.println("在 synchronizedThisMethod 方法中,计数器值为:" + counter);
}
}
同步对象实例(Synchronized Object Instance)
public class MyClass {
private int counter = 0;
private final Object lockObject = new Object();
public void someMethod() {
synchronized (lockObject) {
// 同步对象实例的代码块
counter++;
System.out.println("在 synchronized 对象块中,计数器值为:" + counter);
}
}
}
在这个示例中,someMethod
方法包含一个同步代码块,它使用了 lockObject
作为锁。这样做的作用是确保在每个 MyClass
类的实例中,每次只有一个线程可以执行同步代码块中的操作。这对于确保对实例级别的共享资源的安全访问很有用,同时也允许不同实例间的并发执行。
总的来说,使用 synchronized
关键字可以确保在多线程环境中对共享资源的安全访问,避免了竞态条件和数据不一致性的问题。