{"id":10008120,"date":"2023-08-21T11:59:25","date_gmt":"2023-08-21T03:59:25","guid":{"rendered":"https:\/\/blog.itmax.cn\/?p=10008120"},"modified":"2023-08-21T11:59:25","modified_gmt":"2023-08-21T03:59:25","slug":"%e5%9c%a8%e4%bb%a3%e7%a0%81%e4%b8%96%e7%95%8c%e6%b8%b8%e8%b5%b0%ef%bc%8c%e6%b2%a1%e5%87%a0%e6%8a%8a%e9%94%81%e9%98%b2%e8%ba%ab%e5%8f%af%e4%b8%8d%e8%a1%8c-%e4%ba%ac%e4%b8%9c","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10008120","title":{"rendered":"\u5728\u4ee3\u7801\u4e16\u754c\u6e38\u8d70\uff0c\u6ca1\u51e0\u628a\u201c\u9501\u201d\u9632\u8eab\u53ef\u4e0d\u884c | \u4eac\u4e1c\u4e91\u6280\u672f\u56e2\u961f"},"content":{"rendered":"<h2><strong>\u4e00\u3001\u5f00\u7bc7\u80cc\u666f<\/strong><\/h2>\n<p>\u201c\u9501\u201d\u4ee3\u8868\u5b89\u5168\u3002\u5728\u7a0b\u5e8f\u4e2d\uff08\u8fd9\u91cc\u6307java\uff09\u5c24\u5176\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\uff0c\u6709\u4e86\u9501\u7684\u5e2e\u52a9\uff0c\u4f1a\u7ed9\u6570\u636e\u5b89\u5168\u5e26\u6765\u4fdd\u969c\uff0c\u5e2e\u52a9\u7ebf\u7a0b\u66f4\u597d\u7684\u8fd0\u4f5c\uff0c\u907f\u514d\u7ade\u4e89\u548c\u4e92\u65a5\u3002<\/p>\n<p>\u9501\u5171\u670915\u79cd\u7b97\u6cd5\uff1a\u4e50\u89c2\u9501\u3001\u60b2\u89c2\u9501\u3001\u81ea\u65cb\u9501\u3001\u91cd\u5165\u9501\u3001\u8bfb\u5199\u9501\u3001\u516c\u5e73\u9501\u3001\u975e\u516c\u5e73\u9501\u3001\u5171\u4eab\u9501\u3001\u72ec\u5360\u9501\u3001\u91cd\u91cf\u7ea7\u9501\u3001\u8f7b\u91cf\u7ea7\u9501\u3001\u504f\u5411\u9501\u3001\u5206\u6bb5\u9501\u3001\u4e92\u65a5\u9501\u3001\u540c\u6b65\u9501&#8230;.\u4e00\u53e3\u6c14\u8f93\u51fa\u771f\u7684\u7d2f\uff0c\u8c01\u8bb0\u8fd9\u4e2a\u554a\u3002\u6211\u4eec\u8981\u5403\u73b0\u6210\u7684\u3002ok\uff0c\u4e0a\u9762\u7684\u4e00\u5927\u5806\u5728\u54b1java\u91cc\u5c31\u662f\uff1a<\/p>\n<p><strong>ReentrantLock\uff0cSynchronieed\uff0cReentrantReadWriteLock\uff0cAtomic \u5168\u5bb6\u6876\uff0cConcurrent\u5168\u5bb6\u6876<\/strong><\/p>\n<p>\u5df2\u4e0a\u5728\u5e76\u53d1\u573a\u666f\u4e2d\u90fd\u662f\u88ab\u5e38\u5e38\u7528\u5230\uff0c\u60f3\u5fc5\u5927\u5bb6\u90fd\u5df2\u7089\u706b\u7eaf\u9752\u822c&#8230;..\u5df4\u7279\uff01\u6211\u4eec\u8fd8\u6709\u540e\u6d6a\u540c\u5b66\u4eec\u53ef\u80fd\u4e0d\u719f\u6089\uff0c\u90a3\u6211\u5728\u8fd9\u91cc\u804a\u4e0b\u9501\u7684\u7528\u6cd5\u548c\u4f7f\u7528\u573a\u666f\u3002<\/p>\n<h4><strong>ReentrantLock\uff1a<\/strong><\/h4>\n<p>ReentrantLock\u662f\u4e00\u4e2a\u4e92\u65a5\u7684\u53ef\u91cd\u5165\u9501\u3002\u4e92\u65a5\u7684\u610f\u601d\u5c31\u662f\u6392\u4ed6\uff0c\u72ec\u5360\uff0c\u53ea\u80fd\u4e00\u4e2a\u7ebf\u7a0b\u83b7\u53d6\u5230\u9501\u3002\u53ef\u91cd\u5165\u7684\u610f\u601d\u5c31\u662f\u5355\u4e2a\u7ebf\u7a0b\u53ef\u4ee5\u591a\u6b21\u91cd\u590d\u83b7\u53d6\u9501\u3002\u5b83\u5b9e\u73b0\u4e86\u60b2\u89c2\u9501\u3001\u91cd\u5165\u9501\u3001\u72ec\u5360\u9501\u3001\u975e\u516c\u5e73\u9501\u548c\u4e92\u65a5\u9501\u7684\u7b97\u6cd5\u3002<\/p>\n<p><strong>\u5e38\u7528\u65b9\u6cd5<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u65b9\u6cd5\u540d<\/th>\n<th>\u8bf4\u660e<\/th>\n<th>\u5f02\u5e38<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>lock()<\/td>\n<td>\u4e00\u76f4\u963b\u585e\u83b7\u53d6\u9501\uff0c\u76f4\u5230\u83b7\u53d6\u6210\u529f<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>lockInterruptibly()<\/td>\n<td>\u5c1d\u8bd5\u83b7\u53d6\u9501\uff0c\u76f4\u5230\u83b7\u53d6\u9501\u6216\u8005\u7ebf\u7a0b\u88ab\u4e2d\u65ad<\/td>\n<td>InterruptedException<\/td>\n<\/tr>\n<tr>\n<td>tryLock()<\/td>\n<td>\u5c1d\u8bd5\u83b7\u53d6\u7a7a\u95f2\u7684\u9501\uff0c\u83b7\u53d6\u6210\u529f\u8fd4\u56detrue\uff0c\u83b7\u53d6\u5931\u8d25\u8fd4\u56defalse\uff0c\u4e0d\u4f1a\u963b\u585e\uff0c\u7acb\u5373\u8fd4\u56de<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>tryLock(long time, TimeUnit unit)<\/td>\n<td>\u5c1d\u8bd5\u5728time\u65f6\u95f4\u5185\u83b7\u53d6\u7a7a\u95f2\u7684\u9501\uff0c\u5728\u7b49\u5f85\u65f6\u95f4\u5185\u53ef\u4ee5\u88ab\u4e2d\u65ad<\/td>\n<td>InterruptedException<\/td>\n<\/tr>\n<tr>\n<td>unLock()<\/td>\n<td>\u91ca\u653e\u9501<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<tr>\n<td>newCondition()<\/td>\n<td>\u8fd4\u56de\u5f53\u524d\u9501\u7684\u4e00\u4e2acondition\u5b9e\u4f8b\uff0c\u53ef\u4ee5\u5524\u9192\u6216\u7b49\u5f85\u7ebf\u7a0b<\/td>\n<td>\u65e0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u573a\u666f<\/strong><\/p>\n<p>\u9012\u5f52\u5d4c\u5957\u7684\u4e1a\u52a1\u573a\u666f\u4e2d\uff0c\u4f8b\u5982\u4e00\u68f5\u6811\u578b\u7684\u4e1a\u52a1\u903b\u8f91\uff0c\u65b9\u6cd5\u6709\u5d4c\u5957\u548c\u8c03\u7528\uff0c\u8fd9\u65f6\u5019\u6211\u4ece\u5916\u5c42\u52a0\u9501\u540e\uff0c\u5728\u9012\u5f52\u904d\u5386\u591a\u6b21\uff0c\u6bcf\u6b21\u90fd\u8981\u662f\u540c\u4e00\u628a\u9501\uff0c\u5e76\u4e14\u9012\u5f52\u5230\u5176\u4ed6\u5c42\u7ea7\u65f6\u9501\u8fd8\u4e0d\u80fd\u5931\u6548\u3002\u8fd9\u4e2a\u65f6\u5019\u5c31\u53ef\u4ee5\u4f7f\u7528\u91cd\u5165\u9501\u4e86\u3002\u6c5f\u6e56\u4e0a\u8fd8\u6709\u4e2a\u82b1\u540d\uff0c\u53eb\u9012\u5f52\u9501\u3002<\/p>\n<h4><strong>Synchronized<\/strong>\uff1a<\/h4>\n<p>Synchronized\u662f\u60b2\u89c2\u9501\uff0c\u9ed8\u8ba4\u662f\u504f\u5411\u9501\uff0c\u89e3\u9501\u5931\u8d25\u540e\u4f1a\u5347\u7ea7\u4e3a\u8f7b\u91cf\u7ea7\u9501\uff0c\u5f53\u7ade\u4e89\u7ee7\u7eed\u52a0\u5267\uff0c\u8fdb\u5165CAS\u81ea\u65cb10\u6b21\u540e\u4f1a\u5347\u7ea7\u4e3a\u91cd\u91cf\u7ea7\u9501\u3002\u5b83\u5b9e\u73b0\u4e86\u60b2\u89c2\u9501\u3001\u91cd\u5165\u9501\uff08\u7528\u5173\u952e\u5b57\u4fee\u9970\u65b9\u6cd5\u6216\u4ee3\u7801\u6bb5\u65f6\uff09\u3001\u72ec\u5360\u9501\uff0c\u975e\u516c\u5e73\u9501\u3001\u8f7b\u91cf\u7ea7\u9501\u3001\u91cd\u91cf\u7ea7\u9501\u3001\u504f\u5411\u9501\u548c\u540c\u6b65\u9501\u7b97\u6cd5\u3002<\/p>\n<p><strong>\u4f7f\u7528\u65b9\u6cd5<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u4f7f\u7528\u573a\u666f<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u4fee\u9970\u65b9\u6cd5<\/td>\n<td>public synchronized void someMethod() { \/\/ \u65b9\u6cd5\u4f53 }<\/td>\n<\/tr>\n<tr>\n<td>\u4fee\u9970\u4ee3\u7801\u5757<\/td>\n<td>public void someMethod() { synchronized (lockObject) { \/\/ \u4e34\u754c\u533a\u4ee3\u7801 } }<\/td>\n<\/tr>\n<tr>\n<td>\u4fee\u9970\u9759\u6001\u65b9\u6cd5<\/td>\n<td>public static synchronized void someStaticMethod() { \/\/ \u65b9\u6cd5\u4f53 }<\/td>\n<\/tr>\n<tr>\n<td>\u4fee\u9970\u7c7b<\/td>\n<td>public class MyClass { public void method1() { synchronized(MyClass.class) { \/\/ \u540c\u6b65\u4ee3\u7801\u5757 } } public synchronized void method2() { \/\/ \u540c\u6b65\u65b9\u6cd5 } }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u573a\u666f<\/strong><\/p>\n<p>\u591a\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u5171\u4eab\u53d8\u91cf\uff0c\u4e3a\u4e86\u4fdd\u8bc1\u671f\u539f\u5b50\u6027\u5c31\u53ef\u4ee5\u4f7f\u7528 synchronized \u3002\u4e00\u4e2a\u5178\u578b\u7684\u4e1a\u52a1\u573a\u666f\u662f\u94f6\u884c\u8f6c\u8d26\u64cd\u4f5c\u3002\u5047\u8bbe\u6709\u591a\u4e2a\u7528\u6237\u5728\u540c\u65f6\u8fdb\u884c\u8f6c\u8d26\u64cd\u4f5c\uff0c\u9700\u8981\u786e\u4fdd\u8f6c\u8d26\u8fc7\u7a0b\u7684\u539f\u5b50\u6027\u548c\u6570\u636e\u7684\u4e00\u81f4\u6027\uff0c\u907f\u514d\u51fa\u73b0\u91cd\u590d\u8f6c\u8d26\u6216\u8005\u8f6c\u8d26\u91d1\u989d\u9519\u8bef\u7684\u60c5\u51b5\u3002\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u4f7f\u7528 synchronized \u5173\u952e\u5b57\u6765\u5b9e\u73b0\u540c\u6b65\u8bbf\u95ee\u3002<\/p>\n<h4><strong>ReentrantReadWriteLock<\/strong>\uff1a<\/h4>\n<p>ReentrantReadWriteLock\u662fJava\u63d0\u4f9b\u7684\u8bfb\u5199\u9501\uff0c\u5b83\u652f\u6301\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8bfb\u53d6\u5171\u4eab\u6570\u636e\uff0c\u4f46\u53ea\u5141\u8bb8\u4e00\u4e2a\u7ebf\u7a0b\u8fdb\u884c\u5199\u64cd\u4f5c\u3002 \u4ed6\u5b9e\u73b0\u4e86\u8bfb\u5199\u9501\u548c\u5171\u4eab\u9501\u7b97\u6cd5\u3002<\/p>\n<p><strong>\u5e38\u7528\u65b9\u6cd5<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u65b9\u6cd5<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>readLock()<\/td>\n<td>\u83b7\u53d6\u8bfb\u9501<\/td>\n<\/tr>\n<tr>\n<td>writeLock()<\/td>\n<td>\u83b7\u53d6\u5199\u9501<\/td>\n<\/tr>\n<tr>\n<td>readLock().lock()<\/td>\n<td>\u83b7\u53d6\u8bfb\u9501\u5e76\u52a0\u9501<\/td>\n<\/tr>\n<tr>\n<td>writeLock().lock()<\/td>\n<td>\u83b7\u53d6\u5199\u9501\u5e76\u52a0\u9501<\/td>\n<\/tr>\n<tr>\n<td>readLock().unlock()<\/td>\n<td>\u91ca\u653e\u8bfb\u9501<\/td>\n<\/tr>\n<tr>\n<td>writeLock().unlock()<\/td>\n<td>\u91ca\u653e\u5199\u9501<\/td>\n<\/tr>\n<tr>\n<td>newCondition()<\/td>\n<td>\u521b\u5efa\u4e0e\u9501\u76f8\u5173\u8054\u7684Condition\u5b9e\u4f8b\uff0c\u53ef\u4ee5\u5524\u9192\u6216\u7b49\u5f85\u7ebf\u7a0b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u573a\u666f<\/strong><\/p>\n<p>\u8bfb\u5199\u9501\u5e94\u7528\u5728\u8bfb\u591a\u5199\u5c11\u7684\u60c5\u51b5\u4e0b\u3002\u8bfb\u53d6\u65f6\u4e0d\u6d89\u53ca\u6570\u636e\u4fee\u6539\uff0c\u5199\u5165\u65f6\u9700\u8981\u4e92\u65a5\u64cd\u4f5c\u3002\u73b0\u5728\u57fa\u672c\u6240\u6709\u7684\u53f7\u79f0\u6548\u7387\u9ad8\u7684\u51c6\u5b9e\u65f6\u6570\u636e\u5e93\u90fd\u6709\u5b9e\u73b0\u8bfb\u5199\u9501\u7684\u7b97\u6cd5\u3002<\/p>\n<h4><strong>Atomic \u5168\u5bb6\u6876<\/strong>\uff1a<\/h4>\n<p>Atomic\u5168\u5bb6\u6876 \u6211\u4eec\u5df2 AtomicInteger \u4e3a\u4f8b\u3002\u4ed6\u7684\u7279\u70b9\u662f\u5b9e\u73b0\u4e86CAS\u7b97\u6cd5\uff0c\u540c\u65f6\u89e3\u51b3\u4e86ABA\u95ee\u9898\u4fdd\u8bc1\u539f\u5b50\u6027\u3002\u8fd8\u5b9e\u73b0\u4e86\u81ea\u65cb\u9501\u7684CLHLock\u7b97\u6cd5\uff0c\u7528\u4e8eCAS\u6bd4\u8f83\u5931\u8d25\u540e\u81ea\u65cb\u7b49\u5f85\u3002\u5b83\u5b9e\u73b0\u4e86\u4e50\u89c2\u9501\u3001\u81ea\u65cb\u9501\u548c\u8f7b\u91cf\u7ea7\u9501\u7684\u7b97\u6cd5\u3002<\/p>\n<p><strong>\u5e38\u7528\u65b9\u6cd5<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u65b9\u6cd5<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>get();<\/td>\n<td>\u83b7\u53d6\u5f53\u524dAtomicInteger\u5bf9\u8c61\u7684\u503c<\/td>\n<\/tr>\n<tr>\n<td>set(int newValue);<\/td>\n<td>\u5c06AtomicInteger\u5bf9\u8c61\u7684\u503c\u8bbe\u7f6e\u4e3a\u6307\u5b9a\u7684\u65b0\u503c<\/td>\n<\/tr>\n<tr>\n<td>getAndSet(int newValue)<\/td>\n<td>\u5c06AtomicInteger\u5bf9\u8c61\u7684\u503c\u8bbe\u7f6e\u4e3a\u6307\u5b9a\u7684\u65b0\u503c\uff0c\u5e76\u8fd4\u56de\u8bbe\u7f6e\u524d\u7684\u65e7\u503c<\/td>\n<\/tr>\n<tr>\n<td>incrementAndGet()<\/td>\n<td>\u5c06AtomicInteger\u5bf9\u8c61\u7684\u503c\u9012\u589e1\uff0c\u5e76\u8fd4\u56de\u9012\u589e\u540e\u7684\u65b0\u503c<\/td>\n<\/tr>\n<tr>\n<td>decrementAndGet()<\/td>\n<td>\u5c06AtomicInteger\u5bf9\u8c61\u7684\u503c\u9012\u51cf1\uff0c\u5e76\u8fd4\u56de\u9012\u51cf\u540e\u7684\u65b0\u503c<\/td>\n<\/tr>\n<tr>\n<td>getAndIncrement()<\/td>\n<td>\u5148\u83b7\u53d6AtomicInteger\u5bf9\u8c61\u7684\u5f53\u524d\u503c\uff0c\u7136\u540e\u5c06\u5176\u9012\u589e1\uff0c\u5e76\u8fd4\u56de\u83b7\u53d6\u7684\u65e7\u503c<\/td>\n<\/tr>\n<tr>\n<td>getAndDecrement()<\/td>\n<td>\u5148\u83b7\u53d6AtomicInteger\u5bf9\u8c61\u7684\u5f53\u524d\u503c\uff0c\u7136\u540e\u5c06\u5176\u9012\u51cf1\uff0c\u5e76\u8fd4\u56de\u83b7\u53d6\u7684\u65e7\u503c<\/td>\n<\/tr>\n<tr>\n<td>addAndGet(int delta)<\/td>\n<td>\u5c06\u6307\u5b9a\u7684\u503c\u52a0\u5230AtomicInteger\u5bf9\u8c61\u7684\u5f53\u524d\u503c\u4e0a\uff0c\u5e76\u8fd4\u56de\u76f8\u52a0\u540e\u7684\u7ed3\u679c<\/td>\n<\/tr>\n<tr>\n<td>getAndAdd(int delta)<\/td>\n<td>\u5148\u83b7\u53d6AtomicInteger\u5bf9\u8c61\u7684\u5f53\u524d\u503c\uff0c\u7136\u540e\u5c06\u6307\u5b9a\u7684\u503c\u52a0\u5230\u5f53\u524d\u503c\u4e0a\uff0c\u5e76\u8fd4\u56de\u83b7\u53d6\u7684\u65e7\u503c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u573a\u666f<\/strong><\/p>\n<p>\u7528\u6765\u505a\u8ba1\u6570\u5668\u975e\u5e38\u5408\u9002\uff0c\u518d\u6709\u5c31\u662f\u7ebf\u7a0b\u901a\u8baf\uff0c\u6570\u636e\u5171\u4eab\u3002<\/p>\n<h4><strong>Concurrent\u5168\u5bb6\u6876<\/strong>\uff1a<\/h4>\n<p>Concurrent\u5168\u5bb6\u6876\u6211\u4eec\u5df2ConcurrentHashMap\u4e3a\u4ee3\u8868\u3002\u5b83\u5b9e\u73b0\u4e86\u5206\u6bb5\u9501\u7b97\u6cd5\uff08Segmented Locking\uff09\u7684\u7b56\u7565\uff0c\u5c06\u6574\u4e2a\u6570\u636e\u7ed3\u6784\u5212\u5206\u6210\u591a\u4e2aSegments\uff0c\u6bcf\u4e2a\u6bb5\u90fd\u62e5\u6709\u72ec\u7acb\u7684\u9501\u3002<\/p>\n<p><strong>\u5e38\u7528\u65b9\u6cd5<\/strong><\/p>\n<table>\n<thead>\n<tr>\n<th>\u65b9\u6cd5<\/th>\n<th>\u8bf4\u660e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>clear();<\/td>\n<td>\u79fb\u9664\u6240\u6709\u5173\u7cfb<\/td>\n<\/tr>\n<tr>\n<td>containsKey(object value);<\/td>\n<td>\u68c0\u67e5\u6307\u5b9a\u5bf9\u8c61\u662f\u90fd\u4e3a\u8868\u4e2d\u7684\u952e<\/td>\n<\/tr>\n<tr>\n<td>containsValue(object value);<\/td>\n<td>\u5982\u679c\u6b64\u6620\u5c04\u5c06\u4e00\u4e2a\u6216\u591a\u4e2a\u5065\u6620\u5c04\u5230\u6307\u5b9a\u503c\uff0c\u8fd4\u56detrue<\/td>\n<\/tr>\n<tr>\n<td>elements()<\/td>\n<td>\u8fd4\u56de\u6b64\u8868\u503c\u7684\u679a\u4e3e<\/td>\n<\/tr>\n<tr>\n<td>entrySet()<\/td>\n<td>\u8fd4\u56de\u6b64\u6620\u5c04\u6240\u5305\u542b\u7684\u6620\u5c04\u5173\u7cfbSet\u89c6\u56fe<\/td>\n<\/tr>\n<tr>\n<td>get()<\/td>\n<td>\u8fd4\u56de\u6307\u5b9a\u952e\u6620\u5c04\u5230\u7684\u503c\u6ca1\u5982\u679c\u6b64\u6620\u5c04\u4e0d\u5305\u542b\u8be5\u952e\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u5219\u8fd4\u56denull<\/td>\n<\/tr>\n<tr>\n<td>isEmpty()<\/td>\n<td>\u6b64\u6620\u5c04\u4e0d\u5305\u542b\u952e\u503c\u5219\u8fd4\u56detrue<\/td>\n<\/tr>\n<tr>\n<td>keys()<\/td>\n<td>\u8fd4\u56de\u6b64\u8868\u4e2d\u952e\u7684\u679a\u4e3e<\/td>\n<\/tr>\n<tr>\n<td>put(K key, V value)<\/td>\n<td>\u6307\u5b9a\u5c06\u5065\u6620\u5c04\u5230\u6b64\u8868\u4e2d\u7684\u6307\u5b9a\u503c<\/td>\n<\/tr>\n<tr>\n<td>putAll(Map&lt;? extends k, ? extends v&gt; m)<\/td>\n<td>\u5c06\u6307\u5b9a\u6620\u5c04\u4e2d\u6240\u6709\u7684\u6620\u5c04\u5173\u7cfb\u590d\u5236\u5230\u6b64\u6620\u5c04\u4e2d<\/td>\n<\/tr>\n<tr>\n<td>size()<\/td>\n<td>\u8fd4\u56de\u6b64\u6620\u5c04\u4e2d\u7684\u952e\u503c\u6620\u5c04\u5173\u7cfb\u6570<\/td>\n<\/tr>\n<tr>\n<td>remove(object key)<\/td>\n<td>\u5c06\u952e\u4ece\u6b64\u6620\u5c04\u4e2d\u79fb\u9664<\/td>\n<\/tr>\n<tr>\n<td>replace(K key, V value)<\/td>\n<td>\u53ea\u6709\u76ee\u524d\u5c06\u952e\u7684\u6761\u76ee\u6620\u5c04\u5230\u7ed9\u5b9a\u503c\u65f6\uff0c\u624d\u66ff\u6362\u8be5\u952e\u7684\u6761\u76ee<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>\u573a\u666f<\/strong><\/p>\n<p>\u5728java\u4e2dConcurrentHashMap\uff0c\u5c31\u662f\u5c06\u6570\u636e\u5206\u4e3a16\u6bb5\uff0c\u6bcf\u4e00\u6bb5\u90fd\u6709\u5355\u72ec\u7684\u9501\uff0c\u5e76\u4e14\u5904\u4e8e\u4e0d\u540c\u9501\u6bb5\u7684\u6570\u636e\u4e92\u4e0d\u5e72\u6270\uff0c\u4ee5\u6b64\u6765\u63d0\u5347\u9501\u7684\u6027\u80fd\u3002<\/p>\n<p>\u6bd4\u5982\u5728\u79d2\u6740\u6263\u5e93\u5b58\u7684\u573a\u666f\u4e2d\uff0c\u73b0\u5728\u7684\u5e93\u5b58\u4e2d\u67092000\u4e2a\u5546\u54c1\uff0c\u7528\u6237\u53ef\u4ee5\u79d2\u6740\u3002\u4e3a\u4e86\u9632\u6b62\u51fa\u73b0\u8d85\u5356\u7684\u60c5\u51b5\uff0c\u901a\u5e38\u60c5\u51b5\u4e0b\uff0c\u53ef\u4ee5\u5bf9\u5e93\u5b58\u52a0\u9501\u3002\u5982\u679c\u67091W\u7684\u7528\u6237\u7ade\u4e89\u540c\u4e00\u628a\u9501\uff0c\u663e\u7136\u7cfb\u7edf\u541e\u5410\u91cf\u4f1a\u975e\u5e38\u4f4e\u3002\u4e3a\u4e86\u63d0\u5347\u7cfb\u7edf\u6027\u80fd\uff0c\u6211\u4eec\u53ef\u4ee5\u5c06\u5e93\u5b58\u5206\u6bb5\uff0c\u6bd4\u5982\uff1a\u5206\u4e3a100\u6bb5\uff0c\u8fd9\u6837\u6bcf\u6bb5\u5c31\u670920\u4e2a\u5546\u54c1\u53ef\u4ee5\u53c2\u4e0e\u79d2\u6740\u3002\u5728\u79d2\u6740\u7684\u8fc7\u7a0b\u4e2d\uff0c\u5148\u628a\u7528\u6237id\u83b7\u53d6hash\u503c\uff0c\u7136\u540e\u9664\u4ee5100\u53d6\u6a21\u3002\u6a21\u4e3a1\u7684\u7528\u6237\u8bbf\u95ee\u7b2c1\u6bb5\u5e93\u5b58\uff0c\u6a21\u4e3a2\u7684\u7528\u6237\u8bbf\u95ee\u7b2c2\u6bb5\u5e93\u5b58\uff0c\u6a21\u4e3a3\u7684\u7528\u6237\u8bbf\u95ee\u7b2c3\u6bb5\u5e93\u5b58\uff0c\u540e\u9762\u4ee5\u6b64\u7c7b\u63a8\uff0c\u5230\u6700\u540e\u6a21\u4e3a100\u7684\u7528\u6237\u8bbf\u95ee\u7b2c100\u6bb5\u5e93\u5b58\u3002\u5982\u6b64\u4e00\u6765\uff0c\u5728\u591a\u7ebf\u7a0b\u73af\u5883\u4e2d\uff0c\u53ef\u4ee5\u5927\u5927\u7684\u51cf\u5c11\u9501\u7684\u51b2\u7a81\u3002<\/p>\n<h2><strong>\u4e8c\u3001\u91cd\u70b9\u5206\u5e03\u5f0f\u573a\u666fredisson\u548czk\u7684\u9501\u7684\u4ecb\u7ecd<\/strong><\/h2>\n<h4>Redisson<\/h4>\n<p>\u6211\u4eec\u65e5\u5e38\u5f00\u53d1\u4e2d\u7528\u7528\u7684\u6700\u591a\u7684\u573a\u666f\u8fd8\u662f\u5206\u5e03\u5f0f\u9501\u3002\u63d0\u5230\u5206\u5e03\u5f0f\u9501\u5c31\u4e0d\u53ef\u56de\u907fRedisson\u3002WHY\uff1f \u4ed6\u5c31\u662f\u6743\u5a01\u597d\u7528\u3002\u4f7f\u7528\u573a\u666f\u6700\u591a\u6ca1\u6709\u4e4b\u4e00\u3002Redisson\u5b98\u65b9\u4e00\u5171\u63d0\u4f9b\u4e868\u628a\u9501\u3002\u6211\u4eec\u9010\u4e00\u770b\u4e00\u4e0b\u3002<\/p>\n<h5><strong>1 \u53ef\u91cd\u5165\u9501\uff08Reentrant Lock\uff09<\/strong><\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u5206\u5e03\u5f0f\u53ef\u91cd\u5165\u9501<code>**RLock**<\/code> Java\u5bf9\u8c61\u5b9e\u73b0\u4e86<code>java.util.concurrent.locks.Lock<\/code>\u63a5\u53e3\u3002\u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86\u5f02\u6b65\uff08<strong>Async<\/strong>\uff09\u3001\u53cd\u5c04\u5f0f\uff08<strong>Reactive<\/strong>\uff09\u548c<strong>RxJava2<\/strong>\u6807\u51c6\u7684\u63a5\u53e3\u3002<\/p>\n<pre><code>   public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n        \n        RLock lock = redisson.getLock(&quot;lock&quot;);\n        lock.lock(2, TimeUnit.SECONDS);\n\n        Thread t = new Thread() {\n            public void run() {\n                RLock lock1 = redisson.getLock(&quot;lock&quot;);\n                lock1.lock();\n                lock1.unlock();\n            };\n        };\n\n        t.start();\n        t.join();\n\n        redisson.shutdown();\n    }\n\n\n\n<\/code><\/pre>\n<p>\u5927\u5bb6\u90fd\u77e5\u9053\uff0c\u5982\u679c\u8d1f\u8d23\u50a8\u5b58\u8fd9\u4e2a\u5206\u5e03\u5f0f\u9501\u7684Redisson\u8282\u70b9\u5b95\u673a\u4ee5\u540e\uff0c\u800c\u4e14\u8fd9\u4e2a\u9501\u6b63\u597d\u5904\u4e8e\u9501\u4f4f\u7684\u72b6\u6001\u65f6\uff0c\u8fd9\u4e2a\u9501\u4f1a\u51fa\u73b0\u9501\u6b7b\u7684\u72b6\u6001\u3002\u4e3a\u4e86\u907f\u514d\u8fd9\u79cd\u60c5\u51b5\u7684\u53d1\u751f\uff0cRedisson\u5185\u90e8\u63d0\u4f9b\u4e86\u4e00\u4e2a\u76d1\u63a7\u9501\u7684\u770b\u95e8\u72d7\uff0c\u5b83\u7684\u4f5c\u7528\u662f\u5728Redisson\u5b9e\u4f8b\u88ab\u5173\u95ed\u524d\uff0c\u4e0d\u65ad\u7684\u5ef6\u957f\u9501\u7684\u6709\u6548\u671f\u3002\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u770b\u95e8\u72d7\u7684\u68c0\u67e5\u9501\u7684\u8d85\u65f6\u65f6\u95f4\u662f<strong>30\u79d2<\/strong>\u949f\uff0c\u4e5f\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539Config.lockWatchdogTimeout\u6765\u53e6\u884c\u6307\u5b9a\u3002<\/p>\n<p>\u53e6\u5916Redisson\u8fd8\u901a\u8fc7\u52a0\u9501\u7684\u65b9\u6cd5\u63d0\u4f9b\u4e86<code>leaseTime<\/code>\u7684\u53c2\u6570\u6765\u6307\u5b9a\u52a0\u9501\u7684\u65f6\u95f4\u3002\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\u540e\u9501\u4fbf\u81ea\u52a8\u89e3\u5f00\u4e86\u3002<\/p>\n<pre><code>\/\/ \u52a0\u9501\u4ee5\u540e10\u79d2\u949f\u81ea\u52a8\u89e3\u9501\n\/\/ \u65e0\u9700\u8c03\u7528unlock\u65b9\u6cd5\u624b\u52a8\u89e3\u9501\nlock.lock(10, TimeUnit.SECONDS);\n\n\/\/ \u5c1d\u8bd5\u52a0\u9501\uff0c\u6700\u591a\u7b49\u5f85100\u79d2\uff0c\u4e0a\u9501\u4ee5\u540e10\u79d2\u81ea\u52a8\u89e3\u9501\nboolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);\nif (res) {\n   try {\n     ...\n   } finally {\n       lock.unlock();\n   }\n}\n\n\n\n<\/code><\/pre>\n<p>Redisson\u540c\u65f6\u8fd8\u4e3a\u5206\u5e03\u5f0f\u9501\u63d0\u4f9b\u4e86\u5f02\u6b65\u6267\u884c\u7684\u76f8\u5173\u65b9\u6cd5\uff1a<\/p>\n<pre><code>RLock lock = redisson.getLock(&quot;anyLock&quot;);\nlock.lockAsync();\nlock.lockAsync(10, TimeUnit.SECONDS);\nFuture&lt;Boolean&gt; res = lock.tryLockAsync(100, 10, TimeUnit.SECONDS);\n\n\n\n<\/code><\/pre>\n<p><code>RLock<\/code>\u5bf9\u8c61\u5b8c\u5168\u7b26\u5408Java\u7684Lock\u89c4\u8303\u3002\u4e5f\u5c31\u662f\u8bf4\u53ea\u6709\u62e5\u6709\u9501\u7684\u8fdb\u7a0b\u624d\u80fd\u89e3\u9501\uff0c\u5176\u4ed6\u8fdb\u7a0b\u89e3\u9501\u5219\u4f1a\u629b\u51fa<code>IllegalMonitorStateException<\/code>\u9519\u8bef\u3002\u4f46\u662f\u5982\u679c\u9047\u5230\u9700\u8981\u5176\u4ed6\u8fdb\u7a0b\u4e5f\u80fd\u89e3\u9501\u7684\u60c5\u51b5\uff0c\u8bf7\u4f7f\u7528\u5206\u5e03\u5f0f\u4fe1\u53f7\u91cf<code>Semaphore<\/code> \u5bf9\u8c61.<\/p>\n<h5><strong>2. \u516c\u5e73\u9501\uff08Fair Lock\uff09<\/strong><\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u5206\u5e03\u5f0f\u53ef\u91cd\u5165\u516c\u5e73\u9501\u4e5f\u662f\u5b9e\u73b0\u4e86<code>java.util.concurrent.locks.Lock<\/code>\u63a5\u53e3\u7684\u4e00\u79cd<code>RLock<\/code>\u5bf9\u8c61\u3002\u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86\u5f02\u6b65\uff08Async\uff09\u3001\u53cd\u5c04\u5f0f\uff08Reactive\uff09\u548cRxJava2\u6807\u51c6\u7684\u63a5\u53e3\u3002\u5b83\u4fdd\u8bc1\u4e86\u5f53\u591a\u4e2aRedisson\u5ba2\u6237\u7aef\u7ebf\u7a0b\u540c\u65f6\u8bf7\u6c42\u52a0\u9501\u65f6\uff0c\u4f18\u5148\u5206\u914d\u7ed9\u5148\u53d1\u51fa\u8bf7\u6c42\u7684\u7ebf\u7a0b\u3002\u6240\u6709\u8bf7\u6c42\u7ebf\u7a0b\u4f1a\u5728\u4e00\u4e2a\u961f\u5217\u4e2d\u6392\u961f\uff0c\u5f53\u67d0\u4e2a\u7ebf\u7a0b\u51fa\u73b0\u5b95\u673a\u65f6\uff0cRedisson\u4f1a\u7b49\u5f855\u79d2\u540e\u7ee7\u7eed\u4e0b\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u4e5f\u5c31\u662f\u8bf4\u5982\u679c\u524d\u9762\u67095\u4e2a\u7ebf\u7a0b\u90fd\u5904\u4e8e\u7b49\u5f85\u72b6\u6001\uff0c\u90a3\u4e48\u540e\u9762\u7684\u7ebf\u7a0b\u4f1a\u7b49\u5f85\u81f3\u5c1125\u79d2\u3002<\/p>\n<pre><code>public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n        \n        RLock lock = redisson.getFairLock(&quot;test&quot;);\n\n        int size = 10;\n        List&lt;Thread&gt; threads = new ArrayList&lt;Thread&gt;();\n        for (int i = 0; i &lt; size; i++) {\n            final int j = i;\n            Thread t = new Thread() {\n                public void run() {\n                    lock.lock();\n                    lock.unlock();\n                };\n            };\n            \n            threads.add(t);\n        }\n        \n        for (Thread thread : threads) {\n            thread.start();\n            thread.join(5);\n        }\n        \n        for (Thread thread : threads) {\n            thread.join();\n        }\n    }\n\n<\/code><\/pre>\n<p>\u540c\u6837\u4e5f\u6709\u770b\u95e8\u72d7\u673a\u5236\u6765\u9632\u6b62\u6b7b\u9501\u3002\u53e6\u5916Redisson\u8fd8\u901a\u8fc7\u52a0\u9501\u7684\u65b9\u6cd5\u63d0\u4f9b\u4e86<code>leaseTime<\/code>\u7684\u53c2\u6570\u6765\u6307\u5b9a\u52a0\u9501\u7684\u65f6\u95f4\u3002\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\u540e\u9501\u4fbf\u81ea\u52a8\u89e3\u5f00\u4e86\u3002<\/p>\n<pre><code>\/\/ 10\u79d2\u949f\u4ee5\u540e\u81ea\u52a8\u89e3\u9501\n\/\/ \u65e0\u9700\u8c03\u7528unlock\u65b9\u6cd5\u624b\u52a8\u89e3\u9501\nfairLock.lock(10, TimeUnit.SECONDS);\n\n\/\/ \u5c1d\u8bd5\u52a0\u9501\uff0c\u6700\u591a\u7b49\u5f85100\u79d2\uff0c\u4e0a\u9501\u4ee5\u540e10\u79d2\u81ea\u52a8\u89e3\u9501\nboolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);\n...\nfairLock.unlock();\n\n\n\n<\/code><\/pre>\n<p>Redisson\u540c\u65f6\u8fd8\u4e3a\u5206\u5e03\u5f0f\u53ef\u91cd\u5165\u516c\u5e73\u9501\u63d0\u4f9b\u4e86\u5f02\u6b65\u6267\u884c\u7684\u76f8\u5173\u65b9\u6cd5\uff1a<\/p>\n<pre><code>RLock fairLock = redisson.getFairLock(&quot;anyLock&quot;);\nfairLock.lockAsync();\nfairLock.lockAsync(10, TimeUnit.SECONDS);\nFuture&lt;Boolean&gt; res = fairLock.tryLockAsync(100, 10, TimeUnit.SECONDS);\n\n\n\n<\/code><\/pre>\n<h5>3. \u8054\u9501\uff08MultiLock\uff09<\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u5206\u5e03\u5f0f\u8054\u9501<code>**RedissonMultiLock**<\/code>\u5bf9\u8c61\u53ef\u4ee5\u5c06\u591a\u4e2a<code>RLock<\/code>\u5bf9\u8c61\u5173\u8054\u4e3a\u4e00\u4e2a\u8054\u9501\uff0c\u6bcf\u4e2a<code>RLock<\/code>\u5bf9\u8c61\u5b9e\u4f8b\u53ef\u4ee5\u6765\u81ea\u4e8e\u4e0d\u540c\u7684Redisson\u5b9e\u4f8b\u3002<\/p>\n<pre><code>\n\n public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient client = Redisson.create();\n        \/\/ \u540c\u65f6\u52a0\u9501\uff1alock1 lock2 lock3 \u6240\u6709\u7684\u9501\u90fd\u4e0a\u9501\u6210\u529f\u624d\u7b97\u6210\u529f\u3002\n        RLock lock1 = client.getLock(&quot;lock1&quot;);\n        RLock lock2 = client.getLock(&quot;lock2&quot;);\n        RLock lock3 = client.getLock(&quot;lock3&quot;);\n        \n        Thread t = new Thread() {\n            public void run() {\n                RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);\n                lock.lock();\n                \n                try {\n                    Thread.sleep(3000);\n                } catch (InterruptedException e) {\n                }\n                \n                lock.unlock();\n            };\n        };\n        t.start();\n        t.join(1000);\n\n        RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);\n        lock.lock();\n        lock.unlock();\n    }\n\n<\/code><\/pre>\n<p>\u540c\u6837\u4e5f\u6709\u770b\u95e8\u72d7\u673a\u5236\u6765\u9632\u6b62\u6b7b\u9501\u3002\u53e6\u5916Redisson\u8fd8\u901a\u8fc7\u52a0\u9501\u7684\u65b9\u6cd5\u63d0\u4f9b\u4e86<code>leaseTime<\/code>\u7684\u53c2\u6570\u6765\u6307\u5b9a\u52a0\u9501\u7684\u65f6\u95f4\u3002\u8d85\u8fc7\u8fd9\u4e2a\u65f6\u95f4\u540e\u9501\u4fbf\u81ea\u52a8\u89e3\u5f00\u4e86\u3002<\/p>\n<pre><code>RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);\n\/\/ \u7ed9lock1\uff0clock2\uff0clock3\u52a0\u9501\uff0c\u5982\u679c\u6ca1\u6709\u624b\u52a8\u89e3\u5f00\u7684\u8bdd\uff0c10\u79d2\u949f\u540e\u5c06\u4f1a\u81ea\u52a8\u89e3\u5f00\nlock.lock(10, TimeUnit.SECONDS);\n\n\/\/ \u4e3a\u52a0\u9501\u7b49\u5f85100\u79d2\u65f6\u95f4\uff0c\u5e76\u5728\u52a0\u9501\u6210\u529f10\u79d2\u949f\u540e\u81ea\u52a8\u89e3\u5f00\nboolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);\n...\nlock.unlock();\n\n\n\n<\/code><\/pre>\n<h5>4. \u7ea2\u9501\uff08RedLock\uff09<\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u7ea2\u9501<code>RedissonRedLock<\/code>\u5bf9\u8c61\u5b9e\u73b0\u4e86<strong>Redlock<\/strong>\u4ecb\u7ecd\u7684\u52a0\u9501\u7b97\u6cd5\u3002\u8be5\u5bf9\u8c61\u4e5f\u53ef\u4ee5\u7528\u6765\u5c06\u591a\u4e2a<code>RLock<\/code>\u5bf9\u8c61\u5173\u8054\u4e3a\u4e00\u4e2a\u7ea2\u9501\uff0c\u6bcf\u4e2a<code>RLock<\/code>\u5bf9\u8c61\u5b9e\u4f8b\u53ef\u4ee5\u6765\u81ea\u4e8e\u4e0d\u540c\u7684Redisson\u5b9e\u4f8b\u3002<\/p>\n<pre><code>RLock lock1 = redissonInstance1.getLock(&quot;lock1&quot;);\nRLock lock2 = redissonInstance2.getLock(&quot;lock2&quot;);\nRLock lock3 = redissonInstance3.getLock(&quot;lock3&quot;);\n\nRedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);\n\/\/ \u540c\u65f6\u52a0\u9501\uff1alock1 lock2 lock3\n\/\/ \u7ea2\u9501\u5728\u5927\u90e8\u5206\u8282\u70b9\u4e0a\u52a0\u9501\u6210\u529f\u5c31\u7b97\u6210\u529f\u3002\nlock.lock();\n...\nlock.unlock();\n\u3002\n\n<\/code><\/pre>\n<pre><code>\n public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient client1 = Redisson.create();\n        RedissonClient client2 = Redisson.create();\n        \n        RLock lock1 = client1.getLock(&quot;lock1&quot;);\n        RLock lock2 = client1.getLock(&quot;lock2&quot;);\n        RLock lock3 = client2.getLock(&quot;lock3&quot;);\n        \n        Thread t1 = new Thread() {\n            public void run() {\n                lock3.lock();\n            };\n        };\n        t1.start();\n        t1.join();\n        \n        Thread t = new Thread() {\n            public void run() {\n                RedissonMultiLock lock = new RedissonRedLock(lock1, lock2, lock3);\n                lock.lock();\n                \n                try {\n                    Thread.sleep(3000);\n                } catch (InterruptedException e) {\n                }\n                lock.unlock();\n            };\n        };\n        t.start();\n        t.join(1000);\n\n        lock3.forceUnlock();\n        \n        RedissonMultiLock lock = new RedissonRedLock(lock1, lock2, lock3);\n        \/\/ \u7ed9lock1\uff0clock2\uff0clock3\u52a0\u9501\uff0c\u5982\u679c\u6ca1\u6709\u624b\u52a8\u89e3\u5f00\u7684\u8bdd\uff0c10\u79d2\u949f\u540e\u5c06\u4f1a\u81ea\u52a8\u89e3\u5f00\n        lock.lock(10, TimeUnit.SECONDS);\n        lock.unlock();\n\n        client1.shutdown();\n        client2.shutdown();\n    }\n    \n\n\n\n<\/code><\/pre>\n<h5>5. \u8bfb\u5199\u9501\uff08ReadWriteLock\uff09<\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u5206\u5e03\u5f0f\u53ef\u91cd\u5165\u8bfb\u5199\u9501<code>RReadWriteLock<\/code> Java\u5bf9\u8c61\u5b9e\u73b0\u4e86<code>java.util.concurrent.locks.ReadWriteLock<\/code>\u63a5\u53e3\u3002\u5176\u4e2d\u8bfb\u9501\u548c\u5199\u9501\u90fd\u7ee7\u627f\u4e86RLock\u63a5\u53e3\u3002<\/p>\n<p>\u5206\u5e03\u5f0f\u53ef\u91cd\u5165\u8bfb\u5199\u9501\u5141\u8bb8\u540c\u65f6\u6709\u591a\u4e2a\u8bfb\u9501\u548c\u4e00\u4e2a\u5199\u9501\u5904\u4e8e\u52a0\u9501\u72b6\u6001\u3002<\/p>\n<pre><code>RReadWriteLock rwlock = redisson.getReadWriteLock(&quot;anyRWLock&quot;);\n\/\/ \u6700\u5e38\u89c1\u7684\u4f7f\u7528\u65b9\u6cd5\nrwlock.readLock().lock();\n\/\/ \u6216\nrwlock.writeLock().lock();\n\n\n\n<\/code><\/pre>\n<pre><code>\n  public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n\n        final RReadWriteLock lock = redisson.getReadWriteLock(&quot;lock&quot;);\n\n        lock.writeLock().tryLock();\n\n        Thread t = new Thread() {\n            public void run() {\n                 RLock r = lock.readLock();\n                 \/\/ 10\u79d2\u949f\u4ee5\u540e\u81ea\u52a8\u89e3\u9501\uff0c\u65e0\u9700\u8c03\u7528unlock\u65b9\u6cd5\u624b\u52a8\u89e3\u9501\n                 \/\/lock.readLock().lock(10, TimeUnit.SECONDS);\n                 r.lock();\n\n                 try {\n                    Thread.sleep(1000);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n                r.unlock();\n            };\n        };\n\n        t.start();\n        t.join();\n\n        lock.writeLock().unlock();\n\n        t.join();\n        \n        redisson.shutdown();\n    }\n\n\n\n<\/code><\/pre>\n<h5>6. \u4fe1\u53f7\u91cf\uff08Semaphore\uff09<\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u7684\u5206\u5e03\u5f0f\u4fe1\u53f7\u91cf\uff08Semaphore\uff09Java\u5bf9\u8c61<code>RSemaphore<\/code>\u91c7\u7528\u4e86\u4e0e<code>java.util.concurrent.Semaphore<\/code>\u76f8\u4f3c\u7684\u63a5\u53e3\u548c\u7528\u6cd5\u3002\u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86\u5f02\u6b65\uff08Async\uff09\u3001\u53cd\u5c04\u5f0f\uff08Reactive\uff09\u548cRxJava2\u6807\u51c6\u7684\u63a5\u53e3\u3002<\/p>\n<pre><code>\n public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n\n        RSemaphore s = redisson.getSemaphore(&quot;test&quot;);\n        s.trySetPermits(5);\n        s.acquire(3);\n\n        Thread t = new Thread() {\n            @Override\n            public void run() {\n                RSemaphore s = redisson.getSemaphore(&quot;test&quot;);\n                s.release();\n                s.release();\n            }\n        };\n\n        t.start();\n        \/\/\u6216\n        s.acquire(4);\n        \n        redisson.shutdown();\n    }\n\n\n\n<\/code><\/pre>\n<h5>7. \u53ef\u8fc7\u671f\u6027\u4fe1\u53f7\u91cf\uff08PermitExpirableSemaphore\uff09<\/h5>\n<p>\u57fa\u4e8eRedis\u7684Redisson\u53ef\u8fc7\u671f\u6027\u4fe1\u53f7\u91cf\uff08PermitExpirableSemaphore\uff09\u662f\u5728<code>RSemaphore<\/code>\u5bf9\u8c61\u7684\u57fa\u7840\u4e0a\uff0c\u4e3a\u6bcf\u4e2a\u4fe1\u53f7\u589e\u52a0\u4e86\u4e00\u4e2a\u8fc7\u671f\u65f6\u95f4\u3002\u6bcf\u4e2a\u4fe1\u53f7\u53ef\u4ee5\u901a\u8fc7\u72ec\u7acb\u7684ID\u6765\u8fa8\u8bc6\uff0c\u91ca\u653e\u65f6\u53ea\u80fd\u901a\u8fc7\u63d0\u4ea4\u8fd9\u4e2aID\u624d\u80fd\u91ca\u653e\u3002\u5b83\u63d0\u4f9b\u4e86\u5f02\u6b65\uff08Async\uff09\u3001\u53cd\u5c04\u5f0f\uff08Reactive\uff09\u548cRxJava2\u6807\u51c6\u7684\u63a5\u53e3\u3002<\/p>\n<pre><code>\n public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n\n        RPermitExpirableSemaphore s = redisson.getPermitExpirableSemaphore(&quot;test&quot;);\n        s.trySetPermits(1);\n        \/\/ \u83b7\u53d6\u4e00\u4e2a\u4fe1\u53f7\uff0c\u6709\u6548\u671f\u53ea\u67092\u79d2\u949f\u3002\n        String permitId = s.tryAcquire(100, 2, TimeUnit.SECONDS);\n\n        Thread t = new Thread() {\n            public void run() {\n                RPermitExpirableSemaphore s = redisson.getPermitExpirableSemaphore(&quot;test&quot;);\n                try {\n                    String permitId = s.acquire();\n                    s.release(permitId);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            };\n        };\n\n        t.start();\n        t.join();\n        \n        s.tryRelease(permitId);\n        \n    }\n\n<\/code><\/pre>\n<h5>8. \u95ed\u9501\uff08CountDownLatch\uff09<\/h5>\n<p>\u57fa\u4e8eRedisson\u7684Redisson\u5206\u5e03\u5f0f\u95ed\u9501\uff08<strong>CountDownLatch<\/strong>\uff09Java\u5bf9\u8c61<code>RCountDownLatch<\/code>\u91c7\u7528\u4e86\u4e0e<code>java.util.concurrent.CountDownLatch<\/code>\u76f8\u4f3c\u7684\u63a5\u53e3\u548c\u7528\u6cd5\u3002<\/p>\n<pre><code> public static void main(String[] args) throws InterruptedException {\n        \/\/ connects to 127.0.0.1:6379 by default\n        RedissonClient redisson = Redisson.create();\n\n        ExecutorService executor = Executors.newFixedThreadPool(2);\n\n        final RCountDownLatch latch = redisson.getCountDownLatch(&quot;latch1&quot;);\n        latch.trySetCount(1);\n        \/\/ \u5728\u5176\u4ed6\u7ebf\u7a0b\u6216\u5176\u4ed6JVM\u91cc\n        executor.execute(new Runnable() {\n            @Override\n            public void run() {\n                latch.countDown();\n            }\n            \n        });\n\n        executor.execute(new Runnable() {\n\n            @Override\n            public void run() {\n                try {\n                    latch.await(550, TimeUnit.MILLISECONDS);\n                } catch (InterruptedException e) {\n                    e.printStackTrace();\n                }\n            }\n            \n        });\n\n        \n        executor.shutdown();\n        executor.awaitTermination(10, TimeUnit.SECONDS);\n\n    }\n\n<\/code><\/pre>\n<h4>Zookeeper<\/h4>\n<p>\u63a5\u7740\u6211\u4eec\u518d\u770bzookeeper\u7684\u9501\u3002zk\u4e0d\u662f\u4e3a\u9ad8\u53ef\u7528\u6027\u8bbe\u8ba1\u7684\uff0c\u4f46\u5b83\u4f7f\u7528<code>**ZAB**<\/code>\u534f\u8bae\u8fbe\u5230\u4e86\u6781\u9ad8\u7684\u4e00\u81f4\u6027\u3002\u6240\u4ee5\u5b83\u7ecf\u5e38\u88ab\u9009\u4f5c\u6ce8\u518c\u4e2d\u5fc3\u3001\u914d\u7f6e\u4e2d\u5fc3\u3001\u5206\u5e03\u5f0f\u9501\u7b49\u573a\u666f\u3002\u5b83\u7684\u6027\u80fd\u662f\u975e\u5e38\u6709\u9650\u7684\uff0c\u800c\u4e14API\u5e76\u4e0d\u662f\u90a3\u4e48\u597d\u7528\u3002xjjdog\u503e\u5411\u4e8e\u4f7f\u7528\u57fa\u4e8e<code>**Raft**<\/code>\u534f\u8bae\u7684<code>**Etcd**<\/code>\u6216\u8005<code>**Consul**<\/code>\uff0c\u5b83\u4eec\u66f4\u52a0\u8f7b\u91cf\u7ea7\u4e00\u4e9b\u3002\u6211\u4eec\u770b\u4e00\u4e0bzk\u7684\u52a0\u9501\u65f6\u5e8f\u56fe\u3002<\/p>\n<p><img decoding=\"async\"   referrerpolicy=\"no-referrer\" src=\"https:\/\/segmentfault.com\/img\/remote\/1460000044133166\" alt=\"\" title=\"\"><\/p>\n<p><strong>Curator<\/strong>\u662fnetflix\u516c\u53f8\u5f00\u6e90\u7684\u4e00\u5957zookeeper\u5ba2\u6237\u7aef\uff0c\u76ee\u524d\u662fApache\u7684\u9876\u7ea7\u9879\u76ee\u3002\u4e0eZookeeper\u63d0\u4f9b\u7684\u539f\u751f\u5ba2\u6237\u7aef\u76f8\u6bd4\uff0cCurator\u7684\u62bd\u8c61\u5c42\u6b21\u66f4\u9ad8\uff0c\u7b80\u5316\u4e86Zookeeper\u5ba2\u6237\u7aef\u7684\u5f00\u53d1\u91cf\u3002Curator\u89e3\u51b3\u4e86\u5f88\u591azookeeper\u5ba2\u6237\u7aef\u975e\u5e38\u5e95\u5c42\u7684\u7ec6\u8282\u5f00\u53d1\u5de5\u4f5c\uff0c\u5305\u62ec\u8fde\u63a5\u91cd\u8fde\u3001\u53cd\u590d\u6ce8\u518cwathcer\u548cNodeExistsException \u5f02\u5e38\u7b49\u3002Curator\u7531\u4e00\u7cfb\u5217\u7684\u6a21\u5757\u6784\u6210\uff0c\u5bf9\u4e8e\u4e00\u822c\u5f00\u53d1\u8005\u800c\u8a00\uff0c\u5e38\u7528\u7684\u662fcurator-framework\u548ccurator-recipes\uff0c\u6211\u4eec\u8df3\u8fc7\u4ed6\u7684\u5176\u4ed6\u80fd\u529b\uff0c\u76f4\u63a5\u770b\u5206\u5e03\u5f0f\u9501\u3002<\/p>\n<h5>1. \uff08\u53ef\u91cd\u5165\u9501 Shared Reentrant Lock\uff09<\/h5>\n<p>Shared\u610f\u5473\u7740\u9501\u662f\u5168\u5c40\u53ef\u89c1\u7684\uff0c \u5ba2\u6237\u7aef\u90fd\u53ef\u4ee5\u8bf7\u6c42\u9501\u3002 Reentrant\u548cJDK\u7684ReentrantLock\u7c7b\u4f3c\uff0c \u610f\u5473\u7740\u540c\u4e00\u4e2a\u5ba2\u6237\u7aef\u5728\u62e5\u6709\u9501\u7684\u540c\u65f6\uff0c\u53ef\u4ee5\u591a\u6b21\u83b7\u53d6\uff0c\u4e0d\u4f1a\u88ab\u963b\u585e\u3002 \u5b83\u662f\u7531\u7c7bInterProcessMutex\u6765\u5b9e\u73b0\u3002 \u901a\u8fc7acquire\u83b7\u5f97\u9501\uff0c\u5e76\u63d0\u4f9b\u8d85\u65f6\u673a\u5236\u3002\u901a\u8fc7release()\u65b9\u6cd5\u91ca\u653e\u9501\u3002 InterProcessMutex \u5b9e\u4f8b\u53ef\u4ee5\u91cd\u7528\u3002 Revoking ZooKeeper recipes wiki\u5b9a\u4e49\u4e86\u53ef\u534f\u5546\u7684\u64a4\u9500\u673a\u5236\u3002 \u4e3a\u4e86\u64a4\u9500mutex, \u8c03\u7528makeRevocable\u65b9\u6cd5\u3002\u6211\u4eec\u6765\u770b\u793a\u4f8b\uff1a<\/p>\n<pre><code>public class ExampleClientThatLocks {\n    private final InterProcessMutex lock;\n    private final FakeLimitedResource resource;\n    private final String clientName;\n\n    public ExampleClientThatLocks(\n            CuratorFramework client, String lockPath, FakeLimitedResource resource, String clientName) {\n        this.resource = resource;\n        this.clientName = clientName;\n        lock = new InterProcessMutex(client, lockPath);\n    }\n\n    public void doWork(long time, TimeUnit unit) throws Exception {\n        if (!lock.acquire(time, unit)) {\n            throw new IllegalStateException(clientName + &quot; could not acquire the lock&quot;);\n        }\n        try {\n            System.out.println(clientName + &quot; has the lock&quot;);\n            resource.use();\n        } finally {\n            System.out.println(clientName + &quot; releasing the lock&quot;);\n            \/\/\u91ca\u653e\u9501\n            lock.release();\n        }\n    }\n}\n\n<\/code><\/pre>\n<h5><strong>2.<\/strong> \u4e0d\u53ef\u91cd\u5165\u9501\uff08Shared Lock\uff09<\/h5>\n<p>\u4f7f\u7528InterProcessSemaphoreMutex\uff0c\u8c03\u7528\u65b9\u6cd5\u7c7b\u4f3c\uff0c\u533a\u522b\u5728\u4e8e\u8be5\u9501\u662f\u4e0d\u53ef\u91cd\u5165\u7684\uff0c\u5728\u540c\u4e00\u4e2a\u7ebf\u7a0b\u4e2d\u4e0d\u53ef\u91cd\u5165\u3002<\/p>\n<h5>3. \u53ef\u91cd\u5165\u8bfb\u5199\u9501\uff08Shared Reentrant Read Write Lock\uff09<\/h5>\n<p>\u7c7b\u4f3cJDK\u7684ReentrantReadWriteLock. \u4e00\u4e2a\u8bfb\u5199\u9501\u7ba1\u7406\u4e00\u5bf9\u76f8\u5173\u7684\u9501\u3002 \u4e00\u4e2a\u8d1f\u8d23\u8bfb\u64cd\u4f5c\uff0c\u53e6\u5916\u4e00\u4e2a\u8d1f\u8d23\u5199\u64cd\u4f5c\u3002 \u8bfb\u64cd\u4f5c\u5728\u5199\u9501\u6ca1\u88ab\u4f7f\u7528\u65f6\u53ef\u540c\u65f6\u7531\u591a\u4e2a\u8fdb\u7a0b\u4f7f\u7528\uff0c\u800c\u5199\u9501\u4f7f\u7528\u65f6\u4e0d\u5141\u8bb8\u8bfb (\u963b\u585e)\u3002 \u6b64\u9501\u662f\u53ef\u91cd\u5165\u7684\u3002\u4e00\u4e2a\u62e5\u6709\u5199\u9501\u7684\u7ebf\u7a0b\u53ef\u91cd\u5165\u8bfb\u9501\uff0c\u4f46\u662f\u8bfb\u9501\u5374\u4e0d\u80fd\u8fdb\u5165\u5199\u9501\u3002 \u8fd9\u4e5f\u610f\u5473\u7740\u5199\u9501\u53ef\u4ee5\u964d\u7ea7\u6210\u8bfb\u9501\uff0c \u6bd4\u5982\u8bf7\u6c42\u5199\u9501 \u2014&gt;\u8bfb\u9501 \u2014-&gt;\u91ca\u653e\u5199\u9501\u3002 \u4ece\u8bfb\u9501\u5347\u7ea7\u6210\u5199\u9501\u662f\u4e0d\u6210\u7684\u3002 \u4e3b\u8981\u7531\u4e24\u4e2a\u7c7b\u5b9e\u73b0\uff1a<\/p>\n<pre><code>InterProcessReadWriteLock\nInterProcessLock\n\n<\/code><\/pre>\n<h5>4. \u4fe1\u53f7\u91cf\uff08Shared Semaphore\uff09<\/h5>\n<p>\u4e00\u4e2a\u8ba1\u6570\u7684\u4fe1\u53f7\u91cf\u7c7b\u4f3cJDK\u7684Semaphore\u3002 JDK\u4e2dSemaphore\u7ef4\u62a4\u7684\u4e00\u7ec4\u8bb8\u53ef(permits)\uff0c\u800cCubator\u4e2d\u79f0\u4e4b\u4e3a\u79df\u7ea6(Lease)\u3002\u6ce8\u610f\uff0c\u6240\u6709\u7684\u5b9e\u4f8b\u5fc5\u987b\u4f7f\u7528\u76f8\u540c\u7684numberOfLeases\u503c\u3002 \u8c03\u7528acquire\u4f1a\u8fd4\u56de\u4e00\u4e2a\u79df\u7ea6\u5bf9\u8c61\u3002 \u5ba2\u6237\u7aef\u5fc5\u987b\u5728finally\u4e2dclose\u8fd9\u4e9b\u79df\u7ea6\u5bf9\u8c61\uff0c\u5426\u5219\u8fd9\u4e9b\u79df\u7ea6\u4f1a\u4e22\u5931\u6389\u3002 \u4f46\u662f\uff0c \u4f46\u662f\uff0c\u5982\u679c\u5ba2\u6237\u7aefsession\u7531\u4e8e\u67d0\u79cd\u539f\u56e0\u6bd4\u5982crash\u4e22\u6389\uff0c \u90a3\u4e48\u8fd9\u4e9b\u5ba2\u6237\u7aef\u6301\u6709\u7684\u79df\u7ea6\u4f1a\u81ea\u52a8close\uff0c \u8fd9\u6837\u5176\u5b83\u5ba2\u6237\u7aef\u53ef\u4ee5\u7ee7\u7eed\u4f7f\u7528\u8fd9\u4e9b\u79df\u7ea6\u3002 \u79df\u7ea6\u8fd8\u53ef\u4ee5\u901a\u8fc7\u4e0b\u9762\u7684\u65b9\u5f0f\u8fd4\u8fd8\uff1a<\/p>\n<pre><code>public void returnAll(Collection&lt;Lease&gt; leases)\npublic void returnLease(Lease lease)\n\n<\/code><\/pre>\n<p>\u6ce8\u610f\u4e00\u6b21\u4f60\u53ef\u4ee5\u8bf7\u6c42\u591a\u4e2a\u79df\u7ea6\uff0c\u5982\u679cSemaphore\u5f53\u524d\u7684\u79df\u7ea6\u4e0d\u591f\uff0c\u5219\u8bf7\u6c42\u7ebf\u7a0b\u4f1a\u88ab\u963b\u585e\u3002 \u540c\u65f6\u8fd8\u63d0\u4f9b\u4e86\u8d85\u65f6\u7684\u91cd\u8f7d\u65b9\u6cd5:<\/p>\n<pre><code>public Lease acquire()\npublic Collection&lt;Lease&gt; acquire(int qty)\npublic Lease acquire(long time, TimeUnit unit)\npublic Collection&lt;Lease&gt; acquire(int qty, long time, TimeUnit unit)\n\n\n\n<\/code><\/pre>\n<p>\u4e3b\u8981\u7c7b\u6709:<\/p>\n<pre><code>InterProcessSemaphoreV2\nLease\nSharedCountReader\n\n<\/code><\/pre>\n<h5>5. \u591a\u9501\u5bf9\u8c61\uff08Multi Shared Lock\uff09<\/h5>\n<p>Multi Shared Lock\u662f\u4e00\u4e2a\u9501\u7684\u5bb9\u5668\u3002 \u5f53\u8c03\u7528acquire\uff0c \u6240\u6709\u7684\u9501\u90fd\u4f1a\u88abacquire\uff0c\u5982\u679c\u8bf7\u6c42\u5931\u8d25\uff0c\u6240\u6709\u7684\u9501\u90fd\u4f1a\u88abrelease\u3002 \u540c\u6837\u8c03\u7528release\u65f6\u6240\u6709\u7684\u9501\u90fd\u88abrelease(\u5931\u8d25\u88ab\u5ffd\u7565)\u3002 \u57fa\u672c\u4e0a\uff0c\u5b83\u5c31\u662f\u7ec4\u9501\u7684\u4ee3\u8868\uff0c\u5728\u5b83\u4e0a\u9762\u7684\u8bf7\u6c42\u91ca\u653e\u64cd\u4f5c\u90fd\u4f1a\u4f20\u9012\u7ed9\u5b83\u5305\u542b\u7684\u6240\u6709\u7684\u9501\u3002 \u4e3b\u8981\u6d89\u53ca\u4e24\u4e2a\u7c7b\uff1a<\/p>\n<pre><code>InterProcessMultiLock\nInterProcessLock\n\n<\/code><\/pre>\n<p>\u5b83\u7684\u6784\u9020\u51fd\u6570\u9700\u8981\u5305\u542b\u7684\u9501\u7684\u96c6\u5408\uff0c\u6216\u8005\u4e00\u7ec4ZooKeeper\u7684path\u3002<\/p>\n<pre><code>public InterProcessMultiLock(List&lt;InterProcessLock&gt; locks)\npublic InterProcessMultiLock(CuratorFramework client, List&lt;String&gt; paths)\n\n<\/code><\/pre>\n<h5>6. \u5b8c\u6574\u9501\u793a\u4f8b<\/h5>\n<p>\u6211\u4eec\u518d\u770b\u4e00\u4e2a\u5b98\u65b9\u5b8c\u6574\u9501\u793a\u4f8b\uff1a<\/p>\n<pre><code>public class LockingExample {\n    private static final int QTY = 5;\n    private static final int REPETITIONS = QTY * 10;\n\n    private static final String PATH = &quot;\/examples\/locks&quot;;\n\n    public static void main(String[] args) throws Exception {\n        \/\/ all of the useful sample code is in ExampleClientThatLocks.java\n\n        \/\/ FakeLimitedResource simulates some external resource that can only be access by one process at a time\n        final FakeLimitedResource resource = new FakeLimitedResource();\n\n        ExecutorService service = Executors.newFixedThreadPool(QTY);\n        final TestingServer server = new TestingServer();\n        try {\n            for (int i = 0; i &lt; QTY; ++i) {\n                final int index = i;\n                Callable&lt;Void&gt; task = new Callable&lt;Void&gt;() {\n                    @Override\n                    public Void call() throws Exception {\n                        CuratorFramework client = CuratorFrameworkFactory.newClient(\n                                server.getConnectString(), new ExponentialBackoffRetry(1000, 3));\n                        try {\n                            client.start();\n\n                            ExampleClientThatLocks example =\n                                    new ExampleClientThatLocks(client, PATH, resource, &quot;Client &quot; + index);\n                            for (int j = 0; j &lt; REPETITIONS; ++j) {\n                                example.doWork(10, TimeUnit.SECONDS);\n                            }\n                        } catch (InterruptedException e) {\n                            Thread.currentThread().interrupt();\n                        } catch (Exception e) {\n                            e.printStackTrace();\n                            \/\/ log or do something\n                        } finally {\n                            CloseableUtils.closeQuietly(client);\n                        }\n                        return null;\n                    }\n                };\n                service.submit(task);\n            }\n\n            service.shutdown();\n            service.awaitTermination(10, TimeUnit.MINUTES);\n        } finally {\n            CloseableUtils.closeQuietly(server);\n        }\n    }\n}\n\n<\/code><\/pre>\n<h2><strong>\u4e09\u3001\u603b\u7ed3<\/strong><\/h2>\n<p>\u5206\u5e03\u5f0f\u73af\u5883\u4e2d\uff0c\u6211\u4eec\u59cb\u7ec8\u7ed5\u4e0d\u5f00CAP\u7406\u8bba\uff0c\u8fd9\u4e5f\u662fRedisson\u9501\u548cZK\u9501\u7684\u672c\u8d28\u533a\u522b\u3002CAP\u6307\u7684\u662f\u5728\u4e00\u4e2a\u5206\u5e03\u5f0f\u7cfb\u7edf\u4e2d\uff1a\u4e00\u81f4\u6027\uff08Consistency\uff09\u3001\u53ef\u7528\u6027\uff08Availability\uff09\u3001\u5206\u533a\u5bb9\u9519\u6027\uff08Partition tolerance\uff09\u3002<\/p>\n<p>\u8fd9\u4e09\u4e2a\u8981\u7d20\u6700\u591a\u53ea\u80fd\u540c\u65f6\u5b9e\u73b0\u4e24\u70b9\uff0c\u4e0d\u53ef\u80fd\u4e09\u8005\u517c\u987e\u3002\u5982\u679c\u4f60\u7684\u5b9e\u9645\u4e1a\u52a1\u573a\u666f\uff0c\u66f4\u9700\u8981\u7684\u662f\u4fdd\u8bc1\u6570\u636e\u4e00\u81f4\u6027\u3002\u90a3\u4e48\u8bf7\u4f7f\u7528CP\u7c7b\u578b\u7684\u5206\u5e03\u5f0f\u9501\uff0c\u6bd4\u5982\uff1azookeeper\uff0c\u5b83\u662f\u57fa\u4e8e\u78c1\u76d8\u7684\uff0c\u6027\u80fd\u53ef\u80fd\u6ca1\u90a3\u4e48\u597d\uff0c\u4f46\u6570\u636e\u4e00\u822c\u4e0d\u4f1a\u4e22\u3002<\/p>\n<p>\u5982\u679c\u4f60\u7684\u5b9e\u9645\u4e1a\u52a1\u573a\u666f\uff0c\u66f4\u9700\u8981\u7684\u662f\u4fdd\u8bc1\u6570\u636e\u9ad8\u53ef\u7528\u6027\u3002\u90a3\u4e48\u8bf7\u4f7f\u7528AP\u7c7b\u578b\u7684\u5206\u5e03\u5f0f\u9501\uff0c\u6bd4\u5982\uff1aRedisson\uff0c\u5b83\u662f\u57fa\u4e8e\u5185\u5b58\u7684\uff0c\u6027\u80fd\u6bd4\u8f83\u597d\uff0c\u4f46\u6709\u4e22\u5931\u6570\u636e\u7684\u98ce\u9669\u3002<\/p>\n<p><strong>\u5176\u5b9e\uff0c\u5728\u6211\u4eec\u7edd\u5927\u591a\u6570\u5206\u5e03\u5f0f\u4e1a\u52a1\u573a\u666f\u4e2d\uff0c\u4f7f\u7528Redisson\u5206\u5e03\u5f0f\u9501\u5c31\u591f\u4e86\uff0c\u771f\u7684\u522b\u592a\u8f83\u771f\u3002\u56e0\u4e3a\u6570\u636e\u4e0d\u4e00\u81f4\u95ee\u9898\uff0c\u53ef\u4ee5\u901a\u8fc7\u6700\u7ec8\u4e00\u81f4\u6027\u65b9\u6848\u89e3\u51b3\u3002\u4f46\u5982\u679c\u7cfb\u7edf\u4e0d\u53ef\u7528\u4e86\uff0c\u5bf9\u7528\u6237\u6765\u8bf4\u662f\u66b4\u51fb\u4e00\u4e07\u70b9\u4f24\u5bb3\u3002<\/strong><\/p>\n<h2><strong>\u56db\u3001\u601d\u8003\u601d\u8003<\/strong><\/h2>\n<p>\u4ee5\u4e0a\u5c31\u662f\u6211\u5bf9\u9501\u7684\u603b\u7ed3\u548c\u3002\u5206\u5e03\u5f0f\u9501\u4e0d\u662f\u5b8c\u7f8e\u7684\uff0c\u603b\u4f1a\u6709\u95ee\u9898\uff1b\u5982\uff1a\u5728redis\u4e2d\uff0clockName\u548c\u5df2\u6709\u7684key\u4e0d\u80fd\u91cd\u540d \uff01unlock\u7684\u524d\u63d0\u662flock\u6210\u529f\uff01\u5fc5\u987b\u8981\u8bbe\u8ba1\u81ea\u5df1\u7684\u515c\u5e95\u65b9\u6848&#8230;&#8230;<\/p>\n<p>\u56de\u987e\u6574\u4e2a\u9501\u754c\uff0c\u5144\u5f1f\u4eec\u90fd\u638c\u63e1\u4e86\u54ea\u4e9b\u9501\u5462\uff1f\u5728\u5206\u5e03\u5f0f\u9501\u7684\u573a\u666f\u4e2d\u90fd\u9047\u5230\u54ea\u4e9b\u7591\u96be\u6742\u75c7\uff1f\u6211\u4eec<strong>\u8bc4\u8bba\u533a<\/strong>\u7ee7\u7eed<\/p>\n<h2><strong>\u4e94\u3001\u5907\u6ce8<\/strong><\/h2>\n<p>redisson\uff1a<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=h0FRGnFBUWzvHmcEQ7kQ5Q%3D%3D.MMQ7eYxa3E5NvbXBSZJrFiLg3o9R5OsueQh3NY24S50x2nG%2F4WenxzG8yh2T0wvVbN%2BSY4hu8aVurTO0IXYP5R5HcYn2NoAJuf9S%2BdDkR7QqAhQ6qeSYd1X1Dj65kRuY62yCs%2Bwj7143ITy4uFPP%2Ffp%2B%2F8VXcWXVYWJ3Kv5u8VE%3D\" rel=\"noopener noreferrer\">\u5b98\u65b9\u5b9e\u4f8b<\/a><\/p>\n<p><a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=cGqcKir1v%2B8k%2BfB4Uhfoqg%3D%3D.%2F0IWZoJFowzMyPyF%2BEILP9O%2Bavg1fo6rt5PwHQ5JNfRejK1eMTK%2FCJgg%2FrlI1rLom5XTMipgCXgj45mSGnghVYnNLi7h4VyopCmkPBbIFgzz1jfEfmUdS2spf1O5VK1V\" rel=\"noopener noreferrer\">\u5b98\u65b9\u4ee3\u7801\u793a\u4f8b<\/a><\/p>\n<p>curator\uff1a<\/p>\n<p><a target=\"_blank\" href=\"https:\/\/link.segmentfault.com\/?enc=m09l%2FXvqb4KncZINjdKdxw%3D%3D.ofktY1dFKMdmHo4ocLSu%2BMAvcVQeQWrcHjf0Z9TvX%2FwTU8r6snk1D%2Br%2FrQUBqELUcOmclYCybp1wHzVHheoBdQ%3D%3D\" rel=\"noopener noreferrer\">curator\u7684ZK\u5ba2\u6237\u7aef\u793a\u4f8b<\/a><\/p>\n<blockquote><p>\u4f5c\u8005\uff1a\u4eac\u4e1c\u4fdd\u9669 \u7ba1\u987a\u5229  <br \/>\u6765\u6e90\uff1a\u4eac\u4e1c\u4e91\u5f00\u53d1\u8005\u793e\u533a \u8f6c\u8f7d\u8bf7\u6ce8\u660e\u6765\u6e90<\/p><\/blockquote>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000044133164\">https:\/\/segmentfault.com\/a\/1190000044133164<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u5f00\u7bc7\u80cc\u666f \u201c\u9501\u201d\u4ee3\u8868\u5b89\u5168\u3002\u5728\u7a0b\u5e8f\u4e2d\uff08\u8fd9\u91cc\u6307java\uff09\u5c24\u5176\u591a\u7ebf\u7a0b\u73af\u5883\u4e0b\uff0c\u6709\u4e86\u9501\u7684\u5e2e\u52a9\uff0c\u4f1a\u7ed9\u6570\u636e\u5b89\u5168\u5e26\u6765\u4fdd\u969c\uff0c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-10008120","post","type-post","status-publish","format-standard","hentry","category-share"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10008120"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10008120\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10008120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10008120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10008120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}