KANG's BLOG

Let's have some fun

Java中两把锁:ReentrantLock和synchronized

Reentrantlock类 重入锁代表一段代码可以被同一个线程多次进入,其中unlock()次数对应lock()的次数。 区别于jvm实现的synchronized关键字,ReentrantLock是Lock的实现,代码层级的锁,常在finally中调用unlock()释放锁,所以在程序崩溃情况下,有可能造成死锁。 //创建一个非公平锁,默认是非公平锁 Lock nonFairLock= new ReentrantLock(); Lock nonFairLock= new ReentrantLock(false); //创建一个公平锁,构造传参true Lock fairLock= new ReentrantLock(true); 公平锁 & 非公平锁 公平锁 加锁前先查看是否有排队等待的线程,有的话优先处理排在前面的线程,先来先得。

分布式锁的实现

Redis和Zookeeper实现分布式锁的区别 1.如果没获取到锁的情况下: redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能 zk分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小 2.锁释放失败的情况下: redis获取锁的那个客户端bug了或者挂了,那么只能等待超时时间之后才能释放锁 zk的话,因为创建的是临时znode,只要客户端挂了,znode就没了,此时就自动释放锁 Zookeeper实现分布式锁 在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点, 然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己在之