谈谈synchronized

synchronized就是用来解决线程安全问题的。有两种形式,一个是同步方法,一种是同步代码块。

//这是同步方法,把整个方法都锁了,每次只有一个线程可以进来
public synchronized void method01(){}    //这个锁当前对象
public static synchronized void method02(){}    //这个锁当前类
//这个是同步代码块,只锁同步代码块中的代码
public void method01(){
        synchronized(this){}      //锁当前对象
}

public void method02(){
        synchronized(XXX.class){}      //锁当前对象
}

synchronized的工作原理

synchronized的底层是一个monitor监视器锁,每个对象都有这么一个锁,当monitor占有时就处于锁定状态,他的底层有两条指令monitorenter和monitorexit。
线程执行monitorenter指令后,会尝试获取monitor的所有权,如果monitor的进入数为0,那么可以占用它,并把他的进入数+1,表示已经获得monitor的所有权,其他线程如果想要获取,那他只能进入阻塞状态,至到进入数为0的时候,才可以尝试去获取这个锁。
线程执行monitorenter指令必须是拿着monitor锁的这个才可以执行,如果执行这条指令,monitor的进入数-1,如果-1为0后,表示不再拥有这个锁,其他线程可以尝试获取。

synchronized和lock的异同?

相同点:都是可以解决线程安全问题
不同点:
synchronized在执行完响应的代码块之后会自动释放锁,lock需要收到加锁和释放锁。
lock锁可以中断,可以设置超时时间,超过指定时间就可以放弃获取锁,synchronized不可以中断。
lock可以设置公平锁和非公平锁,synchronized只能是非公平锁。
lock可以绑定多个Condition对象,可以实现精确唤醒,synchronized不可以。

为什么wait()方法必须在synchronized中使用?

wait()在调用该方法后,会释放该对象的独占锁。wait()在执行后会强制当前线程释放对象锁,这意味着在执行wait()方法前,当前对象必须已经获得该对象锁。

你可能感兴趣的:(谈谈synchronized)