悲观锁
- 像 synchronized,Lock 这些都属于悲观锁
- 如果发生了竞争,失败的线程会进入阻塞
- 【理解】悲观的名字由来:害怕其他线程来同时修改共享资源,因此用互斥锁让同一时刻只能有一个线程来占用共享资源
乐观锁
- 像 AtomicInteger,AtomicReference 等原子类,这些都属于乐观锁
- 如果发生了竞争,失败的线程不会阻塞,仍然会重试
- 【理解】乐观的名字由来:不怕其他线程来同时修改共享资源,事实上它根本不加锁,所有线程都可以去修改共享资源,只不过并发时只有一个线程能成功,其它线程发现自己失败了,就去重试,直至成功
适用场景
- 如果竞争少,能很快占有共享资源,适合使用乐观锁
- 如果竞争多,线程对共享资源的独占时间长,适合使用悲观锁
P.S.
- 这里讨论 Java 中的悲观锁和乐观锁,其它领域如数据库也有这俩概念,当然思想是类似的