锁的机制一般都是用于多线程安全中,多线程竞争统一资源
一、 java的
synchronized:
lock:java.util.concurrent.locks
lock.lock();
try{
// 处理
}catch(Exception ex){
// 捕获异常
}finally{
// 释放锁
lock.unlock();
}
二、JMM的volatile锁关键字。
保证可见性,保证线程不从自己的副本中读值,都强制从主工作区读取值!
三、数据库的锁
select * from table where ? lock in share mode;//共享锁
select * from table where ? for update;//排他锁
悲观锁:觉得我在操作的时候一定有人试图来篡改干扰我,很悲观,所以会给加上一个排他锁。
乐观锁:觉得别人对我当前操作的影响无所谓,非常乐观,即便出现了冲突,让用户决定和承担,所以只会加共享锁!
四、分布式锁
本地锁在分布式架构中就实效了,所以分布式需要自己特定的分布式锁的概念:
- 基于数据库实现分布式锁:当我们要锁住某个方法或资源的时候,我们就在该表中增加一条记录,想要释放锁的时候就删除这条记录。(同Redis一样,不过数据库的操作会比Redis慢,因为Redis是基于内存缓存数据库)
- 基于缓存(Redis等)实现分布式锁;:维护一个主键唯一性锁表,插入表示拿到锁,别人不能插入同样的锁了。释放锁的时候,删除即可。
- 基于Zookeeper实现分布式锁:保证消费者按照强制性有序消费(转为同步)
来源:oschina
链接:https://my.oschina.net/u/3697586/blog/3109054