synchronized
是 Java 语言中的一个关键字,用于控制多线程访问共享资源时的同步问题。它可以确保多个线程在同一时刻只能有一个线程在执行某个代码块或方法,从而避免多线程同时访问导致的数据不一致问题。
在 Java 中,synchronized
关键字可以用在方法和代码块上。
1. synchronized
修饰方法
当用 synchronized
修饰方法时,该方法称为同步方法。同步方法在同一时刻只允许一个线程执行,其他尝试访问该方法的线程将被阻塞,直到当前线程执行完毕。
public synchronized void synchronizedMethod() {
// 同步方法体
}
2. synchronized
修饰代码块
synchronized
还可以用来修饰代码块,被称为同步块。同步块在同一时刻也只允许一个线程执行
public void method() {
synchronized (this) {
// 同步块
}
}
在同步块中,需要指定一个对象作为锁。当线程尝试执行同步块时,它需要获得锁才能执行。如果锁被其他线程持有,则该线程会被阻塞,直到锁被释放。
3、注意点:
synchronized
关键字获得的锁都是对象锁,而不是把一段代码或方法当做锁。在 Java 中,每个对象都有一个内置锁(也称为监视器锁或 monitor lock),synchronized
就是使用这种内置锁来实现同步的。synchronized
关键字修饰的方法或代码块在执行完毕后会自动释放锁,不需要手动释放。synchronized
关键字是非公平锁,它无法保证等待的线程获取锁的顺序。- 使用
synchronized
关键字需要小心死锁的发生。死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。 synchronized
会降低程序的运行效率,因此应尽量减少使用synchronized
的范围,只在必要时使用。- 在选择同步方法或同步块时,应尽量选择同步块,因为同步块的同步范围较小,可以提高程序的运行效率。
总的来说,synchronized
是一个重要的多线程控制关键字,但需要谨慎使用以避免潜在的问题。
文章出处登录后可见!
已经登录?立即刷新