<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
            <title type="text">小马博客</title>
    <updated>2022-02-24T13:42:23+08:00</updated>
        <id>http://sunhaijun.com</id>
        <link rel="alternate" type="text/html" href="http://sunhaijun.com" />
        <link rel="self" type="application/atom+xml" href="http://sunhaijun.com/atom.xml" />
    <rights>Copyright © 2026, 小马博客</rights>
    <generator uri="https://halo.run/" version="1.4.8">Halo</generator>
            <entry>
                <title><![CDATA[Redisson分布锁说明]]></title>
                <link rel="alternate" type="text/html" href="http://sunhaijun.com/archives/redisson分布式锁" />
                <id>tag:http://sunhaijun.com,2022-02-24:redisson分布式锁</id>
                <published>2022-02-24T13:41:33+08:00</published>
                <updated>2022-02-24T13:42:23+08:00</updated>
                <author>
                    <name>孙海军</name>
                    <uri>http://sunhaijun.com</uri>
                </author>
                <content type="html">
                        <![CDATA[<h3 id="redisson分布锁方式介绍">Redisson分布锁方式介绍</h3><ul><li>可重入锁</li></ul><blockquote><p>而且这个锁正好处于锁住的状态时，这个锁会出现锁死的状态。为了避免这种情况的发生，Redisson内部提供了一个监控锁的看门狗，它的作用是在Redisson实例被关闭前，不断的延长锁的有效期。默认情况下，看门狗的检查锁的超时时间是30秒钟</p></blockquote><pre><code class="language-java">RLock lock = redisson.getLock(&quot;anyLock&quot;); // 加锁以后10秒钟自动解锁// 无需调用unlock方法手动解锁lock.lock(10, TimeUnit.SECONDS);// 尝试加锁，最多等待100秒，上锁以后10秒自动解锁boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);if (res) {   try {     ...   } finally {       lock.unlock();   }}</code></pre><ul><li>公平锁</li></ul><blockquote><p>当多个Redisson客户端线程同时请求加锁时，优先分配给先发出请求的线程;所有请求线程会在一个队列中排队，当某个线程出现宕机时，Redisson会等待5秒后继续下一个线程，也就是说如果前面有5个线程都处于等待状态，那么后面的线程会等待至少25秒。</p></blockquote><pre><code class="language-java">RLock fairLock = redisson.getFairLock(&quot;anyLock&quot;);// 最常见的使用方法fairLock.lock()</code></pre><ul><li>联锁</li></ul><blockquote><p>分布式联锁RedissonMultiLock对象可以将多个RLock对象关联为一个联锁，每个RLock对象实例可以来自于不同的Redisson实例。</p></blockquote><pre><code class="language-java">RLock lock1 = redissonInstance1.getLock(&quot;lock1&quot;);RLock lock2 = redissonInstance2.getLock(&quot;lock2&quot;);RLock lock3 = redissonInstance3.getLock(&quot;lock3&quot;);RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);// 同时加锁：lock1 lock2 lock3// 所有的锁都上锁成功才算成功。lock.lock();...lock.unlock();</code></pre><ul><li>红锁</li></ul><blockquote><p>红锁RedissonRedLock对象实现了Redlock介绍的加锁算法。该对象也可以用来将多个RLock对象关联为一个红锁，每个RLock对象实例可以来自于不同的Redisson实例</p></blockquote><pre><code class="language-java">RLock lock1 = redissonInstance1.getLock(&quot;lock1&quot;);RLock lock2 = redissonInstance2.getLock(&quot;lock2&quot;);RLock lock3 = redissonInstance3.getLock(&quot;lock3&quot;);RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);// 同时加锁：lock1 lock2 lock3// 红锁在大部分节点上加锁成功就算成功。lock.lock();...lock.unlock();</code></pre><ul><li>读写锁</li></ul><blockquote><p>分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。</p><p>无论是读请求先执行还是写请求先执行，只要涉及到写锁，则都会阻塞，如果是先写再读，则读锁等待，如果是先读再写，则写锁等待</p><p>读写锁都是互斥，阻塞的</p></blockquote><pre><code class="language-java">RReadWriteLock rwlock = redisson.getReadWriteLock(&quot;anyRWLock&quot;);// 最常见的使用方法rwlock.readLock().lock();// 或rwlock.writeLock().lock();</code></pre>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[Java 8 Lambda表达式-单接口方法实现]]></title>
                <link rel="alternate" type="text/html" href="http://sunhaijun.com/archives/java8lambda" />
                <id>tag:http://sunhaijun.com,2021-06-11:java8lambda</id>
                <published>2021-06-11T16:35:09+08:00</published>
                <updated>2022-02-24T13:35:56+08:00</updated>
                <author>
                    <name>孙海军</name>
                    <uri>http://sunhaijun.com</uri>
                </author>
                <content type="html">
                        <![CDATA[<h3 id="使用注意实现">使用注意实现</h3><blockquote><p>按照Java8函数式接口的定义，其只能有一个抽象方法，否则就不是函数时接口，就无法用Lambda表达式。</p></blockquote><h3 id="使用">使用</h3><p>第一步：建立一个接口（抽象方法、默认方法、静态方法）</p><pre><code class="language-java">public interface Car {    void info(String carName);    default void test02(){        System.out.println(&quot;接口默认方法&quot;);    }    static void test01(){System.out.println(&quot;静态方法&quot;);    }}</code></pre><p>第二步： 使用lanbda表达式实现接口的抽象方法</p><pre><code class="language-java">Car bmwCar = (String carName) -&gt; {            System.err.println(&quot;lanbda Bwm &quot;+carName);        };</code></pre><p><strong>参数carName String这个可写可不写</strong></p><pre><code class="language-java">Car bmwCar = (carName) -&gt; {            System.err.println(&quot;lanbda Bwm &quot;+carName);      };</code></pre><blockquote><p>可以使用@FunctionalInterface标注函数式接口，在编译时提前发现错误。</p></blockquote>]]>
                </content>
            </entry>
            <entry>
                <title><![CDATA[Hello Halo]]></title>
                <link rel="alternate" type="text/html" href="http://sunhaijun.com/archives/hello-halo" />
                <id>tag:http://sunhaijun.com,2021-06-11:hello-halo</id>
                <published>2021-06-11T16:31:18+08:00</published>
                <updated>2021-06-11T16:31:18+08:00</updated>
                <author>
                    <name>孙海军</name>
                    <uri>http://sunhaijun.com</uri>
                </author>
                <content type="html">
                        <![CDATA[<h2 id="hello-halo">Hello Halo</h2><p>如果你看到了这一篇文章，那么证明你已经安装成功了，感谢使用 <a href="https://halo.run">Halo</a> 进行创作，希望能够使用愉快。</p><h2 id="相关链接">相关链接</h2><ul><li>官网：<a href="https://halo.run">https://halo.run</a></li><li>文档：<a href="https://docs.halo.run">https://docs.halo.run</a></li><li>社区：<a href="https://bbs.halo.run">https://bbs.halo.run</a></li><li>主题仓库：<a href="https://halo.run/themes.html">https://halo.run/themes.html</a></li><li>开源地址：<a href="https://github.com/halo-dev/halo">https://github.com/halo-dev/halo</a></li></ul><p>在使用过程中，有任何问题都可以通过以上链接找寻答案，或者联系我们。</p><blockquote><p>这是一篇自动生成的文章，请删除这篇文章之后开始你的创作吧！</p></blockquote>]]>
                </content>
            </entry>
</feed>
