string(14) "127.0.0.1:9200"
URL: http://127.0.0.1:9200/likecs_art_db/_search
REQUEST:
Array
(
[query] => Array
(
[match] => Array
(
[text] => Array
(
[query] => 自己动手写把”锁”---终极篇
)
)
)
[highlight] => Array
(
[fields] => Array
(
[text] => stdClass Object
(
)
)
[pre_tags] => #em#
[post_tags] => #/em#
)
[size] => 8
[from] => 0
)
RESPONSE:string(8533) "{"took":26,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":10000,"relation":"gte"},"max_score":51.500824,"hits":[{"_index":"likecs_art_db","_type":"_doc","_id":"4763","_score":51.500824,"_source":{"id":"4763","text":"\u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d---\u7ec8\u6781\u7bc7","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"qingquanzi","tagsname":"\u9501|\u591a\u7ebf\u7a0b|\u7ebf\u7a0b\u5b89\u5168","tagsid":"[\"2653\",\"986\",3274]","catesname":"","catesid":"[]","createtime":"1515716781"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”---#em#终#/em##em#极#/em##em#篇#/em#"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"4213","_score":37.102364,"_source":{"id":"4213","text":"\u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d---LockSupport\u6df1\u5165\u6d45\u51fa\n \n\n\n\n\n\n \u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d\u4e4b---\u9501\u7684\u4f5c\u7528\u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d\u4e4b---JMM\u548cvolatile\u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d---\u539f\u5b50\u6027\u64cd\u4f5c","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"qingquanzi","tagsname":null,"tagsid":"","catesname":"","catesid":"","createtime":"1635242893"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”---LockSupport深入浅出\n \n\n\n\n\n\n #em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”之---#em#锁#/em#的作用#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”之---JMM和volatile#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"4161","_score":32.00665,"_source":{"id":"4161","text":"\u81ea\u5df1\u52a8\u624b\u5199\u628a\u201d\u9501\u201d---\u539f\u5b50\u6027\u64cd\u4f5c","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"qingquanzi","tagsname":"cas|\u539f\u5b50\u6027","tagsid":"[2960,2961]","catesname":"","catesid":"[]","createtime":"1515243283"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em##em#把#/em#”#em#锁#/em#”---原子性操作"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"203355930","_score":25.51006,"_source":{"id":"203355930","text":"\u81ea\u5df1\u52a8\u624b\u5199printf","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1634258199"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#printf"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"203355935","_score":25.51006,"_source":{"id":"203355935","text":"\u81ea\u5df1\u52a8\u624b\u5199Chapter1","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1620146065"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#Chapter1"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"516704","_score":25.211048,"_source":{"id":"516704","text":"\u624b\u628a\u624b\u7f16\u5199\u81ea\u5df1\u7684PHPMVC\u6846\u67b6","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"csd97","tagsname":"","tagsid":"","catesname":null,"catesid":"","createtime":"1634557092"},"highlight":{"text":["#em#手#/em##em#把#/em##em#手#/em#编#em#写#/em##em#自#/em##em#己#/em#的PHPMVC框架"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"156144","_score":24.908155,"_source":{"id":"156144","text":"Swing\uff1aLookAndFeel \u6559\u7a0b\u7b2c\u4e00\u7bc7\u2014\u2014\u624b\u628a\u624b\u6559\u4f60\u5199\u51fa\u81ea\u5df1\u7684 LookAndFeel","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"zhchoutai","tagsname":"","tagsid":"","catesname":"","catesid":"","createtime":"1628238052"},"highlight":{"text":["Swing:LookAndFeel 教程第一#em#篇#/em#——#em#手#/em##em#把#/em##em#手#/em#教你#em#写#/em#出#em#自#/em##em#己#/em#的 LookAndFeel"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"203355928","_score":24.781282,"_source":{"id":"203355928","text":"\u81ea\u5df1\u52a8\u624b\u5199SQL\u67e5\u8be2\u5f15\u64ce-\u603b\u7bc7","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1634202556"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#SQL查询引擎-总#em#篇#/em#"]}}]}}"
string(14) "127.0.0.1:9200"
URL: http://127.0.0.1:9200/likecs_art_db/_search
REQUEST:Array
(
[query] => Array
(
[match] => Array
(
[text] => Array
(
[query] => 自己动手写把”锁”---终极篇
)
)
)
[highlight] => Array
(
[fields] => Array
(
[text] => stdClass Object
(
)
)
[pre_tags] => #em#
[post_tags] => #/em#
)
[size] => 8
[from] => 8
)
RESPONSE:string(7535) "{"took":24,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":10000,"relation":"gte"},"max_score":51.500824,"hits":[{"_index":"likecs_art_db","_type":"_doc","_id":"355978","_score":24.490765,"_source":{"id":"355978","text":"\u81ea\u5df1\u52a8\u624b\u5199\u75c5\u6bd2","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"llguanli","tagsname":"","tagsid":"","catesname":"","catesid":"","createtime":"1633757481"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#病毒"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"335306","_score":24.490765,"_source":{"id":"335306","text":"\u81ea\u5df1\u52a8\u624b\u5199Impala UDF","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"163yun","tagsname":null,"tagsid":"","catesname":"","catesid":"","createtime":"1631811998"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#Impala UDF"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"203355931","_score":24.490765,"_source":{"id":"203355931","text":"\u81ea\u5df1\u52a8\u624b\u5199aop\uff08\u4e00\uff09","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1617374198"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#aop(一)"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"887026","_score":23.622456,"_source":{"id":"887026","text":"\u81ea\u5df1\u52a8\u624b\u5199\u64cd\u4f5c\u7cfb\u7edf(\u4e00) \n \n\n\n\n\n\n\t\u81ea\u5df1\u52a8\u624b\u5199\u64cd\u4f5c\u7cfb\u7edf(\u4e00)","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"xw009","tagsname":"","tagsid":"","catesname":"","catesid":"","createtime":"1638217560"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#操作系统(一) \n \n\n\n\n\n\n\t#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#操作系统(一)"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"672302","_score":23.549795,"_source":{"id":"672302","text":"\u81ea\u5df1\u52a8\u624b\u5199easyui\u7684checkbox","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"huanghaihua","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1635803525"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#easyui的checkbox"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"335303","_score":23.549795,"_source":{"id":"335303","text":"CodeSmith\u81ea\u5df1\u52a8\u624b\u5199\u6a21\u677f","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"sunniest","tagsname":"","tagsid":"","catesname":null,"catesid":"","createtime":"1631811996"},"highlight":{"text":["CodeSmith#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#模板"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"335269","_score":23.549795,"_source":{"id":"335269","text":"\u81ea\u5df1\u52a8\u624b\u5199\u7f16\u8bd1\u5668","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"boyublog","tagsname":null,"tagsid":"","catesname":"","catesid":"","createtime":"1631811939"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#编译器"]}},{"_index":"likecs_art_db","_type":"_doc","_id":"203282269","_score":23.549795,"_source":{"id":"203282269","text":"\u81ea\u5df1\u52a8\u624b\u5199MVC\u6846\u67b6","intro":"\u76ee\u5f55\n\nECharts\n\u5f02\u6b65\u52a0\u8f7d\n\n\n\nECharts\r\n\u6570\u636e\u53ef\u89c6\u5316\u5728\u8fc7\u53bb\u51e0\u5e74\u4e2d\u53d6\u5f97\u4e86\u5de8\u5927\u8fdb\u5c55\u3002\u5f00\u53d1\u4eba\u5458\u5bf9\u53ef\u89c6\u5316\u4ea7\u54c1\u7684\u671f\u671b\u4e0d\u518d\u662f\u7b80\u5355\u7684\u56fe\u8868\u521b\u5efa\u5de5\u5177\uff0c\u800c\u662f\u5728\u4ea4\u4e92\u3001\u6027\u80fd\u3001\u6570\u636e\u5904\u7406\u7b49\u65b9\u9762\u6709\u66f4\u9ad8\u7684\u8981\u6c42\u3002\r\nchart.setOption({\r\n color: [\r\n ","username":"","tagsname":null,"tagsid":"","catesname":null,"catesid":"","createtime":"1638017357"},"highlight":{"text":["#em#自#/em##em#己#/em##em#动#/em##em#手#/em##em#写#/em#MVC框架"]}}]}}"
string(14) "127.0.0.1:9200"
URL: http://192.168.101.128/searchcore/index.php/cihere_cn_db/_search
REQUEST:Array
(
[query] => Array
(
[match] => Array
(
[title] => Array
(
[query] => 自己动手写把”锁”---终极篇
)
)
)
[highlight] => Array
(
[fields] => Array
(
[title] => stdClass Object
(
)
)
[pre_tags] => #em#
[post_tags] => #/em#
)
[from] => 0
)
RESPONSE:bool(false)
string(14) "127.0.0.1:9200"
URL: http://127.0.0.1:9200/likecs_down_db/_search
REQUEST:Array
(
[query] => Array
(
[bool] => Array
(
[must] => Array
(
[0] => Array
(
[match] => Array
(
[title] => Array
(
[query] => 自己动手写把”锁”---终极篇
)
)
)
)
[must_not] => Array
(
[0] => Array
(
[term] => Array
(
[cate1] => 电子书籍
)
)
)
)
)
[highlight] => Array
(
[fields] => Array
(
[title] => stdClass Object
(
)
)
[pre_tags] => #em#
[post_tags] => #/em#
)
[size] => 5
[from] => 0
)
RESPONSE:string(2573) "{"took":15,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":{"value":7556,"relation":"eq"},"max_score":19.11183,"hits":[{"_index":"likecs_down_db","_type":"_doc","_id":"70048","_score":19.11183,"_source":{"id":"70048","title":"\u7ec8\u6781\u914d\u8272\u624b\u518c chm\u7248","spidertime":"1623125181","contenttime":"1625062950","pageimage":"https:\/\/img.jbzj.com\/do\/uploads\/litimg\/121016\/1435151DB.gif","tag":"\u7ec8\u6781\u914d\u8272\u624b\u518c","cate1":"\u7535\u5b50\u4e66\u7c4d","cate2":"\u56fe\u5f62\u56fe\u50cf","attr1":"388KB"},"highlight":{"title":["#em#终#/em##em#极#/em#配色#em#手#/em#册 chm版"]}},{"_index":"likecs_down_db","_type":"_doc","_id":"34936","_score":19.11183,"_source":{"id":"34936","title":"\u7ec8\u6781\u914d\u8272\u624b\u518c chm\u7248","spidertime":"1622959786","contenttime":"1672310153","pageimage":"https:\/\/img.jbzj.com\/do\/uploads\/litimg\/121016\/1435151DB.gif","tag":"\u7ec8\u6781\u914d\u8272\u624b\u518c","cate1":"\u7535\u5b50\u4e66\u7c4d","cate2":"\u56fe\u5f62\u56fe\u50cf","attr1":"388KB"},"highlight":{"title":["#em#终#/em##em#极#/em#配色#em#手#/em#册 chm版"]}},{"_index":"likecs_down_db","_type":"_doc","_id":"70243","_score":17.823212,"_source":{"id":"70243","title":"\u81ea\u5df2\u52a8\u624b\u5199\u64cd\u4f5c\u7cfb\u7edf\u6559\u7a0b","spidertime":"1623125452","contenttime":"1674000361","tag":"\u64cd\u4f5c\u7cfb\u7edf","cate1":"\u7535\u5b50\u4e66\u7c4d","cate2":"\u5176\u5b83\u76f8\u5173","attr1":"19.93MB"},"highlight":{"title":["#em#自#/em#已#em#动#/em##em#手#/em##em#写#/em#操作系统教程"]}},{"_index":"likecs_down_db","_type":"_doc","_id":"35137","_score":17.823212,"_source":{"id":"35137","title":"\u81ea\u5df2\u52a8\u624b\u5199\u64cd\u4f5c\u7cfb\u7edf\u6559\u7a0b","spidertime":"1622959974","contenttime":"1622959974","tag":"\u64cd\u4f5c\u7cfb\u7edf","cate1":"\u7535\u5b50\u4e66\u7c4d","cate2":"\u5176\u5b83\u76f8\u5173","attr1":"19.93MB"},"highlight":{"title":["#em#自#/em#已#em#动#/em##em#手#/em##em#写#/em#操作系统教程"]}},{"_index":"likecs_down_db","_type":"_doc","_id":"49181","_score":17.172031,"_source":{"id":"49181","title":"WAP asp\u81ea\u52a8\u5199\u8bd7 v1.0","spidertime":"1623052518","contenttime":"1624424532","pageimage":"https:\/\/img.jbzj.com\/do\/uploads\/litimg\/120116\/11433Q091S.gif","tag":"wap|\u81ea\u52a8\u5199\u8bd7","cate1":"\u6e90\u7801\u4e0b\u8f7d","cate2":"asp\u6e90\u7801","cate3":"\u91c7\u96c6\u5c0f\u5077","attr1":"5KB"},"highlight":{"title":["WAP asp#em#自#/em##em#动#/em##em#写#/em#诗 v1.0"]}}]}}"
自己动手写把”锁”---终极篇 - 爱码网
锁是整个Java并发包的实现基础,通过学习本系列文章,将对你理解Java并发包的本质有很大的帮助。
前边几篇中,我已经把实现锁用到的技术,进行了一一讲述。这其中有原子性、内存模型、LockSupport还有CAS,掌握了这些技术,即使没有本篇,你也完全有能力自己写一把锁出来。但为了本系列的完整性,我在这里还是把最后这一篇补上。
先说一下锁的运行流程:多个线程抢占同一把锁,只有一个线程能抢占成功,抢占成功的线程继续执行下边的逻辑,抢占失败的线程进入阻塞等待。抢占成功的线程执行完毕后,释放锁,并从等待的线程中挑一个唤醒,让它继续竞争锁。
转变成程序实现:我们首先定一个state变量,state=0表示未被加锁,state=1表示被加锁。多个线程在抢占锁时,竞争将state变量从0修改为1,修改成功的线程则加锁成功。state从0修改为1的过程,这里使用cas操作,以保证只有一个线程加锁成功,同时state需要用volatile修饰,已解决线程可见的问题。加锁成功的线程执行完业务逻辑后,将state从1修改回0,同时从等待的线程中选择一个线程唤醒。所以加锁失败的线程,在加锁失败时需要将自己放到一个集合中,以等待被唤醒。这个集合需要支持多线程并发安全,在这里我通过一个链表来实现,通过CAS操作来实现并发安全。
把思路说清楚了,咱们看下代码实现。
首先咱们实现一个ThreadList,这是一个链表结合,用来存放等待的处于等待唤醒的线程:
public class ThreadList{
private volatile Node head = null;
private static long headOffset;
private static Unsafe unsafe;
static {
try {
Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor(new Class<?>[0]);
constructor.setAccessible(true);
unsafe = constructor.newInstance(new Object[0]);
headOffset = unsafe.objectFieldOffset(ThreadList.class.getDeclaredField("head"));
}catch (Exception e){
}
}
/**
*
* @param thread
* @return 是否只有当前一个线程在等待
*/
public boolean insert(Thread thread){
Node node = new Node(thread);
for(;;){
Node first = getHead();
node.setNext(first);
if(unsafe.compareAndSwapObject(this, headOffset,first,node)){
return first==null?true:false;
}
}
}
public Thread pop(){
Node first = null;
for(;;){
first = getHead();
Node next = null;
if(first!=null){
next = first.getNext();
}
if(unsafe.compareAndSwapObject(this, headOffset,first,next)){
break;
}
}
return first==null?null:first.getThread();
}
private Node getHead(){
return this.head;
}
private static class Node{
volatile Node next;
volatile Thread thread;
public Node(Thread thread){
this.thread = thread;
}
public void setNext(Node next){
this.next = next;
}
public Node getNext(){
return next;
}
public Thread getThread(){
return this.thread;
}
}
}
加锁失败的线程,调用insert方法将自己放入这个集合中,insert方法里将线程封装到Node中,然后使用cas操作将node添加到列表的头部。同样为了线程可见的问题,Node里的thread和next都用volatile修饰。
加锁成功的线程,调用pop方法获得一个线程,进行唤醒,这里边同样使用了cas操作来保证线程安全。
接下来在看看锁的实现:
public class MyLock {
private volatile int state = 0;
private ThreadList threadList = new ThreadList();
private static long stateOffset;
private static Unsafe unsafe;
static {
try {
Constructor<Unsafe> constructor = Unsafe.class.getDeclaredConstructor(new Class<?>[0]);
constructor.setAccessible(true);
unsafe = constructor.newInstance(new Object[0]);
stateOffset = unsafe.objectFieldOffset(MyLock.class.getDeclaredField("state"));
}catch (Exception e){
}
}
public void lock(){
if(compareAndSetState(0,1)){
}else{
addNodeAndWait();
}
}
public void unLock(){
compareAndSetState(1,0);
Thread thread = threadList.pop();
if(thread != null){
LockSupport.unpark(thread);
}
}
private void addNodeAndWait(){
//如果当前只有一个等待线程时,重新获取一下锁,防止永远不被唤醒。
boolean isOnlyOne = threadList.insert(Thread.currentThread());
if(isOnlyOne && compareAndSetState(0,1)){
return;
}
LockSupport.park(this);//线程被挂起
if(compareAndSetState(0,1)){//线程被唤醒后继续竞争锁
return;
}else{
addNodeAndWait();
}
}
private boolean compareAndSetState(int expect,int update){
return unsafe.compareAndSwapInt(this,stateOffset,expect,update);
}
}
线程调用lock方法进行加锁,cas将state从0修改1,修改成功则加锁成功,lock方法返回,否则调用addNodeAndWait方法将线程加入ThreadList队列,并使用LockSupport将线程挂起。(ThreadList的insert方法,返回一个boolean类型的值,用来处理一个特殊情况的,稍后再说。)
获得锁的线程执行完业务逻辑后,调用unLock方法释放锁,即通过cas操作将state修改回0,同时从ThreadList拿出一个等待线程,调用LockSupport的unpark方法,来将它唤醒。
将我们在《自己动手写把"锁"---锁的作用》的例子修改为如下,来测试下咱们的锁的效果:
public class TestMyLock {
private static List<Integer> list = new ArrayList<>();
private static MyLock myLock = new MyLock();
public static void main(String[] args){
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;i<10000;i++){
add(i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
print();
}
});
t1.start();
t2.start();
}
private static void add(int i){
myLock.lock();
list.add(i);
myLock.unLock();
}
private static void print(){
myLock.lock();
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
myLock.unLock();
}
}
ok,正常运行了,不在报错。
到这里咱们的一个简单地锁已经实现了。接下来我再把上边的,一个没讲的细节说一下。即如下这段代码:
boolean isOnlyOne = threadList.insert(Thread.currentThread());
if(isOnlyOne && compareAndSetState(0,1)){
return;
}
ThreadList的insert方法,在插入成功后,会判断当前链表中是否只有自己一个线程在等待,如果是则返回true。从而进入后边的if语句。这个逻辑的用意就是:如果只有自己一个线程在等待时,则试着通过cas操作重新获取锁,如果获取失败才进入阻塞等待。它是用来解决以下边界情况:

在只有线程A和线程B两个线程的时候,如果没有以上判断逻辑,线程B将有可能会永远处于阻塞不被唤醒。
以下是本系列其他的文章:
自己动手写把”锁”之---锁的作用
自己动手写把”锁”之---JMM和volatile
自己动手写把”锁”---原子性操作
自己动手写把”锁”---LockSupport深入浅出
相关文章:
-
2021-10-09
-
2021-09-17
-
2021-04-02
-
2021-11-30
-
2021-11-02
-
2021-09-17
-
2021-09-17
-
2021-11-27
猜你喜欢
-
2021-10-26
-
2018-01-06
-
2021-10-15
-
2021-05-05
-
2021-10-18
-
2021-08-06
-
2021-10-14
相关资源
-
下载
2021-06-30
-
下载
2023-01-18
-
下载
2021-06-23