如果面试问到这个题目,那么就可以窃喜了,因为太简单了,只要写过多线程代码的人,肯定用到过 synchronized 关键字。我把答案总结在这里,背诵一下就可以了。
synchronized 关键字表示了 Java 的一个实现同步的锁,线程进入同步代码块,必须要先获得锁,退出时释放锁。这个锁是互斥的,同一时间只有一个线程能获得锁。获得不到锁的线程,只能等待别的线程释放锁,然后再去抢这个锁。
修饰代码块
这是最常用的方式,获得 lock 对象的线程,才能继续运行。
Object lock = new Object();
public void foo() {
synchronized (lock) {
//do things
}
}
修饰方法
public synchronized void foo()
{
// do things
}
这个等价于下面的代码,获取的锁对象就是当前类的实例。
public void foo()
{
synchronized(this) {
// do things
}
}
修饰静态的方法
public synchronized static void foo() {
// do things
}
这个等价于下面的代码,获取的锁对象就是当前类的 class 对象。
class myclass {
public void foo() {
synchronized(myclass.class) {
// do things
}
}