1、乐观锁:
乐观锁在操作数据的时候,是保持一种乐观的状态,认为别的线程是不会同时修改数据的,所以是不会上锁的,但是在更新的时候,会判断一下在这个期间内是否有别的线程修改过数据。
主要的流程:
1、假设两个线程,线程A和线程B直接获取同步数据资源,不会加锁,执行各自的操作。
2、线程A和线程B在更行同步资源的时候,都会去判断一下资源是否被其他的线程修改过。
3、如果同步资源没有被其他的资源修改后,会直接更新内存中同步资源的值
4、如果同步资源被其他的线程修改过,那么根据需要执行不同的操作,直接报错或者是重试。
2、悲观锁:
悲观锁在操作数据的时候,保持的是一种比较悲观的状态,在每次拿取数据的时候都认为别的线程也会同时的修改数据,所以每次在拿数据的时候都会给数据上锁,这样别线程想要拿这个数据就会被阻塞,直到拿到锁。
主要的流程:
1、多个线程,如线程A,B尝试获取同步锁
2、假设线程A先加锁成功并执行对应的操作,那么线程B只能等待线程A释放锁之后才能操作,线程B处于阻塞状态
3、线程A释放同步锁,然后CPU会唤醒等待的线程,即线程B会再次尝试获取锁
4、线程B成功获取锁,再执行自己的操作
缺点:
是需要阻塞的,效率比较低
可能会造成某个线程的永久等待,即死锁的可能性比较大。