引自免费微信小程序:皆我百晓生
在Java中,要确保多线程环境下的代码是线程安全的,可以使用synchronized
关键字。在上述代码中,如果你想保护SyncThread
类中的method()
方法使其线程安全,可以在方法声明前加上synchronized
关键字。这样,当一个线程访问这个同步方法时,其他线程必须等待当前线程执行完毕才能进入。
修改后的代码如下:
public class SyncThread {
public synchronized void method() {
// todo
}
}
public class Child extends SyncThread {
// 方法一
public void method1() {
// todo
}
// 方法二
public void method2() {
super.method();
}
public static void main(String[] args) {
Child c = new Child();
c.method1(); // 这个方法没有被synchronized,不会阻塞其他线程
c.method2(); // 这个方法会调用父类的synchronized方法,如果有多个线程同时调用,只有一个线程能执行
c.method(); // 同样是synchronized方法,受同一把锁保护
// 对于这三种情况,只有`method()`是线程安全的,因为它被`synchronized`修饰了。
// `method1()`不受锁保护,因此不是线程安全的。
// 而`method2()`通过`super.method()`间接调用了`synchronized`方法,所以它也是线程安全的,但要注意的是,这里并不是因为`method2()`本身是同步的,而是因为它调用了同步的方法。
}
}
在这个例子中,method()
是线程安全的,而method1()
不具有任何同步特性,因此不是线程安全的。然而,由于method2()
调用了SyncThread
类的同步方法,所以当多个线程同时调用method2()
时,它们会被调度,保证只有一个线程执行method()
。这意味着method2()
在这种情况下也是线程安全的,但这并非因为它自身被标记为同步,而是因为它的行为依赖于一个同步方法。
为了保持代码简洁明了,建议将共享资源的操作(可能引起竞争条件的)封装在一个或多个同步方法中,而不是在所有子类的方法上都进行同步。这样可以使代码更易于理解和维护。