synchronized
关键字可以保证多线程环境下的线程安全。它可以用于修饰方法和代码块。
修饰方法
当一个 synchronized
关键字修饰的方法被一个线程调用时,该方法就会被锁定,以保证同一时间只有一个线程可以执行该方法,直到该方法执行完毕释放锁。下面是一个例子:
public class ThreadSafeDemo {
private int counter = 0;
public synchronized void increment() {
counter++;
}
public int getCounter() {
return counter;
}
}
在上面例子中,当一个线程进入 increment()
方法时,它需要先获取 ThreadSafeDemo
对象的锁,然后才能执行 counter++
操作。当该线程完成 increment()
方法并退出方法时,它会释放该对象的锁,以便其他线程可以获取锁并进入方法。这样就保证了多线程环境下对 counter
成员变量的原子性操作,从而保证了线程安全。
修饰代码块
synchronized
关键字也可以用于修饰代码块,该代码块被执行时需要先获取指定对象的锁,并保证同一时间只有一个线程可以执行该代码块,直到该代码块执行完毕并释放锁。下面是一个例子:
public class ThreadSafeDemo {
private Object lock = new Object();
private int counter = 0;
public void increment() {
synchronized(lock) {
counter++;
}
}
public int getCounter() {
return counter;
}
}
在上面例子中,increment()
方法中的代码块使用 synchronized(lock)
的形式,以保证线程安全。当一个线程进入代码块时,它需要获取 lock
对象的锁才能执行该代码块。如果另一个线程也需要执行该代码块,它必须等待该锁的释放,直到获取到该锁才能执行该代码块。
如果在上述例子中使用了 synchronized(this)
,那么 getCounter()
方法也将被锁定,因为使用了 this
对象的锁,而 increment()
方法和 getCounter()
方法使用了同一个 ThreadSafeDemo
对象。
总之,synchronized
关键字可以保证多线程环境下的线程安全,但是由于它会对代码的执行效率造成影响,所以在使用时需要仔细考虑。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:synchronized关键字如何保证线程安全? - Python技术站