-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.json
More file actions
1 lines (1 loc) ยท 479 KB
/
Copy pathindex.json
File metadata and controls
1 lines (1 loc) ยท 479 KB
1
[{"categories":["Technology"],"content":"Spring Response","date":"2024-11-25","objectID":"/blog/20241125_springresponse/","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"ๅผ่จ ๅจๅฎ้
ๅผๅไธญ๏ผๅฆไฝๅค็ๆฏ่พ่ๆถ็ๆฅๅฃๅข๏ผ ๆฏไธๆฏๅคงๅฎถ็ฌฌไธๅๅบๆฏไธๅผๆญฅๆฅๅฃ๏ผไฝฟ็จCallableใWebAsyncTaskๅDeferredResultใCompletableFuture็ญๅๅฏๅฎ็ฐใ ไฝ่ฟไบๆนๆณๆๅฑ้ๆง๏ผๅค็็ปๆๅไป
่ฟๅๅไธชๅผใๆไบๅบๆฏไธญ๏ผๅฆๆ้่ฆๆฅๅฃๅผๆญฅๅค็ๅๆถ๏ผ่ฟๆ็ปญไธๆญๅฐๅๅฎขๆท็ซฏๅๅบๅค็็ปๆ๏ผ่ฟไบๆนๆณๅฐฑไธๅค็ไบใ Spring ๆกๆถๆไพไบๅค็งๅทฅๅ
ทๆฏๆๅผๆญฅๆตๅผๆฅๅฃ๏ผๅฆResponseBodyEmitterใSeeEmitterๅStreamingResponseBodyใ่ฟไบๅทฅๅ
ท็็จๆณ็ฎๅ๏ผๆฅๅฃไธญ็ดๆฅ่ฟๅ็ธๅบ็ๅฏน่ฑกๆๆณๅๅๅบๅฎไฝResponseEntity\u003cXXX\u003e๏ผๅฆๆญค่ฟไบๆฅๅฃๅฐฑๆฏๅผๆญฅ็๏ผไธๆง่ก่ๆถๆไฝๆถไบฆไธไผ้ปๅก Servlet็่ฏทๆฑ็บฟ็จ๏ผไธๅฝฑๅ็ณป็ป็ๅๅบ่ฝๅใ ไธ้ขๅฐ้ไธไป็ปไธไธๆฏไธชๅทฅๅ
ท็ไฝฟ็จๅๅ
ถๅบ็จๅบๆฏใ ","date":"2024-11-25","objectID":"/blog/20241125_springresponse/:1:0","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"ResponseBofyEmitter ResponseBodyEmitter้็จไบ่ฆๅจๆ็ๆๅ
ๅฎนๅนถ้ๆญฅๅ้็ปๅฎขๆท็ซฏ็ๅบๆฏ๏ผไพๅฆ๏ผๆไปถไธไผ ่ฟๅบฆใๅฎๆถๆฅๅฟ็ญ๏ผๅฏไปฅๅจไปปๅกๆง่ก่ฟ็จไธญ้ๆญฅๅๅฎขๆท็ซฏๅ้ๆดๆฐใ ไธพไธชไพๅญ๏ผ็ปๅธธ็จGPTไฝ ไผๅ็ฐๅฝไฝ ๆ้ฎๅ๏ผๅพๅฐ็็ญๆกๅนถไธๆฏไธๆฌกๆงๅๅบๅ็ฐ็๏ผ่ๆฏ้ๆญฅๅจๆๆพ็คบใ่ฟๆ ทๅ็ๅฅฝๅคๆฏ๏ผ่ฎฉไฝ ๆ่งๅฎๅจ่ฎค็ๆ่ใไบคไบไฝ้ชๆฏ็ดๆฅ่ฟๅๅฎๆด็ญๆกๆดไธบ็ๅจๅ่ช็ถใ GPTๅ็ญ้ฎ้ข ไฝฟ็จResponseBodyEmitterๆฅๅฎ็ฐ่ฟไธชๆๆๅนถไธ้พ๏ผ้ฆๅ
ๅๅปบResponseBodyEmitterๅ้ๅจๅฏน่ฑก๏ผๆจกๆ่ๆถๆไฝ้ๆญฅ่ฐ็จ send ๆนๆณๅ้ๆถๆฏใ ๆณจๆ๏ผResponseBodyEmitter็่ถ
ๆถๆถ้ด๏ผๅฆๆ่ฎพ็ฝฎไธบ 0 ๆ -1๏ผๅ่กจ็คบ่ฟๆฅไธไผ่ถ
ๆถ๏ผๅฆๆไธ่ฎพ็ฝฎ๏ผๅฐ่พพ้ป่ฎค็่ถ
ๆถๆถ้ดๅ่ฟๆฅไผ่ชๅจๆญๅผใๅ
ถไปไธค็งๅทฅๅ
ทไนๆฏๅๆ ท็็จๆณ๏ผๅ้ขไธๅ่ฟ่ก่ต่ฟฐไบใ @GetMapping(\"/bodyEmitter\") publicย ResponseBodyEmitterย handle()ย { //ย ๅๅปบไธไธชResponseBodyEmitter๏ผ-1ไปฃ่กจไธ่ถ
ๆถ ResponseBodyEmitterย emitterย =ย newย ResponseBodyEmitter(-1L); //ย ๅผๆญฅๆง่ก่ๆถๆไฝ CompletableFuture.runAsync(()ย -\u003eย { tryย { //ย ๆจกๆ่ๆถๆไฝ forย (intย iย =ย 0;ย iย \u003cย 10000;ย i++)ย { System.out.println(\"bodyEmitterย \"ย +ย i); //ย ๅ้ๆฐๆฎ emitter.send(\"bodyEmitterย \"ย +ย iย +ย \"ย @ย \"ย +ย newย Date()ย +ย \"\\n\"); Thread.sleep(2000); } //ย ๅฎๆ emitter.complete(); }ย catchย (Exceptionย e)ย { //ย ๅ็ๅผๅธธๆถ็ปๆๆฅๅฃ emitter.completeWithError(e); } }); returnย emitter; } ๅฎ็ฐไปฃ็ ้ๅธธ็ฎๅใ้่ฟๆจกๆๆฏ2็งๅๅบไธๆฌก็ปๆ๏ผ่ฏทๆฑๆฅๅฃๆถๅฏไปฅ็ๅฐ้กต้ขๆฐๆฎๅจๅจๆ็ๆใๆๆๅ GPT ๅ็ญๅบๆฌไธ่ดใ ResponseBodyEmitterไฝฟ็จๆๆ ","date":"2024-11-25","objectID":"/blog/20241125_springresponse/:2:0","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"SseEmitter SeeEmitterๆฏResponseBodyEmitter็ไธไธชๅญ็ฑป๏ผๅฎๅๆ ท่ฝๅคๅฎ็ฐๅจๆๅ
ๅฎน็ๆ๏ผไธ่ฟไธป่ฆๅฐๅฎ็จๅจ ๆๅกๅจๅๅฎขๆท็ซฏ ๆจ้ๅฎๆถๆฐๆฎ๏ผไพๅฆ๏ผๆถๆฏๆจ้ใ็ถๆๆดๆฐ็ญๅบๆฏใ SSEๅจๆๅกๅจๅๅฎขๆท็ซฏไน้ดๆๅผไธไธชๅๅ้้๏ผๆๅก็ซฏๅๅบ็ไธๅๆฏไธๆฌกๆง็ๆฐๆฎๅ
่ๆฏtext/event-stream็ฑปๅ็ๆฐๆฎๆตไฟกๆฏ๏ผๅจๆๆฐๆฎๅๆดๆถไปๆๅกๅจๆตๅผไผ ่พๅฐๅฎขๆท็ซฏใ  ๆดไฝ็ๅฎ็ฐๆ่ทฏๆ็น็ฑปไผผไบๅจ็บฟ่ง้ขๆญๆพ๏ผ่ง้ขๆตไผ่ฟ็ปญไธๆญๅฐๆจ้ๅฐๆต่งๅจ๏ผไฝ ไนๅฏไปฅ็่งฃๆ๏ผๅฎขๆท็ซฏๅจๅฎๆไธๆฌก็จๆถๅพ้ฟ๏ผ็ฝ็ปไธ็
๏ผ็ไธ่ฝฝใ ๅฎขๆท็ซฏJSๅฎ็ฐ๏ผ้่ฟไธๆฌก HTTP ่ฏทๆฑๅปบ็ซ่ฟๆฅๅ๏ผ็ญๅพ
ๆฅๆถๆถๆฏใๆญคๆถ๏ผๆๅก็ซฏไธบๆฏไธช่ฟๆฅๅๅปบไธไธชSseEmitterๅฏน่ฑก๏ผ้่ฟ่ฟไธช้้ๅๅฎขๆท็ซฏๅ้ๆถๆฏใ \u003cbody\u003e \u003cdivย id=\"content\"ย style=\"text-align:ย center;\"\u003e \u003ch1\u003eSSEย ๆฅๆถๆๅก็ซฏไบไปถๆถๆฏๆฐๆฎ\u003c/h1\u003e \u003cdivย id=\"message\"\u003e็ญๅพ
่ฟๆฅ...\u003c/div\u003e \u003c/div\u003e \u003cscript\u003e letย sourceย =ย null; letย userIdย =ย 7777 functionย setMessageInnerHTML(message)ย { constย messageDivย =ย document.getElementById(\"message\"); constย newParagraphย =ย document.createElement(\"p\"); newParagraph.textContentย =ย message; messageDiv.appendChild(newParagraph); } ifย (window.EventSource)ย { //ย ๅปบ็ซ่ฟๆฅ sourceย =ย newย EventSource('http://127.0.0.1:9033/subSseEmitter/'+userId); setMessageInnerHTML(\"่ฟๆฅ็จๆท=\"ย +ย userId); /** *ย ่ฟๆฅไธๆฆๅปบ็ซ๏ผๅฐฑไผ่งฆๅopenไบไปถ *ย ๅฆไธ็งๅๆณ๏ผsource.onopen = function (event)ย {} */ source.addEventListener('open',ย functionย (e)ย { setMessageInnerHTML(\"ๅปบ็ซ่ฟๆฅใใใ\"); },ย false); /** *ย ๅฎขๆท็ซฏๆถๅฐๆๅกๅจๅๆฅ็ๆฐๆฎ *ย ๅฆไธ็งๅๆณ๏ผsource.onmessage = function (event)ย {} */ source.addEventListener('message',ย functionย (e)ย { setMessageInnerHTML(e.data); }); }ย elseย { setMessageInnerHTML(\"ไฝ ็ๆต่งๅจไธๆฏๆSSE\"); } \u003c/script\u003e \u003c/body\u003e ๅจๆๅก็ซฏ๏ผๆไปฌๅฐSseEmitterๅ้ๅจๅฏน่ฑก่ฟ่กๆไน
ๅ๏ผไปฅไพฟๅจๆถๆฏไบง็ๆถ็ดๆฅๅๅบๅฏนๅบ็SseEmitterๅ้ๅจ๏ผๅนถ่ฐ็จsendๆนๆณ่ฟ่กๆจ้ใ privateย staticย finalย Map\u003cString,ย SseEmitter\u003eย EMITTER_MAPย =ย newย ConcurrentHashMap\u003c\u003e(); @GetMapping(\"/subSseEmitter/{userId}\") publicย SseEmitterย sseEmitter(@PathVariableย Stringย userId)ย { log.info(\"sseEmitter:ย {}\",ย userId); SseEmitterย emitterTmpย =ย newย SseEmitter(-1L); EMITTER_MAP.put(userId,ย emitterTmp); CompletableFuture.runAsync(()ย -\u003eย { tryย { SseEmitter.SseEventBuilderย eventย =ย SseEmitter.event() .data(\"sseEmitter\"ย +ย userIdย +ย \"ย @ย \"ย +ย LocalTime.now()) .id(String.valueOf(userId)) .name(\"sseEmitter\"); emitterTmp.send(event); }ย catchย (Exceptionย ex)ย { emitterTmp.completeWithError(ex); } }); returnย emitterTmp; } @GetMapping(\"/sendSseMsg/{userId}\") publicย voidย sseEmitter(@PathVariableย Stringย userId,ย Stringย msg)ย throwsย IOExceptionย { SseEmitterย sseEmitterย =ย EMITTER_MAP.get(userId); ifย (sseEmitterย ==ย null)ย { return; } sseEmitter.send(msg); } ่ไธSSEๆไธ็นๆฏ่พๅฅฝ๏ผๅฎขๆท็ซฏไธๆๅก็ซฏไธๆฆๅปบ็ซ่ฟๆฅ๏ผๅณไพฟๆๅก็ซฏๅ็้ๅฏ๏ผไนๅฏไปฅๅๅฐ่ชๅจ้่ฟใ SSE้่ฟ ","date":"2024-11-25","objectID":"/blog/20241125_springresponse/:3:0","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"StreamingResponseBody StreamingResponseBodyไธๅ
ถไปๅๅบๅค็ๆนๅผ็ฅๆไธๅ๏ผไธป่ฆ็จไบๅค็ๅคงๆฐๆฎ้ๆๆ็ปญๆฐๆฎๆต็ไผ ่พ๏ผๆฏๆๅฐๆฐๆฎ็ดๆฅๅๅ
ฅOutputStreamใ ไพๅฆ๏ผๅฝๆไปฌ้่ฆไธ่ฝฝไธไธช่ถ
ๅคงๆไปถๆถ๏ผไฝฟ็จStreamingResponseBodyๅฏไปฅ้ฟๅ
ๅฐๆไปถๆฐๆฎไธๆฌกๆงๅ ่ฝฝๅฐๅ
ๅญไธญ๏ผ่ๆฏๆ็ปญไธๆญ็ๆๆไปถๆตๅ้็ปๅฎขๆท็ซฏ๏ผไป่่งฃๅณไธ่ฝฝ่ถ
ๅคงๆไปถๆถๅธธ่ง็ๅ
ๅญๆบขๅบ้ฎ้ขใ ๆฅๅฃๅฎ็ฐ็ดๆฅ่ฟๅStreamingResponseBodyๅฏน่ฑก๏ผๅฐๆฐๆฎๅๅ
ฅ่พๅบๆตๅนถๅทๆฐ๏ผ่ฐ็จไธๆฌกflushๅฐฑไผๅๅฎขๆท็ซฏๅๅ
ฅไธๆฌกๆฐๆฎใ @GetMapping(\"/streamingResponse\") publicย ResponseEntity\u003cStreamingResponseBody\u003eย handleRbe()ย { StreamingResponseBodyย streamย =ย outย -\u003eย { Stringย messageย =ย \"streamingResponse\"; forย (intย iย =ย 0;ย iย \u003cย 1000;ย i++)ย { tryย { out.write(((messageย +ย i)ย +ย \"\\r\\n\").getBytes()); out.write(\"\\r\\n\".getBytes()); //่ฐ็จไธๆฌกflushๅฐฑไผๅๅ็ซฏๅๅ
ฅไธๆฌกๆฐๆฎ out.flush(); TimeUnit.SECONDS.sleep(1); }ย catchย (InterruptedExceptionย e)ย { e.printStackTrace(); } } }; returnย ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(stream); } demo่ฟ้่พๅบ็ๆฏ็ฎๅ็ๆๆฌๆต๏ผๅฆๆๆฏไธ่ฝฝๆไปถ้ฃไน่ฝฌๆขๆๆไปถๆตๆๆไธๆ ทใ StreamingResponseBodyๅฎ็ฐ ","date":"2024-11-25","objectID":"/blog/20241125_springresponse/:4:0","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"ๆป็ป ๆฌๆไป็ปไธ็งๅฎ็ฐๅผๆญฅๆตๅผๆฅๅฃ็ๅทฅๅ
ท๏ผ็ฎๆฏ Spring ็ฅ่ฏ็น็ๆซ็ฒใไฝฟ็จ่ตทๆฅๆฏ่พ็ฎๅ๏ผๆฒกๆไปไน้พ็น๏ผไฝๅฎไปฌๅจๅฎ้
ไธๅกไธญ็ๅบ็จๅบๆฏ่ฟๆฏๅพๅค็๏ผ้่ฟ่ฟไบๅทฅๅ
ท๏ผๅฏไปฅๆๆๆ้ซ็ณป็ป็ๆง่ฝๅๅๅบ่ฝๅใ ","date":"2024-11-25","objectID":"/blog/20241125_springresponse/:5:0","tags":["Spring","Http","Response","Api"],"title":"Springๅผๆญฅๆตๅผๆฅๅฃ","uri":"/blog/20241125_springresponse/"},{"categories":["Technology"],"content":"SpringCloud OpenFeign","date":"2024-10-22","objectID":"/blog/20241022_openfeign/","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"ๅผ่จ ็ฐๅจๆไปฌๅจๅพฎๆๅกๅผๅไธญ๏ผ็ฑไบๆๅกๆๅ๏ผๆไปฌไธๅฏ้ฟๅ
็ไผๆถๅไธไธชๆๅก้่ฆ่ฐ็จๅฆไธไธชๆๅก็ RPC ๅบๆฏ๏ผๅฏนไบ่ฟไธๅบๆฏ็ๅฎ็ฐๆๅพๅคๆนๆก๏ผๆไปฌๅฏไปฅ่ชๅทฑๅฐ่ฃ
httpClient๏ผไนๅฏไปฅไฝฟ็จRestTemplateๆ่
Dubbo๏ผไปฅๅๆๆฌๆ่ฆ่ฎฒ็OpenFeign๏ผ่ฟไบ้ฝๅฏไปฅๆนไพฟๆไปฌๆฅๅฎๆ่ฟ็จ่ฐ็จใ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:1:0","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"็คบไพ ๅ่ฎพๆไปฌๆไธไธชๅบๆฏ๏ผ ๆไปฌๆไธคไธชๆๅก๏ผ่ฎค่ฏๆ้ๆๅกauth-service๏ผ่ฟๆไธไธชๅบ็จๆๅกapp-service๏ผๅบ็จๆๅก็ปๅ
ฅ็ๆถๅ้่ฆ่ฐ็จ่ฎค่ฏๆ้ๆๅกๆฅ่ฟ่ก่ดฆๅท่ฎค่ฏๅๆ้ๆ ก้ชใ auth-serviceไธญๆไธไธช่ฎค่ฏๆฅๅฃ๏ผ @RestController @RequestMapping(\"/api) public class AuthController { @GetMapping(\"/auth\") public Boolean auth(@RequestBody AuthRequest authRequest){ // ่ฎค่ฏ้ป่พ ... return true; } } ่็ฑไบๆไปฌๅจapp-serviceไธญ้่ฆๅป่ฐ็จauth-service็authๆฅๅฃ๏ผๆไปฅๆไปฌๅฏไปฅไฝฟ็จOpenFeignๆฅๅธฎๆไปฌๅฎๆRPC็่ฟ็จ๏ผๅฎ็ฐๆญฅ้ชคๅฆไธ๏ผ ้ฆๅ
้่ฆๅผๅ
ฅmavenไพ่ต \u003cdependency\u003e \u003cgroupId\u003eorg.springframework.cloud\u003c/groupId\u003e \u003cartifactId\u003espring-cloud-starter-openfeign\u003c/artifactId\u003e \u003c/dependency\u003e ไฝฟ็จ@EnableFeignClientsๆณจ่งฃๆฅๅฏ็จOpenFeign็่ฝๅ,ๆฏๅฆๅฏไปฅๅจapp-serviceๅฏๅจ้กนAppServiceStaterไธๆ ๆณจ่ฟไธชๆณจ่งฃ๏ผ @EnableFeignClients @SpringBootApplication public class AppServiceStater { public static void main(String[] args) { SpringApplication.run(ServiceProviderAppStater.class, args); } } ไปฅๆฅๅฃ็ๆนๅผๆๅปบๆไปฌ้่ฆRPCๆไฝ็่ฟ็จๆฅๅฃ้
็ฝฎ ๆฏๅฆๅจ็ฎๅๅบๆฏไธญ๏ผๆไปฌ้่ฆๆไฝ่ฎค่ฏๆๅกauth-service็/api/authๆฅๅฃ๏ผ้ฃไนๆไปฌๅฏไปฅๅฆไธๆไฝ๏ผ @FeignClient(name = \"auth-service\",url = \"http://127.0.0.1:8080\") public interface AuthServiceRemoteClient { @GetMapping(value = \"/api/auth\") Boolean auth(@RequestBody AuthRequest); } ๆณจๅ
ฅ3ไธญๅ็ๆฅๅฃๅนถ่ฐ็จๆนๆณ @RestController public class NacosController { @Autowired AuthServiceRemoteClient authServiceRemoteClient; @GetMapping(\"/app/login\") public Boolean login(@RequestBody LoginRequest loginRequest){ // ่ฝฌๆขไธบAuthRequest auth AuthRequest authRequest = Convert(loginRequest); return authServiceRemoteClient.auth(authRequest); } } ๅฎๆไปฅไธๅ ไธชๆญฅ้ชคๅ๏ผๅฝๆไปฌ่ฏทๆฑapp-servie็loginๆฅๅฃ็ๆถๅ๏ผๅ
้จๅฐฑไผ่ฐ็จauth-service็authๆฅๅฃ่ฟ่ก่ฎค่ฏ๏ผๆดไธช่ฟ็จ่ฟๆฏๅพไธๆป็ใ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:2:0","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"ๆๆณๅ
ๆ ธ ไธ้ข็ๆกไพ๏ผ็ธไฟกไฝ ๅพๆณ็ฅ้ๆดไธชOpenFeign็ๅฎ็ฐๆฏๆไนๆ ท็๏ผๅไบ่งฃ็ป่ไนๅ๏ผๆไปฌๅ
็ซๅจไธๅธ่ง่งๆฅ็ไธ่ฟไธชๆๆณๅ
ๆ ธ๏ผ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:3:0","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"ๆๅปบ่ฟ็จ ๅฝ้กน็ฎๅฏๅจ็ๆถๅ๏ผOpenFeignไผๆซๆๆๅฎ็ๆ ๆณจไบ@FeignClient็ๆณจ่งฃ๏ผๆ นๆฎไธ้ขๆกไพๆไปฌๅฏไปฅ็ฅ้@FeignClientๆฏๆ ๆณจๅจๆฅๅฃไนไธ็๏ผๆซๆๅฐ่ฟไธชๆฅๅฃๅ๏ผOpenFeignไผ้่ฟJDKๅจๆไปฃ็็ๆนๅผไธบ่ฟไธชๆฅๅฃ็ๆไปฃ็ๅฏน่ฑก๏ผ่ๆฅๅฃไธญ็ๆฏไธไธชๆนๆณ้ฝๆฏๅฏนๅบไบไธไธช่ฟ็จ็APIๆฅๅฃ๏ผๅฆไฝๅจ่ฐ็จๆๅฎ็ๆนๆณๅฐฑๅฏไปฅ่ฐๅฐ่ฟ็จ็ๆๅฎๆฅๅฃๅข๏ผ ่ฟๆฏOpenFeignๅจ่งฃๆๆฅๅฃๆถ๏ผๆฅๅฃไธญ็ๆฏไธชๆนๆณไผ่ขซ่งฃๆๆMethodMeradataไฟกๆฏ๏ผ็ถๅๅ่ฝฌๆขๆMethodHandler๏ผๆ็ป่งฃๆๅฎๆๆ็ๆนๆณไผๆๆไธไธชMap\u003cMethod,MethodHandler\u003eๅฏน่ฑก๏ผ่่ฟไธชๅฏน่ฑกไผไฝไธบInvocationHandler็ไธไธชๅฑๆง่ๅญๅจ๏ผๆไปฌ้ฝ็ฅ้InvocationHandlerๆถJDKๅจๆไปฃ็็ไธไธชๆ ธๅฟ็ปไปถ๏ผๆๆ่ขซไปฃ็็ๅฏน่ฑกๆนๆณ่ฐ็จ้ฝไผ่ตฐๅฐInvocationHandler็invokeๆนๆณ้ป่พใ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:3:1","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"่ฐ็จๆง่ก่ฟ็จ ๅฝๅทฒ็ปๆๅปบๅฅฝๆๆ็@FeignClientๆ ๆณจๆฅๅฃ็ไปฃ็ๅฏน่ฑกๆถ๏ผๆไปฌ่ฐ็จๆๅฎ็ๆนๆณๆถ๏ผไผไปMap\u003cMethod,MethodHandler\u003eๅฏน่ฑกไธญๆ นๆฎMethodๆฅ่ทๅๆๅฎ็MethodHandlerๅฏน่ฑก๏ผ็ถๅๆง่กๅ
ถinvokeๆนๆณ่ฟ่ก็ๆญฃ็RPC้ป่พใ OpenFeignๆๅปบ่ฐ็จ่ฟ็จ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:3:2","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Technology"],"content":"ๆป็ป ๆฌ็ฏๆ็ซ ไธไป
ไป
ๆ่ฟฐไบOpenFeign็ๆๅปบๆง่ก็คบไพ๏ผไปฅๅๆดไธชJDKๅจๆไปฃ็็ๅฎ็ฐ๏ผๆฏๅจไธไธชๅพ้ซ็ๅฑ้ขๆฅ็ๆดไธชOpenFeign็ๅฎ็ฐๅ็๏ผ่่ฟไธๅ้ไธญไน้ๆญฃๆฏๅจMethodHandlerๅฏน่ฑก็invokeๆนๆณไนไธญใๆๅพ
ๆชๆฅๆไปฌไธ่ตทๆข็ดขใ ","date":"2024-10-22","objectID":"/blog/20241022_openfeign/:4:0","tags":["OpenFeign","SpringCloud","HTTP"],"title":"OpenFeign ๆต
่ฟฐ","uri":"/blog/20241022_openfeign/"},{"categories":["Daily"],"content":"่ฝฏไปถๅผๅไธญๅฟ
้กป็ฅ้็่ฅๅนฒๆๆณ","date":"2024-09-30","objectID":"/blog/20240930/","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"่ตทๅ ๆ่ฟๅจๅ
ฌๅธไธญๅ ไธบๅทฅไฝ้่ฆ๏ผ่ฎพ่ฎกๅผๅไบๅ ๆฌพ้็จๅทฅๅ
ทไธ้็จๆนๆก๏ผ็ฑๆญคๅฟไธไฝๆณๅๅ ๅฅๅด็ข๐๏ผๅ ไธบๅจ่ฎพ่ฎกๅผๅๆต็จไธญไผๆถๅ่ฏฆ่ฎพ่ฏๅฎก็ฏ่๏ผๅจ็ปๅ็่ฟๅ ๆฌก่ฏๅฎกไธญ๏ผๆๅ็ฐไบ่ฟไธ็ฏ่่ฎพ็ซ็ๅฟ
่ฆๆง๏ผๅ ไธบๅฏนไบๅผๅๆฅ่ฏด๏ผๆฏไธชไบบ็่ฎพ่ฎกๆๆณไธ่่่ง่งๆปๆฏไธๅ็๏ผๆฏ็ซไธไธไธชไบบๅฟไธญๆไธไธไธชๅๅง้ท็น๏ผๆไปฅๅจ่ฟๅ
ถไธญๆป่ฝ็ขฐๆๅบไธไบ็ตๆ็็ซ่ฑ๐ฅ๏ผๆฏ็ซ็ธ่ฃ็็ตๆๆปๆฏๅบ็ฐๅจไธ็ปๆ้ดใๅนถไธๅจ่ฟๅ
ถไธญไน่ฝไบ่งฃๅฐ่ชๅทฑ่ฎพ่ฎกๆๆณไธ็ไธ่ถณไธๆฌ ็ผบ๏ผ่ฟๅ
ถไธญๆ็ดๆฅๅ็ฐ็ๅฐฑๆฏ็ป้ชๅฆ๏ผ่ฟๅฏไธๆฏไนฆๆฌไธๆญป่ฎฐ็กฌ่่ฝๅคๅญฆไผ็ๅฆ๏ผๆไปฅ่ฟ็ฏๆ็ซ ่ฎฐๅฝๆป็ปไธไธ้ฃไบ็ปๅ
ธ็่ฎพ่ฎกๆๆณไธๆณๅ๏ผๅธฎๅฉๅคงๅฎถ่ฝๅค็ป็ปๅๅณใ๐คญ ","date":"2024-09-30","objectID":"/blog/20240930/:1:0","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๆ่ง ๆฏไธ็ง่ฏญ่จๆๅผๅๅทฅๅ
ท้ฝๆ็นๅฎ็็ฎ็๏ผ็จๆฅ่งฃๅณไปไน็ฑปๅ็้ฎ้ข๏ผๅ
ถ็น็นใไผ็นๆฏไปไน๏ผๆฏๅฆ ๅฝๅๆต่ก็JAVAใPYTHONใ.net๏ผ่ฆๆทฑๅ
ฅ็่งฃไปไปฌ็ๆๅคงไผๅฟๆฏไปไนใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:0","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"่ฎพ่ฎกๆจกๅผไธญๆๅฐ็ๅ
ญๅคง่ฎพ่ฎกๅๅ ๅไธ่่ดฃๅๅ ไปไธๅก็่งๅบฆ่ง่ๆจกๅๆๅๅ
ๅๅ่ๅด็้๏ผๅณไธๅกๆจกๅ็ๅคๅจ็้ใ ้ๆฐๆฟๆขๅๅ ้ไฟ็่ฎฒ๏ผๅฐฑๆฏ้ขๅๅฏน่ฑก๏ผๅ
ถๅฎไธไป
ไป
้ไบ้ขๅๅฏน่ฑก๏ผ็็ปงๆฟ๏ผๅ
ถๆฆๅฟตๆฏๅกๆฏๅฏน่ฑก A ๅบ็ฐ็ๅฐๆน๏ผ้ฝ่ฝ่ขซๅฏน่ฑก B ๆฟๆข๏ผๆปก่ถณ่ฟ็งๆ
ๅต๏ผๅฐฑๅบ่ฏฅ่ฎพ่ฎกๆ็ปงๆฟ็ปๆ๏ผๅณB extends Aใ IOC ๆ DI ๆณๅ ๅณไพ่ตๆณจๅ
ฅๆๆงๅถๅ่ฝฌ๏ผๅคงๅ้ผ้ผ็ๅผๆบๆกๆถSpring๏ผๅฐ่ฟไธๆๆณไฝ็ฐ็ๆทๆผๅฐฝ่ด๏ผๅ
ทไฝๆ่ทฏ๏ผๅ
ทไฝไพ่ตๆฝ่ฑก๏ผ็ฑไธปๅจ็โๆโ๏ผ่ฝฌๆขไธบ่ขซๅจ็โๆจโ๏ผไธ่ขซๆจ็็ฎๆ ๅจ็ผ่ฏๆถไธ็กฎๅฎ็๏ผๅจ่ฟ่กๆถๅจๆ็ปๅฎใ่ฟ้็จๅฐๅพ้่ฆ็ไธไธชๆๆณ๏ผๆฅๅฃ็ผ็จ๏ผไพ่ตๅ
ณ็ณปไผ ๅ
ฅๆฅๅฃ๏ผๅ
ทไฝ็ๅฎ็ฐๅจ่ฟ่กๆถๆๅฎ๏ผไธ่ฌ้่ฟ XML ้
็ฝฎๆจๅ
ฅใ ๆฅๅฃๅ็ฆปๅๅ ๅฅ็บฆ๏ผๆฅๅฃๅฎไน็ๅ่ฝ๏ผๅนถไธๆฏ่ถๅค่ถๅฅฝ๏ผๅ่ฝ่ถๅค๏ผ่ดฃไปป๏ผๅ
ทไฝ็ๅฎ็ฐ๏ผไปฃไปทไน่ถๅคง๏ผๅ ๆญคไปไธๅก็่งๅบฆๅ ไปฅๅๅๆฅๅฃ่ฆๆไพ็ๆโๅนฒๅโ็ๅ่ฝ๏ผๆฏๅฆ๏ผๅฏนๅบ็พ็่ง็น๏ผๆไธฐ่
ด๏ผไนๆ่ๆก๏ผๅฆๆๅๅนถๅจไธไธชๆฅๅฃไธญ๏ผ่ฝ็ถ็ผ็ ไธๆฒก้ฎ้ข๏ผไฝ็ปไบบ็ๆ่งๅฐฑๆฏ็็พไธๆชๅผ๏ผ่ฟ็งๆ
ๅตไธ๏ผๆพ็คบๆๅๅจไธคไธชๆฅๅฃๆฏ่พๅ็ใ ่ฟช็ฑณ็นๅๅ ็่ฟ็ต่งๅง็ไบบ๏ผ็ปๅธธๅฌๅฐ็ๆ็ๅฐ่ฏ๏ผโA๏ผไธบไปไน๏ผโ๏ผโB๏ผไฝ ็ฅ้็ๅคชๅคไบโฆโใ ๅฆๆๅไธ่่ดฃๅๅใๆฅๅฃๅ็ฆปๅๅๆฏๅฏนๅฏน่ฑกๅ
้จ็่ง่่ฆๆฑ็่ฏ๏ผ้ฃไนIOCๆณๅใ่ฟช็ฑณ็นๆณๅๅฐฑๆฏๅบไบๅฏน่ฑกไน้ดไพ่ตๆง็บฆๆ็็ธๅ
ณ่ง่๏ผๅฎไธ IOCๆณๅ ไธๆ ท๏ผๅบๅ็น้ฝๆฏโ่งฃๅถโ๏ผ่พพๅฐไฝ่ฆๅ็็ฎ็๏ผ่งฃๅถๆฏ้่ฆไปฃไปท็๏ผไธ่ฌ่ณๅฐๅผๅ
ฅไธไธชไธญ้ดๅฑ๏ผๅผๅ
ฅ็ไธญ้ดๅฑ่ถๅค๏ผไธ็ฎๆ ็่ฆๅๅบฆ่ถไฝ๏ผ่ฟๅ
ถๅฎๆฏๅๅฑๆๆณ็ไธไธชๅ
ธๅๅบ็จ๏ผๅ
ถๅฎ่ฟ้่ฟๆไธไธช้ๅฝขๅๅ๏ผๅฐฑๆฏไพ่ต็่ทฏ็บฟๆๅฅฝๆฏๅ็บฟ๏ผ1:1๏ผ๏ผ่ไธๆฏๆ ๅฝขๆ็ฝ็ถๅฏนๅบๅ
ณ็ณป๏ผ1:n ; n:m๏ผ ไพๅญ ๆ่ๅธใๅญฆ็2ไธชๅฏน่ฑก๏ผ่ๅธไธๅญฆ็็ดๆฅ่ฆๅ๏ผๅฆๆ่งฃๅถ๏ผๅฏไปฅๅผๅ
ฅ็ญ้ฟๆ่ฏพไปฃ่กจ่ฟไธชไธญ้ด่ง่ฒ๏ผ่ฟๆ ทๅฐฑๆไธไธช่ง่ฒไบ๏ผ่ฟๆถไธ่
ไน้ดๆๅฆไธๅ ็งไพ่ตๅ
ณ็ณป๏ผ # A.ๅ็บฟไพ่ต ่ๅธโโโโโโโ-\u003e็ญ้ฟ๏ผๆ่ฏพไปฃ่กจ๏ผโโโโโโโโ\u003eๅญฆ็ # B.้ๅ็บฟไพ่ต ่ๅธโโโโโโโ-\u003e็ญ้ฟ๏ผๆ่ฏพไปฃ่กจ๏ผโโโโโโโโ\u003eๅญฆ็ ่ๅธโโโโโโโ-\u003eๅญฆ็ ๅฏไปฅ็ๅฐ B ็ฑปๅ็ไพ่ตๅ
ณ็ณป๏ผ่ๅธไธไป
่ฆไพ่ต็ญ้ฟ๏ผ่ฟ่ฆไพ่ตๅญฆ็๏ผไบง็ๅค้ไพ่ต๏ผโ็ฅ้็ๅคชๅคโ๏ผๅนถไธๆฏไธไธชๅฅฝ็่งฃๅถๆนๅผ๏ผ่ A ็ฑปๅ็ไพ่ตๅ
ณ็ณปๅฐฑๆฏๆญฃ็กฎ็่ฟช็ฑณ็นๅๅ็ๅฎ็ฐไฝ็ฐใ ๅผ้ญๅๅ ่ฟ็งไธป่ฆๆฏ้ๅฏน็ผ็ ๆถ็่ง่่ฆๆฑ๏ผๅณๅฏนๆฐๅขๆนๆณๅผๆพ๏ผๅฏนๅทฒๆ็ๆนๆณ่ฟ่กไฟฎๆนๆๆฏๅ
ณ้ญ๏ผไนๅฐฑๆฏไฟ็ๅทฒ็ปๆ็็ๅฎ็ฐๆนๆณ๏ผๅฆๆ้ๆฑๆๅๅจ๏ผ้่ฟๅขๅ ๆฐ็ๆนๆณ๏ผๅฐๅฝฑๅๅบฆ้ไฝๅฐๆไฝ๏ผ็นๅซๆฏๆฐๆง็ๆฌๅๅธ็ๆถๅ๏ผๆไบ่ฟๅจ็ญๆชๅค็็ไธๅก๏ผไพๆง้่ฆๆฒฟ็จๅๆ็ไธๅก้ป่พใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:1","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๅๅฑๆๆณ ่ฟ้็ๅๅฑ๏ผๆฏ้ๅฏนๆถๆๅฑๆฌก็ๅๅฑ๏ผๅ
ธๅ็ WEB ๅบ็จไธ่ฌ้ฝไผ่ฟ่กๅๅฑ๏ผๆฏๅฆๅฑ็คบๅฑใไธๅก้ป่พๅฑใ้ขๅๆจกๅๅฑใๆฐๆฎ่ฎฟ้ฎๅฑ๏ผ่ฟๅฐฑๆฏๅ
ธๅ็ๅๅฑๆๆณ๏ผ่ฟๆ ท็ๅฅฝๅคๆฏ๏ผๆนไพฟ่ฝฏไปถ็ๅค็จใ็ปดๆค๏ผๅๅฐ็ปดๆคๆๆฌ๏ผไนๆนไพฟๆถๆ็ไผธ็ผฉใๆฉๅฑๆง๏ผSpring MVCไนๆฏๅ
ธๅๅๅฑ็ณป็ป็ๅฎ็ฐใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:2","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๆฅๅฃๅผๅๆๆณ ไธ้ข่ฎพ่ฎกๅๅไธญ็IOCๅๅๆๅฐ๏ผ่ฟ้ไนๆฏไธบไบๅผบ่ฐๆฅๅฃๅผๅ็ๅฅฝๅค๏ผ้่ฟๅผๅ
ฅๆฅๅฃๅฑ๏ผไฝฟๆจกๅๆ็ปไปถไน้ด็ไพ่ต้่ฟๆฅๅฃๆฅ่ฆๅ๏ผไธๆฏๅ
ทไฝ็ๅฎ็ฐๆฅ่ฆๅ๏ผ่ฟๆ ทๅๆไปฅไธๅ ็งๅฅฝๅค๏ผ ๆฅๅฃๅผๅๅฅฝๅค RPC่ฐ็จ๏ผๅฐๆฅๅฃไธๅฎ็ฐๅ็ฑป๏ผๆนไพฟๅฎขๆท็ซฏใๆๅก็ซฏ็้็ฆป๏ผๅฏนๅฎขๆท่่จ๏ผๅฎ็ฐๆนๅไบ๏ผไธๅฝฑๅๅฎขๆท็ซฏ็็ผ่ฏใ ้่ฟๆฅๅฃไพ่ต๏ผๅฎ็ฐ่งฃๅถ๏ผๆนไพฟไธๅกๆฉๅฑใๅๅจๅผ่ตท็ไธๅ็ปดๆค๏ผๅฐๅฝฑๅ้ๅฐๆไฝใ ๆนไพฟ่ฝฏไปถ็้็จ๏ผๆดๅฅฝ็็ปๅ่ฎพ่ฎกๆจกๅผไธญ็ๅ
ทไฝๅฎ็ฐๅตๅ
ฅใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:3","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"้
็ฝฎๆๆณ ๅธธ็จ็้
็ฝฎๆไปถๆ ผๅผๆ property๏ผxml๏ผyaml็ญ๏ผๅ
ถๅฅฝๅคๆฏ้
็ฝฎๅไบๆนๅจๅ๏ผๅฐฑไธ้่ฆ้ๆฐ็ผ่ฏ๏ผ้ๅฏๅบ็จๅณๅฏ็ๆ๏ผๆไบๅบ็จๅฏไปฅๅจๆๆๅ๏ผไธ็จ้ๅฏๅบ็จ๏ผ๏ผ็นๅซๆฏๅฎนๅจ็ฎก็้
็ฝฎ็็ปดๆค๏ผ็ๆญฃ่พพๅฐโๅไธคๆจๅๆคโ็ๆๆ๏ผibatisใmybatis็ mapper ๆๆณๅฐฑๆฏๆๅฅฝ็ไฝ็ฐ๏ผ้่ฟๅจๆ็ปดๆค XML ไธญ็ๆ ๅฐ่ฏญๅฅ๏ผ่พพๅฐๅจๆ่ฎฟ้ฎไธๅกๆฐๆฎ็ๅ่ฝใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:4","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๅ็ฆปๆๆณ ่ฟ้็ๅ็ฆปๆฏไธไธชๅพๅนฟๆณ็ๆๆณ๏ผๅฐๅฐไปฃ็ ๆจกๅๅๅ
๏ผๅคงๅฐๆๅกใๅญ็ณป็ป๏ผ้ฝๅซๆๅ็ฆป็ๆๆณ๏ผๅ
ๆฌ้
็ฝฎ้ฝๅ
ๅซ่ฅๅนฒๅ็ฆปๆๆณ็ๅบ็จ๏ผไนๆไปฅๅฆๆญค๏ผไธป่ฆๆฏๅๅธ็ฏๅข๏ผๅคไบบๅผๅๅข้ๅไฝ็ป่ฝฏไปถๅผๅ้ฉฑๅจ็ๅฟ
็ถ็ปๆ๏ผๆนไพฟๆฒป็ไนๅฅฝ๏ผๆนไพฟ็ปดๆคไน็ฝข๏ผๆปไนๅ
ถ็ฎ็ไธไธ่่ถณใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:5","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๅ้กตๆๆณ ้็็ณป็ปไธๅก้็ๅขๅ ๏ผๆฐๆฎ้ไนไผๅๆญฅๅข้ฟ๏ผๅฏนๆฐๆฎ็ๆๅไธๅฏผๅบๅธฆๆฅไบๆง่ฝไธ็ๅๅ๏ผๆฐๆฎๅ้กตๆฏๅๅๆๅฟ
่ฆ็๏ผๅ
ทไฝๅ
ๆฌๅ็ซฏๅ้กต๏ผJSๆไปถ๏ผใๅ็ซฏๅ้กต๏ผๆฐๆฎๅบ็ๅ้กตๆๅฏนๆฅ่ฏขๅบ็็ปๆ้่ฟ่ก่ฎก็ฎๅ้กต๏ผ๏ผ่ฟๆ ทไผๆๅคงๆ้ซ็ณป็ป็ๆง่ฝใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:6","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๅผๆญฅ่ฐ็จๆๆณ ๅฏนไบๅคๆๆไบคไบ้ๅคง็็ณป็ป๏ผๅพๅพ้่ฆไธๅจ่พน็ณป็ป่ฟ่กไบคไบๆฐๆฎ๏ผไธ่ฌ้่ฆ้่ฟ RPC ็ๆนๅผ่ฟ่ก่ฐ็จ๏ผๅฆๆๆฏๅ
็ๆฐๆฎ้ๆฏ่พๅคง๏ผ่ฐ็จๆฏ่พ้ข็น๏ผๅฆๆๅๆญฅๆนๅผๅค็๏ผๅฏน็ณป็ป็ๆง่ฝ่ฆๆฑๆฏ่พๅคง๏ผ่้็จๅผๆญฅๆนๅผ๏ผๅๆๅคงๆนๅๆง่ฝ๏ผ็นๅซๆฏๅฏนๅฎๆถๆงไธ้ซ็ไธๅกใ ","date":"2024-09-30","objectID":"/blog/20240930/:2:7","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Daily"],"content":"ๆป็ป hi๏ผไธ่ง้ดๅทฒ็ป็ๅฐ่ฟ้ไบ๏ผๅธๆ่ฟ้็ๅ
ๅฎน่ฝไฝไธบไฝ ่ฟๆญฅ็้ถๆขฏ๏ผๅฐไฝ ๅธฆๅปๆด้ซ็ๅฑ็บง๏ผๆไบๆใ ","date":"2024-09-30","objectID":"/blog/20240930/:3:0","tags":["daily","study"],"title":"ๅผๅๆๆณๆ่ง","uri":"/blog/20240930/"},{"categories":["Java"],"content":"JVM่ๆๆบ","date":"2024-07-22","objectID":"/blog/20240722_jvm/","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"ๆฆๅฟต JVM ๆฏ Java ็ๆ ธๅฟๅๅบ็ก๏ผๅคไบ Java ็ผ่ฏๅจๅ OS ๅนณๅฐไน้ด็่ๆๅค็ๅจใๅฎๆฏไธ็งๅฉ็จ่ฝฏไปถๆนๆณๅฎ็ฐ็ๆฝ่ฑก็่ฎก็ฎๆบๅบไบไธๅฑ็ๆไฝ็ณป็ปๅ็กฌไปถๅนณๅฐ๏ผๅฏไปฅๅจไธ้ขๆง่ก Java ็ๅญ่็ ็จๅบใJava ็ผ่ฏๅจๅช่ฆ้ขๅ JVM๏ผ็ๆ JVM ่ฝๅค็่งฃ็ไปฃ็ ๆๅญ่็ ๆไปถใJava ๆบๆไปถ็ป็ผ่ฏๆๅญ่็ ็จๅบ๏ผ้่ฟ JVM ๅฐๆฏไธๆกๆไปค็ฟป่ฏๆไธๅๅนณๅฐๆบๅจ็ ๏ผ้่ฟ็นๅฎ็ๅนณๅฐ่ฟ่กใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:1:0","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"JVM็็ๅฝๅจๆ JVM ็่ฏ็๏ผๅฝๅฏๅจไธไธช Java ็จๅบๆถ๏ผไธไธช JVM ๅฎไพๅฐฑไบง็ไบ๏ผไปปไฝไธไธชๆฅๆpublic static void main(String[] args)ๅฝๆฐ็ class ้ฝๅฏไปฅไฝไธบ JVM ๅฎไพ่ฟ่ก็่ตท็นใ JVM ๅฎไพ็่ฟ่ก๏ผmain() ไฝไธบ่ฏฅ็จๅบๅๅง็บฟ็จ็่ตท็น๏ผไปปไฝๅ
ถไป็บฟ็จๅ็ฑ่ฏฅ็บฟ็จๅฏๅจใJVM ๅ
้จๆไธค็ง็บฟ็จ๏ผๅฎๆค็บฟ็จๅ้ๅฎๆค็บฟ็จ๏ผmain() ๅฑไบ้ๅฎๆค็บฟ็จ๏ผๅฎๆค็บฟ็จ้ๅธธ็ฑ JVM ่ชๅทฑไฝฟ็จ๏ผJava ็จๅบไนๅฏไปฅๆ ๆ่ชๅทฑๅๅปบ็็บฟ็จๆฏๅฎๆค็บฟ็จใ JVM ๅฎไพ็ๆถไบก๏ผๅฝ็จๅบไธญ็ๆๆ้ๅฎๆค็บฟ็จ้ฝ็ปๆญขๆถ๏ผJVM ๆ้ๅบ๏ผ่ฅๅฎๅ
จ็ฎก็ๅจๅ
่ฎธ๏ผ็จๅบไนๅฏไปฅไฝฟ็จ java.lang.Runtime ็ฑปๆ่
java.lang.System.exit() ๆฅ้ๅบใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:2:0","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"JVM่ฟ่กๅ
ๅญๆจกๅ ๆฆๅฟต๏ผJVM ๆๆไปถ .class ๅญ่็ ๅ ่ฝฝๅฐๅ
ๅญ๏ผๅฏนๆฐๆฎ่ฟ่กๆ ก้ช๏ผ่ฝฌๆขๅ่งฃๆ๏ผๅนถๅๅงๅ๏ผๆ็ปๅฝขๆๅฏไปฅ่ขซ่ๆๆบ็ดๆฅไฝฟ็จ็ Java ็ฑปๅ๏ผ่ฟๅฐฑๆฏ่ๆๆบ็็ฑปๅ ่ฝฝๆบๅถใ ็ฑปๅ ่ฝฝๆบๅถ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:0","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"็ฑป่ฃ
่ฝฝๅจ ็ฑปๅ ่ฝฝๅจ็ไปปๅกๆฏๆ นๆฎไธไธช็ฑป็ๅ
จ้ๅฎๅๆฅ่ฏปๅๆญค็ฑป็ไบ่ฟๅถๅญ่ๆตๅฐ JVM ไธญ๏ผ็ถๅ่ฝฌๆขไธบไธไธชไธ็ฎๆ ๅฏนๅบ็ java.lang.Class ๅฏน่ฑกๅฎไพ ่ๆๆบๆไพ็ๅ็ฑป็ฑปๅ ่ฝฝๆบๅถ ๅฏๅจ็ฑปๅ ่ฝฝๅจ๏ผBootstrap ClassLoader๏ผ C++ ็ผๅ๏ผๅ ่ฝฝ Java ๆ ธๅฟ java.* ่ฟไธช็ฑปๅ ่ฝฝๅจ่ด่ฝฝๆพๅจ \u003cJAVA_HOME\u003e/lib ็ฎๅฝไธญ็๏ผๆ่
่ขซ -Xbootclasspath ๅๆฐๆๆๅฎ็่ทฏๅพไธญ๏ผๅนถไธๆฏ่ๆๆบ่ฏๅซ็็ฑปๅบใ็จๆทๆ ๆณ็ดๆฅไฝฟ็จใ ็ฑไบๅผๅฏผ็ฑปๅ ่ฝฝๅจๆถๅๅฐ่ๆๆบๆฌๅฐๅฎ็ฐ็ป่๏ผๅผๅ่
ๆ ๆณ็ดๆฅ่ทๅๅฐๅฏๅจ็ฑปๅ ่ฝฝๅจ็ๅผ็จ๏ผๆไปฅไธๅ
่ฎธ็ดๆฅ้่ฟๅผ็จ่ฟ่กๆไฝใ ๆฉๅฑ็ฑปๅ ่ฝฝๅจ๏ผExtension ClassLoader๏ผ Java ็ผๅ๏ผๅ ่ฝฝๆฉๅฑๅบ ่ฟไธช็ฑปๅ ่ฝฝๅจ็ฑ sun.misc.Launcher$AppClassLoader ๅฎ็ฐใๅฎ่ด่ดฃ \u003cJava_Home\u003e/lib/ext ็ฎๅฝไธญ็jarๆไปถ๏ผๆ่
่ขซ java.ext.dirs ็ณป็ปๅ้ๆๆๅฎ็่ทฏๅพไธญ็ๆๆ็ฑปๅบใ็จๆทๅฏไปฅ็ดๆฅไฝฟ็จใ ๅบ็จ็จๅบ็ฑปๅ ่ฝฝๅจ๏ผApplication ClassLoader๏ผ Java ็ผๅ๏ผๅ ่ฝฝ็จๅบๆๅจ็็ฎๅฝ ่ฟไธช็ฑป็ฑ sun.misc.Launcher$AppClassLoader ๅฎ็ฐใๆฏ ClassLoader ไธญ getSystemClassLoader() ๆนๆณ็่ฟๅๅผใๅฎ่ด่ดฃ็จๆท่ทฏๅพ๏ผClassPath๏ผๆๆๅฎ็็ฑปๅบใ็จๆทๅฏไปฅ็ดๆฅไฝฟ็จใๅฆๆ็จๆทๆฒกๆ่ชๅทฑๅฎไน็ฑปๅ ่ฝฝๅจ๏ผ้ป่ฎคไฝฟ็จ่ฟไธชใ ่ชๅฎไน็ฑปๅ ่ฝฝๅจ๏ผUser ClassLoader๏ผ ็จๆท่ชๅทฑๅฎไน็็ฑปๅ ่ฝฝๅจใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:1","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"ๅ็ ็ฑปไป่ขซๅ ่ฝฝๅฐ่ๆๆบๅ
ๅญไธญๅผๅง๏ผๅฐๅธ่ฝฝๅบๅ
ๅญไธบๆญข๏ผๅฎ็็ๅฝๅจๆๅ
ๆฌไธไธๆต็จ๏ผ ็ฑปๅ ่ฝฝๅ็ ๅ ่ฝฝ๏ผ้็น๏ผ ๅ ่ฝฝ้ถๆฎตๆฏโ็ฑปๅ ่ฝฝๆบๅถโไธญ็ไธไธช้ถๆฎต๏ผ่ฟไธช้ถๆฎต้ๅธธไน่ขซ็งฐไฝโ่ฃ
่ฝฝโ๏ผไธป่ฆๅฎๆ๏ผ ้่ฟโ็ฑปๅ
จๅโๆฅ่ทๅๅฎไนๆญค็ฑป็ไบ่ฟๅถๅญ่ๆต ๅฐๅญ่ๆตๆไปฃ่กจ็้ๆๅญๅจ็ปๆ่ฝฌๆขไธบๆนๆณๅบไธญ็่ฟ่กๆถๆฐๆฎ็ปๆโๆจก็ ๅจ Java ๅ ไธญ็ๆไธไธชไปฃ่กจ่ฟไธช็ฑป็ java.lang.Class ๅฏน่ฑก๏ผไฝไธบๆนๆณๅบ่ฟไบๆฐๆฎ็่ฎฟ้ฎๅ
ฅๅฃ ่งฃ้ ็ธๅฏนไบ็ฑปๅ ่ฝฝ่ฟ็จไธญ็ๅ
ถไป้ถๆฎต๏ผๅ ่ฝฝ้ถๆฎต๏ผๅ็กฎๆฅ่ฏด๏ผๆฏๅ ่ฝฝ้ถๆฎตไธญ่ทๅ็ฑป็ไบ่ฟๅถๅญ่ๆต็ๅจไฝ๏ผๆฏๅผๅๆๅฏๆงๆงๆๅผบ็้ถๆฎต๏ผๅ ไธบๅ ่ฝฝ้ถๆฎตๅฏไปฅไฝฟ็จ็ณป็ปๆไพ็็ฑปๅ ่ฝฝๅจ๏ผClassLoader๏ผๆฅๅฎๆ๏ผไนๅฏไปฅ็ฑ็จๆท่ชๅฎไน็็ฑปๅ ่ฝฝๅจๅฎๆ๏ผๅผๅไบบๅๅฏไปฅ้่ฟๅฎไน่ชๅทฑ็็ฑปๅ ่ฝฝๅจๅปๆงๅถๅญ่ๆต็่ทๅๆนๅผใ ๅ ่ฝฝ้ถๆฎตๅฎๆๅ๏ผ่ๆๆบๅค้จ็ไบ่ฟๅถๅญ่ๆตๅฐฑๆ็
ง่ๆๆบๆ้็ๆ ผๅผๅญๅจๅจๆนๆณๅบไนไธญ๏ผๆนๆณๅบไธญ็ๆฐๆฎๅญๅจๆ ผๅผ็ฑ่ๆๆบๅฎ็ฐ่ช่กๅฎไน๏ผ่ๆๆบๅนถๆช่งๅฎๆญคๅบๅ็ๅ
ทไฝๆฐๆฎ็ปๆใ็ถๅๅจ Java ๅ ไธญๅฎไพๅไธไธช java.lang.Class ็ฑป็ๅฏน่ฑก๏ผ่ฟไธชๅฏน่ฑกไฝไธบ็จๅบ่ฎฟ้ฎๆนๆณๅบไธญ็่ฟไบ็ฑปๅๆฐๆฎ็ๅค้จๆฅๅฃใ ้ช่ฏ ้ช่ฏๆฏ้พๆฅ้ถๆฎต็็ฌฌไธๆญฅ๏ผ่ฟไธๆญฅไธป่ฆ็็ฎ็ๆฏ็กฎไฟ class ๆไปถ็ๅญ่ๆตไธญๅ
ๅซ็ไฟกๆฏ็ฌฆๅๅฝๅ่ๆๆบ็่ฆๆฑ๏ผๅนถไธไธไผๅฑๅฎณ่ๆๆบ่ช่บซๅฎๅ
จใ ้ช่ฏ้ถๆฎตไธป่ฆๅ
ๆฌๅไธชๆฃ้ช่ฟ็จ๏ผๆไปถๆ ผๅผ้ช่ฏใๅ
ๆฐๆฎ้ช่ฏใๅญ่็ ้ช่ฏๅ็ฌฆๅทๅผ็จ้ช่ฏใ ๅๅค ๅๅค้ถๆฎตๆฏๆญฃๅผไธบ็ฑปๅ้ๅ้
ๅ
ๅญๅนถ่ฎพ็ฝฎ็ฑปๅ้ๅๅงๅผ็้ถๆฎต๏ผ่ฟไบๅ
ๅญ้ฝๅฐๅจๆนๆณๅบไธญ่ฟ่กๅ้
ใ่ฟไธช้ถๆฎตไธญๆไธคไธชๅฎนๆๆททๆท็็ฅ่ฏ็น๏ผ ้ฆๅ
ๆฏ่ฟไธชๆถๅ่ฟ่กๅ
ๅญๅ้
็ๅ้ไป
ๅ
ๆฌ็ฑปๅ้๏ผstatic ไฟฎ้ฅฐ็ๅ้๏ผ๏ผ่ไธๅ
ๆฌๅฎไพๅ้๏ผๅฎไพๅ้ๅฐไผๅจๅฏน่ฑกๅฎไพๅๆถ้็ๅฏน่ฑกไธ่ตทๅ้
ๅจ Java ๅ ไธญใ ๅ
ถๆฌกๆฏ่ฟ้ๆ่ฏด็ๅๅงๅผโ้ๅธธๆ
ๅตโไธๆฏๆฐๆฎ็ฑปๅ็้ถๅผ๏ผๅ่ฎพไธไธช็ฑปๅ้ๅฎไนไธบ๏ผ๏ผpublic static int value = 12;๏ผ้ฃไนๅ้ value ๅจๅๅค้ถๆฎต่ฟๅ็ๅๅงๅผไธบ0่ไธๆฏ12๏ผๅ ไธบ่ฟไธชๆถๅๅฐๆชๅผๅงๆง่กไปปไฝ Java ๆนๆณ๏ผ่ๆ valve ่ตๅผไธบ12็ๆไปคๆฏ่ขซ็จๅบ็ผ่ฏๅ๏ผๅญๆพๅจ็ฑปๆ้ ๅจ()ๆนๆณไนไธญ๏ผๆไปฅๆ value ่ตๅผไธบ12็ๅจไฝๅฐๅจๅๅงๅ้ถๆฎตๆไผ่ขซๆง่กใ ไธ้ขๆ่ฏด็โ้ๅธธๆ
ๅตโไธๅๅงๅผๆฏ้ถๅผ๏ผ้ฃ็ธๅฏนไธไบ็นๆฎๆ
ๅต๏ผๅฆๆ็ฑปๅญๆฎต็ๅญๆฎตๅฑๆง่กจไธญๅญๅจ ConstantValue ๅฑๆง๏ผ้ฃๅจๅๅค้ถๆฎตๅ้ value ๅฐฑไผ่ขซๅๅงๅไธบ ConstantValue ๅฑๆงๆๆๅฎ็ๅผ๏ผๅปบ่ฎฎไธ้ข็ฑปๅ้ value ๅฎไนไธบ(public static final int value = 12๏ผ)็ผ่ฏๆถ Java ๅฐไผไธบ value ็ๆ ConstantValue ๅฑๆง๏ผๅจๅๅค้ถๆฎต่ๆๆบๅฐฑไผๆ นๆฎ ConstantValue ็่ฎพ็ฝฎๅฐ value ่ฎพ็ฝฎไธบ12ใ ่งฃๆ ่งฃๆ้ถๆฎตๆฏ่ๆๆบๅธธ้ๆฑ ๅ
็็ฌฆๅทๅผ็จๆฟๆขไธบ็ดๆฅๅผ็จ็่ฟ็จ ็ฌฆๅทๅผ็จ๏ผ ็ฌฆๅทๅผ็จๆฏไธ็ป็ฌฆๅทๆฅๆ่ฟฐๆๅผ็จ็็ฎๆ ๅฏน่ฑก๏ผ็ฌฆๅทๅฏไปฅๆฏไปปไฝๅฝขๅผ็ๅญ้ข้๏ผๅช่ฆไฝฟ็จๆถ่ฝๆ ๆญงไนๅฐๅฎไฝๅฐ็ฎๆ ๅณๅฏใ็ฌฆๅทๅผ็จไธ่ๆๆบๅฎ็ฐ็ๅ
ๅญๅธๅฑๆ ๅ
ณ๏ผๅผ็จ็็ฎๆ ๅฏน่ฑกๅนถไธไธๅฎๅทฒ็ปๅ ่ฝฝๅฐๅ
ๅญไธญใ ็ดๆฅๅผ็จ๏ผ ็ดๆฅๅผ็จๅฏไปฅๆฏ็ดๆฅๆๅ็ฎๆ ๅฏน่ฑก็ๆ้ใ็ธๅฏนๅ็งป้ๆๆฏไธไธช่ฝ้ดๆฅๅฎไฝๅฐ็ฎๆ ็ๅฅๆใ็ดๆฅๅผ็จๆฏไธ่ๆๆบๅ
ๅญๅธๅฑๅฎ็ฐ็ธๅ
ณ็๏ผๅไธไธช็ฌฆๅทๅผ็จๅจไธๅ่ๆๆบๅฎไพไธ็ฟป่ฏๅบๆฅ็็ดๆฅๅผ็จไธ่ฌไธไผ็ธๅ๏ผๅฆๆๆไบ็ดๆฅๅผ็จ๏ผ้ฃๅผ็จ็็ฎๆ ๅฟ
ๅฎๆฏๅทฒ็ปๅจๅ
ๅญไธญๅญๅจใ ่งฃๆ็ๅจไฝไธป่ฆๅๅฏน็ฑปๆๆฅๅฃใๅญๆฎตใ็ฑปๆนๆณใๆฅๅฃๆนๆณๅ็ฑป็ฌฆๅทๅผ็จ่ฟ่กใๅๅซๅฏนๅบ็ผ่ฏๅๅธธ้ๆฑ ๅ
็ CONSTANT_CLASS_INFOใCONSTANT_FIELDREF_INFOใCONSTANT_METHODEF_INFOใCONSTANT_INTERFACEMETHODER_INFO ๅ็งๅธธ้็ฑปๅใ ็ฑปใๆฅๅฃ็่งฃๆ ๅญๆฎต่งฃๆ ็ฑปๆนๆณ่งฃๆ ๆฅๅฃๆนๆณ่งฃๆ ๅๅงๅ ็ฑปๅ ่ฝฝๆๅ้ถๆฎต๏ผ่ฅ่ฏฅ็ฑปๅ
ทๆ่ถ
็ฑป๏ผๅๅฏนๅ
ถ่ฟ่กๅๅงๅ๏ผๆง่ก้ๆๅๅงๅๅจๅ้ๆๅๅงๅๆๅๅ้๏ผๅฆๅ้ขๅชๅๅงๅไบ้ป่ฎคๅผ็ static ๅ้ๅฐไผๅจ่ฟไธช้ถๆฎต่ตๅผ๏ผๆๅๅ้ไนๅฐ่ขซๅๅงๅ๏ผใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:2","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"็ฑป่ฃ
่ฝฝๅจๅ
้จๆบๅถ ๅ็ ๅฝๆไธช็ฑปๅ ่ฝฝๅจ้่ฆๅ ่ฝฝๆไธช.classๆไปถๆถ๏ผๅฎ้ฆๅ
ไผๆ่ฟไธชไปปๅกๅงๆ็ปๅฎ็ไธ็บง็ฑปๅ ่ฝฝๅจ๏ผ้ๅฝ่ฟไธชๆไฝ๏ผๅฆๆไธ็บง็็ฑปๅ ่ฝฝๅจๆฒกๆๅ ่ฝฝ๏ผ่ชๅทฑๆไผๅปๅ ่ฝฝ่ฟไธช็ฑปใ ็ฑปๅ ่ฝฝๆต็จ ๆฝ่ฑก็่งฃ๏ผๅณๆฏไธชๅฟๅญ้ฝไธๆฟๆๅนฒๆดป๏ผๆฏๆฌกๆๆดปๅฐฑไธข็ป็ถไบฒๅปๅนฒ๏ผ็ดๅฐ็ถไบฒ่ฏด่ฟไปถไบๆๅนฒไธไบๆถ๏ผๅฟๅญ่ชๅทฑๆไผๆณๅๆณๅปๅฎๆ๏ผ่ฟๅฐฑๆฏไผ ่ฏดไธญ็ๅไบฒๅงๆดพๆบๅถ ใ ๅไบฒๅงๆดพๆบๅถไฝ็จ ไฟ่ฏๅฎๅ
จๆง ้ฒๆญข้ๅคๅ ่ฝฝๅไธไธช classใ้่ฟๅงๆๅปๅไธ้ข้ฎ๏ผๅ ่ฝฝ่ฟไบๅฐฑไธ็จๅๅ ่ฝฝไธ้ใไฟ่ฏๆฐๆฎๅฎๅ
จใ ็ฑปๅ ่ฝฝๆต็จ ไฟ่ฏๆ ธๅฟ .class ไธ่ฝ่ขซ็ฏกๆนใ้่ฟๅงๆๆนๅผ๏ผๅฐฑไธไผๅป็ฏกๆนๆ ธๅฟ .class๏ผๅณไฝฟ็ฏกๆนไนไธไผๅปๅ ่ฝฝ๏ผๅณไฝฟๅ ่ฝฝไนไธไผๆฏๅไธไธช .class ๅฏน่ฑกใไธๅ็ๅ ่ฝฝๅจๅ ่ฝฝๅไธไธช .class ไนไธๆฏๅไธไธช Class ๅฏน่ฑกใ ่งฃ้๏ผๅฆๆๆฒกๆๅไบฒๅงๆดพๆจกๅ๏ผ่ๆฏ็ฑๅไธช็ฑปๅ ่ฝฝๅจ่ช่กๅ ่ฝฝ๏ผๅฆๆ็จๆท็ผๅไบไธไธช java.lang.Object ็ๅๅ็ฑปๅนถๆพๅจ ClassPath ไธญ๏ผๅคไธช็ฑปๅ ่ฝฝๅจ้ฝๅปๅ ่ฝฝ่ฟไธช็ฑปๅฐๅ
ๅญไธญ๏ผ็ณป็ปไธญๅฐไผๅบ็ฐๅคไธชไธๅ็ Object ็ฑป๏ผ้ฃไน็ฑปไน้ด็ๆฏ่พ็ปๆไปฅๅ็ฑป็ๅฏไธๆงๅฐๆ ๆณไฟ่ฏ๏ผๅ ไธบ Object ้ฝๅ่ชไธ็ธๅ๏ผ้ฃไน็จๅบ่ฟ่กๅฏๅจๅฐฑไผๅบ้๏ผๆไปฅๅไบฒๅงๆดพๆจกๅไนไฟ่ฏไบ JVM ่ฝๅคๆญฃๅธธๅฎๅ
จ่ฟ่กใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:3","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"่ฟ่กๆถๆฐๆฎๅบ JVM่ฟ่กๆถๆฐๆฎๅบ ไป็ป JVM ่ฟ่กๆถไผๅ้
ๅฅฝๆนๆณๅบๅๅ ๏ผ่ JVM ๆฏๆฌก้ๅฐไธไธช็บฟ็จ๏ผๅฐฑไธบๅ
ถๅ้
ไธไธช็จๅบ่ฎกๆฐๅจใJavaๆ ใๆฌๅฐๆนๆณๆ ๏ผๅฝ็บฟ็จ็ปๆญขๆถ๏ผไธ่
๏ผ็จๅบ่ฎกๆฐๅจใJavaๆ ใๆฌๅฐๆนๆณๆ ๏ผๆๅ ็จ็ๅ
ๅญ็ฉบ้ดไนไผ้ๆพๆใ ็จๅบ่ฎกๆฐๅจใJavaๆ ใๆฌๅฐๆนๆณๆ ็็ๅฝๅจๆไธๆๅฑ็บฟ็จ็ธๅ๏ผ่ๆนๆณๅบๅๅ ็็ๅฝๅจๆไธ Java ็จๅบ่ฟ่ก็ๅฝๅจๆ็ธๅ๏ผๆไปฅ GC ๅชๅ็ๅจ็บฟ็จๅ
ฑไบซ็ๅบๅ๏ผๅคง้จๅๅ็ๅจ HEAP ไธ๏ผใ ๅ - ็บฟ็จๅ
ฑไบซ Java ไธญ็ๅ ๆฏ็จๆฅๅญๅจๅฏน่ฑกๅฎไพไปฅๅๆฐ็ป๏ผๅฝ็ถ๏ผๆฐ็ปๅผ็จๆฏๅญๆพๅจ Java ๆ ไธญ็๏ผใๅ ๆฏ่ขซๆๆ็บฟ็จๅ
ฑไบซ็๏ผๅ ๆญคๅจๅ
ถไธ่ฟ่กๅฏน่ฑกๅ
ๅญ็ๅ้
ๅ้่ฆ่ฟ่กๅ ้๏ผ่ฟไนๅฏผ่ดไบ new ๅฏน่ฑก็ๅผ้ๆฏๆฏ่พๅคง็ใ ๅจ JVM ไธญๅชๆไธไธชๅ ใๅ ๆฏ Java ๅๅพๆถ้ๅจ็ฎก็็ไธป่ฆๅบๅ๏ผJava ็ๅๅพๅๆถๆบๅถไผ่ชๅจ่ฟ่กๅค็ใ ๅ ็ฉบ้ดๅไธบ่ๅนดไปฃๅๅนด่ฝปไปฃใๅๅๅๅปบ็ๅฏน่ฑกๅญๆพๅจๅนด่ฝปไปฃ๏ผ่่ๅนดไปฃไธญๅญๆพ็ๅฝๅจๆ้ฟไน
็ๅฎไพๅฏน่ฑกใ ๅนด่ฝปไปฃไธญๅ่ขซๅไธบ Eden ๅบๅไธคไธช Survivor ๅบใๆฐ็ๅฏน่ฑกๅ้
้ฆๅ
ๆฏๆพๅจ Eden ๅบ๏ผSurvivor ๅบไฝไธบ Eden ๅบๅ Old ๅบ็็ผๅฒ๏ผๅจ Survivor ๅบ็ๅฏน่ฑก็ปๅ่ฅๅนฒๆฌก GC ไป็ถๅญๆดป็๏ผๅฐฑไผ่ขซ่ฝฌ็งปๅฐ่ๅนดไปฃใ ๅฝไธไธชๅฏน่ฑกๅคงไบ Eden ๅบ่ๅฐไบ Old ๅบ๏ผ่ๅนดไปฃ๏ผ็ๆถๅๅฐฑไผ็ดๆฅๆๅฐ Old ๅบใ่ๅฝๅฏน่ฑกๅคงไบ Old ๅบๆถใไผ็ดๆฅๆๅบ OutOfMemoryError๏ผOOM๏ผ ๅ
็ฉบ้ด = ๆฐธไน
ไปฃ๏ผๆนๆณๅบ๏ผ - ็บฟ็จๅ
ฑไบซ ๅญๅจๅจ็ฉ็็กฌ็ไธ๏ผ้ๅ ๏ผ ๆๆถๅไน็งฐไธบๆฐธไน
ไปฃ๏ผPermanent Generation๏ผ๏ผๅจๆนๆณๅบไธญ๏ผๅญๅจไบๆฏไธช็ฑป็ไฟกๆฏ ๏ผๅ
ๆฌ๏ผ็ฑป็ๅ็งฐใไฟฎ้ฅฐ็ฌฆใๆนๆณไฟกๆฏใๅญๆฎตไฟกๆฏ๏ผใ็ฑปไธญ้ๆๅ้ใ็ฑปไธญๅฎไนไธบ final ็ฑปๅ็ๅธธ้ใ็ฑปไธญ็ Field ไฟกๆฏใ็ฑปไธญ็ๆนๆณไฟกๆฏไปฅๅ็ผ่ฏๅจ็ผ่ฏๅ็ไปฃ็ ็ญ ๅฝๅผๅไบบๅๅจ็จๅบไธญ้่ฟ Class ๅฏน่ฑกไธญ็ getNameใisInterface ็ญๆนๆณๆฅ่ทๅไฟกๆฏๆถ๏ผ่ฟไบๆฐๆฎ้ฝๆฅๆบไบๆนๆณๅบๅ๏ผๅๆถๆนๆณๅบๅไนๆฏๅ
จๅฑๅ
ฑไบซ็๏ผๅจไธๅฎ็ๆกไปถไธๅฎไนไผ่ขซ GC๏ผๅจ่ฟ้่ฟ่ก็ GC ไธป่ฆๆฏๆนๆณๅบ้็ๅธธ้ๆฑ ๅ็ฑปๅ็ๅธ่ฝฝใๅฝๆนๆณๅบๅ้่ฆไฝฟ็จ็ๅ
ๅญ่ถ
่ฟๅ
ถๅ
่ฎธ็ๅคงๅฐๆถ๏ผไผๆๅบ OutOfMemory๏ผOOM๏ผ ็้่ฏฏไฟกๆฏ ๆนๆณๅบไธญๆไธไธช้ๅธธ้่ฆ็้จๅๅฐฑๆฏ่ฟ่กๆถๅธธ้ๆฑ ๏ผ็จไบๅญๆพ้ๆ็ผ่ฏไบง็็ๅญ้ข้ๅ็ฌฆๅทๅผ็จใ่ฟ่กๆถ็ๆ็ๅธธ้ไนไผๅญๅจ่ฟไธชๅธธ้ๆฑ ไธญ๏ผๆฏๅฆ String ็ intern ๆนๆณใๅฎๆฏๆฏไธไธช็ฑปๆๆฅๅฃ็ๅธธ้ๆฑ ็่ฟ่กๆถ่กจ็ฐๅฝขๅผ๏ผๅจ็ฑปๅๆฅๅฃ่ขซๅ ่ฝฝๅฐ JVM ๅ๏ผๅฏนๅบ็่ฟ่กๆถๅธธ้ๆฑ ๅฐฑ่ขซๅๅปบๅบๆฅใ JVMๅ ๅ
ๅญ็ปๆ ไธบไปไนๅ
็ฉบ้ดๅ่ขซ็งฐไธบ้ๅ ๏ผ ๅ ไธบๅจๅ
ๅญๆจกๅไธญๅฎๅญๅจ็ๆฐๆฎๅๅ ๆไบ่ฎธไธๅ๏ผๆไปฅไน ๆฏๆงๆๅฎไปๅ ไธญๅ็ฌๅบๅๅบๆฅใๆนๆณๅบๅฑไบ้ๅ ๅ
ๅญใๅฎๅญๅจๆฏไธช็ฑป็ปๆ๏ผๅฆ่ฟ่กๆถๅธธ้ๆฑ ใๅญๆฎตๅๆนๆณๆฐๆฎ๏ผไปฅๅๆนๆณๅๆ้ ๆนๆณ็ไปฃ็ ใๅฎๆฏๅจ Java ่ๆๆบๅฏๅจๆถๅๅปบ็ใ Javaๆ - ้็บฟ็จๅ
ฑไบซ Javaๆ ไน็งฐไธบ่ๆๆบๆ ๏ผJava Vitual Machine Stack๏ผ๏ผไนๅฐฑๆฏๆไปฌๅธธๅธธๆ่ฏด็ๆ ใJVM ๆ ๆฏ็บฟ็จ็งๆ็๏ผๆฏไธช็บฟ็จๅๅปบ็ๅๆถ้ฝไผๅๅปบ่ชๅทฑ็ JVM ๆ ๏ผไบไธๅนฒๆฐใ Javaๆ ๆฏ Java ๆนๆณๆง่ก็ๅ
ๅญๆจกๅใ Javaๆ ไธญๅญๆพ็ๆฏไธไธชไธชๆ ๅธง๏ผๆฏไธชๆ ๅธง้ฝๅฏนๅบไธไธช่ขซ่ฐ็จ็ๆนๆณ๏ผๅจๆ ๅธงไธญๅ
ๆฌๅฑ้จๅ้่กจ๏ผLocal Variables๏ผใๆไฝๆฐ๏ผOperand Stark๏ผใๆๅๅฝๅๆนๆณๆๅฑ็็ฑป็่ฟ่กๆถๅธธ้ๆฑ ็ๅผ็จ๏ผReference to runtime constant pool๏ผใๆนๆณ่ฟๅๅฐๅ๏ผRetuen Address๏ผๅไธไบ้ขๅค็้ๅ ไฟกๆฏใ ๅฝ็บฟ็จๆง่กไธไธชๆนๆณๆถ๏ผๅฐฑไผ้ไนๅๅปบไธไธชๅฏนๅบ็ๆ ๅธง๏ผๅนถๅฐๅปบ็ซ็ๆ ๅธงๅๆ ใๅฝๆนๆณๆง่กๅฎๆฏไนๅ๏ผไพฟไผๅฐๆ ๅธงๅบๆ ใๅ ๆญคๅฏ็ฅ๏ผ็บฟ็จๅฝๅๆง่ก็ๆนๆณๆๅฏนๅบ็ๆ ๅธงๅฟ
ๅฎไฝไบ Java ๆ ็้กถ้จใ ๅฑ้จๅ้่กจ๏ผ็จๆฅๅญๅจๆนๆณไธญ็ๅฑ้จๅ้๏ผๅฏนไบๅผ็จ็ฑปๅ็ๅ้๏ผๅๅญ็ๆฏๆๅๅฏน่ฑก็ๅผ็จ๏ผๅฏนไบๅบๆฌๆฐๆฎ็ฑปๅ็ๅ้๏ผๅ็ดๆฅๅญๅจๅฎ็ๅผ ๆไฝๆฐๆ ๏ผๆ ๆๅ
ธๅ็ไธไธชๅบ็จๅฐฑๆฏ็จๆฅๅฏน่กจ่พพๅผๆฑๅผใๅจไธไธช็บฟ็จๆง่กๆนๆณ็่ฟ็จไธญ๏ผๅฎ้
ไธๅฐฑๆฏไธๆญๆง่ก่ฏญๅฅ็่ฟ็จ๏ผ่ๅฝๆ นๅฐๅบๅฐฑๆฏ่ฟ่ก่ฎก็ฎ็่ฟ็จใๅ ๆญคๅฏไปฅ่ฟไน่ฏด๏ผ็จๅบไธญ็ๆๆ่ฎก็ฎ่ฟ็จ้ฝๆฏๅจๅๅฉไบๆไฝๆ ๆฅๅฎๆ็ใ ๆๅ่ฟ่กๆถๅธธ้ๆฑ ็ๅผ็จ๏ผๅ ไธบๅจๆนๆณๆง่ก็่ฟ็จไธญๆๅฏ่ฝ้่ฆ็จๅฐ็ฑปไธญ็ๅธธ้๏ผๆไปฅๅฟ
้กป่ฆๆไธไธชๅผ็จๆๅ่ฟ่กๆถๅธธ้ใ ๆนๆณ่ฟๅๅฐๅ๏ผๅฝไธไธชๆนๆณๆง่กๅฎๆฏไนๅ๏ผ่ฆ่ฟๅไนๅ่ฐ็จๅฎ็ๅฐๆน๏ผๅ ๆญคๅจๆ ๅธงไธญๅฟ
้กปไฟๅญไธไธชๆนๆณ่ฟๅๅฐๅใ ็จๅบ่ฎกๆฐๅจ - ้็บฟ็จๅ
ฑไบซ ็จๅบ่ฎกๆฐๅจ๏ผProgram Counter Register๏ผ๏ผไนๆ็งฐไฝไธบ PC ๅฏๅญๅจ โ ็ฑไบๅจJVMไธญ๏ผๅค็บฟ็จๆฏ้่ฟ็บฟ็จ่ฝฎๆตๅๆขๆฅ่ทๅพ CPU ๆง่กๆถ้ด็๏ผๅ ๆญค๏ผๅจไปปไธๅ
ทไฝๆถๅป๏ผไธไธชCPU็ๅ
ๆ ธๅชไผๆง่กไธๆก็บฟ็จไธญ็ๆไปค๏ผๅ ๆญค๏ผไธบไบ่ฝๅคไฝฟๅพๆฏไธช็บฟ็จ้ฝๅจ็บฟ็จๅๆขๅ่ฝๅคๆขๅคๅจๅๆขไนๅ็็จๅบๆง่กไฝ็ฝฎ๏ผๆฏไธช็บฟ็จ้ฝ้่ฆๆ่ชๅทฑ็ฌ็ซ็็จๅบ่ฎกๆฐๅจ๏ผๅนถไธไธ่ฝไบ็ธ่ขซๅนฒๆฐ๏ผๅฆๅๅฐฑไผๅฝฑๅๅฐ็จๅบ็ๆญฃๅธธๆง่กๆฌกๅบใๅ ๆญค๏ผๅฏไปฅ่ฟไน่ฏด๏ผ็จๅบ่ฎกๆฐๅจๆฏๆฏไธช็บฟ็จๆ็งๆ็ใ ๅจ JVM ่ง่ไธญ่งๅฎ๏ผๅฆๆ็บฟ็จๆง่ก็ๆฏ้ native๏ผๆฌๅฐ๏ผๆนๆณ๏ผๅ็จๅบ่ฎกๆฐๅจไธญไฟๅญ็ๆฏๅฝๅ้่ฆๆง่ก็ๆไปค็ๅฐๅ๏ผๅฆๆ็บฟ็จๆง่ก็ๆฏ native ๆนๆณ๏ผๅ็จๅบ่ฎกๆฐๅจไธญ็ๅผๆฏ undefinedใ ็ฑไบ็จๅบ่ฎกๆฐๅจไธญๅญๅจ็ๆฐๆฎๆๅ ็ฉบ้ด็ๅคงๅฐไธไผ้็จๅบ็ๆง่ก่ๅ็ๆนๅ๏ผๅ ๆญค๏ผๅฏนไบ็จๅบ่ฎกๆฐๅจๆฏไธไผๅ็ๅ
ๅญๆบขๅบ็ฐ่ฑก๏ผOutOfMemory๏ผ็ใ ๆฌๅฐๆนๆณๆ - ้็บฟ็จๅ
ฑไบซ JVM ้็จๆฌๅฐๆนๆณๅ ๆ ๆฅๆฏๆ native ๆนๆณ็ๆง่ก๏ผๆญคๅบๅ็จไบๅญๅจๆฏไธช native ๆนๆณ่ฐ็จ็็ถๆใ ๆฌๅฐๆนๆณๆ ไธ Java ๆ ็ไฝ็จๅๅ็้ๅธธ็ธไผผใๅบๅซๅชไธ่ฟๆฏ Javaๆ ๆฏไธบๆง่ก Java ๆนๆณๆๅก็๏ผ่ๆฌๅฐๆนๆณๆ ๅๆฏไธบๆง่กๆฌๅฐๆนๆณ๏ผNative Method๏ผๆๅก็ใ JVM ่ง่ไธญ๏ผๅนถๆฒกๆๅฏนๆฌๅฐๆนๆณๆ ็ๅ
ทไฝๅฎ็ฐๆนๆณไปฅๅๆฐๆฎ็ปๆไฝๅผบๅถ่งๅฎ๏ผ่ๆๆบๅฏไปฅ่ช็ฑๅฎ็ฐๅฎใๅจ HotSopt ่ๆๆบไธญ็ดๆฅๅฐฑๆๆฌๅฐๆนๆณๆ ๅ Javaๆ ๅไบไธบไธ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:4","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"ๅๅปบๅฏน่ฑกๅ
ๅญๅๆ ๅๅปบไธไธชDog็ฑป๏ผๅฎไพๅไธคไธชๅฏน่ฑก๏ผๅๅซๆฏ\"AHuang\"ๅ\"AHui\"ใ public class Dog{ String name; int age; public void run(){ System.out.println(\"running\"); } } public class Test{ public static void main(String[] args){ Dog Ahuang = new Dog(); Ahuang.name = \"Ahuang\"; Ahuang.age = 1; Ahuang.shout; Dog AHui = new Dog(); AHui.name = \"AHui\"; AHui.age = 5; AHui.shout; } } ๅๅปบๅฏน่ฑกๅ
ๅญๅๆ ้ฆๅ
ไผๅจๆนๆณๅบๅ ่ฝฝ Class ๆจก็๏ผๆฏไธชๆจก็้ฝๆ่ฏฅ็ฑป็ๅฑๆงไปฅๅๆนๆณๅๅธธ้ๆฑ ๏ผไปฅๅ้ๆๅ้้็็ฑปๅ ่ฝฝ่ๅ ่ฝฝๅฐ้ๆๆนๆณๅบ๏ผๅนถๅจ Java ๅ ไธญ็ๆไธไธชไปฃ่กจ่ฏฅ็ฑป็ Class ๅฏน่ฑก็ๅ
ๅญๅบๅ๏ผไธบ็ฑปๅ้ๅ้
ๅ
ๅญๅนถ่ฎพ็ฝฎ็ฑปๅ้ๅๅงๅผ๏ผไพๅฆ String ็ฑปๅไธบ null๏ผ่ๅๅจๆ ไธญๅญๅจ่ฏฅๅฏน่ฑก็ๅผ็จๅฐๅ๏ผๅฐๅๆๅๅ ไธญ็ฑป็ๅ
ๅญๅฐๅ๏ผๆๅๅๅงๅ๏ผไพๅฆๆ้ ๆนๆณ๏ผๅคๅถ็ปๅ ไธญ็ๅฏน่ฑกๅ
ๅญๆฐๆฎไธญใๆฏไธไธช็บฟ็จ้ฝไผ็ปๅฎๅ้
ๆๅฎ็ Java ๆ ๏ผ็จๅบ่ฎกๆฐๅจใๆฌๅฐๆนๆณๆ ๏ผๆไปฅ่ฏด่ฟไธไธชๆฏ็บฟ็จ็ฌไบซ็๏ผๆฏ็บฟ็จๅฎๅ
จ็๏ผ่ๅ ๅๆนๆณๅบๅคงๅฎถไธ่ตทไฝฟ็จ๏ผๅ ่็บฟ็จไธๅฎๅ
จใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:3:5","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Java"],"content":"ๆป็ป ไธ่ฅฟๆฏไบ่ฟไนไน
๏ผไนๅ่ไบไธไบ่ตๆ๏ผไนๆ่ชๅทฑๅจๅญฆไน ไธ็ไธไบๆป็ป๏ผ่ฟ้้ขไนๅไบไธไธชๅฝฉ่๏ผๅ
ณไบJVM GCๆไฝ็ๆง่กๆต็จๅๆฏๆๆ ท็ๅข๏ผๅธๆไปฅไธๅฏนไฝ ๆๆๅธฎๅฉ๏ผ่ฐข่ฐขใ ","date":"2024-07-22","objectID":"/blog/20240722_jvm/:4:0","tags":["java","jvm","่ๆๆบ","jvmๅ็"],"title":"JVM ๅ็ๆ่ง","uri":"/blog/20240722_jvm/"},{"categories":["Technology"],"content":"Linux systemctl systemd","date":"2024-06-26","objectID":"/blog/20240626_systemd/","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"็ฑๆฅ ๆ นๆฎๆไบ่งฃๅฐ๏ผๅๅฒไธ,Linux็ๅฏๅจไธ็ด้็จinit่ฟ็จใ ไธ้ข็ๅฝไปค็จๆฅๅฏๅจๆๅกใ $ sudo /etc/init.d/apache2 start # ๆ่
$ service apache2 start ่ฟ็งๆนๆณๆไธคไธช็ผบ็น ๅฏๅจๆถ้ด้ฟใinit่ฟ็จๆฏไธฒ่กๅฏๅจ๏ผๅชๆๅไธไธช่ฟ็จๅฏๅจๅฎๆ๏ผๆไผๅฏๅจไธไธไธช่ฟ็จใ ๅฏๅจ่ๆฌๅคๆใinit่ฟ็จๅชๆฏๆง่กๅฏๅจ่ๆฌ๏ผไธ็ฎกๅ
ถไปไบๆ
ใ่ๆฌ้่ฆ่ชๅทฑๅค็ๅ็งๆ
ๅต๏ผ่ฟๅพๅพไฝฟๅพ่ๆฌๅๅพๅพ้ฟใ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:1:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Systemd ๆฆ่ฟฐ Systemd ๅฐฑๆฏไธบไบ่งฃๅณ่งฃๅณ่ฟไบ้ฎ้ข่่ฏ็็ใๅฎ็่ฎพ่ฎก็ฎๆ ๆฏ๏ผไธบ็ณป็ป็ๅฏๅจๅ็ฎก็ๆไพไธๅฅๅฎๆด็่งฃๅณๆนๆกใ ๆ นๆฎ Linux ๆฏไพ๏ผๅญๆฏdๆฏๅฎๆค่ฟ็จ๏ผdaemon๏ผ็็ผฉๅใSystemd ่ฟไธชๅๅญ็ๅซไน๏ผๅฐฑๆฏ่ฆๅฎๆคๆดไธช Linux ็ณป็ปใ Systemdไฝ่
๏ผไธๅพไธบ Systemd ไฝ่
Lennart Poettering๏ผ ไฝฟ็จไบ Systemd๏ผๅฐฑไธ้่ฆๅไฝฟ็จinitไบใSystemd ๅไปฃไบinit๏ผๆไธบ็ณป็ป็็ฌฌไธไธช่ฟ็จ๏ผPID = 1๏ผ๏ผๅ
ถไป่ฟ็จ้ฝๆฏๅฎ็ๅญ่ฟ็จใ $ systemctl --version ไธ้ขๅฝไปค็จไบๆฅ็ๆฌๆบๅจ Systemd ็็ๆฌใ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:2:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"็ณป็ป็ฎก็ Systemd ๅนถไธๆฏไธไธชๅฝไปค๏ผ่ๆฏไธ็ปๅฝไปค๏ผๆถๅๅฐ็ณป็ป็ฎก็็ๆนๆน้ข้ขใ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"systemctl systemctlๆฏ Systemd ็ไธปๅฝไปค๏ผ็จไบ็ฎก็็ณป็ปใ # ้ๅฏ็ณป็ป $ sudo systemctl reboot # ๅ
ณ้ญ็ณป็ป๏ผๅๆญ็ตๆบ $ sudo systemctl poweroff # CPUๅๆญขๅทฅไฝ $ sudo systemctl halt # ๆๅ็ณป็ป $ sudo systemctl suspend # ่ฎฉ็ณป็ป่ฟๅ
ฅๅฌ็ ็ถๆ $ sudo systemctl hibernate # ่ฎฉ็ณป็ป่ฟๅ
ฅไบคไบๅผไผ็ ็ถๆ $ sudo systemctl hybrid-sleep # ๅฏๅจ่ฟๅ
ฅๆๆด็ถๆ๏ผๅ็จๆท็ถๆ๏ผ $ sudo systemctl rescue ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:1","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"systemd-analyze systemd-analyzeๅฝไปค็จไบๆฅ็ๅฏๅจ่ๆถ # ๆฅ็ๅฏๅจ่ๆถ $ systemd-analyze # ๆฅ็ๆฏไธชๆๅก็ๅฏๅจ่ๆถ $ systemd-analyze blame # ๆพ็คบ็ๅธ็ถ็ๅฏๅจ่ฟ็จๆต $ systemd-analyze critical-chain # ๆพ็คบๆๅฎๆๅก็ๅฏๅจๆต $ systemd-analyze critical-chain atd.service ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:2","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"hostnamectl homenamectlๅฝไปค็จไบๆฅ็ๅฝๅไธปๆบ็ไฟกๆฏ # ๆพ็คบๅฝๅไธปๆบ็ไฟกๆฏ $ hostnamectl # ่ฎพ็ฝฎไธปๆบๅใ $ sudo hostnamectl set-hostname rhel7 ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:3","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"timedatectl timedatectlๅฝไปค็จไบๆฅ็ๅฝๅๆถๅบ่ฎพ็ฝฎ # ๆฅ็ๅฝๅๆถๅบ่ฎพ็ฝฎ $ timedatectl # ๆพ็คบๆๆๅฏ็จ็ๆถๅบ $ timedatectl list-timezones # ่ฎพ็ฝฎๅฝๅๆถๅบ $ sudo timedatectl set-timezone America/New_York $ sudo timedatectl set-time YYYY-MM-DD $ sudo timedatectl set-time HH:MM:SS ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:4","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"loginctl loginctlๅฝไปค็จไบๆฅ็ๅฝๅ็็ป้็จๆท # ๅๅบๅฝๅsession $ loginctl list-sessions # ๅๅบๅฝๅ็ปๅฝ็จๆท $ loginctl list-users # ๅๅบๆพ็คบๆๅฎ็จๆท็ไฟกๆฏ $ loginctl show-user ruanyf ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:3:5","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Unit ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:4:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"ๅซไน Systemd ๅฏไปฅ็ฎก็ๆๆ็ณป็ป่ตๆบใไธๅ็่ตๆบ็ป็งฐไธบUnit๏ผๅไฝ๏ผ Unit็ง็ฑป Service unit๏ผ็ณป็ปๆๅก Target unit๏ผๅคไธช Unit ๆๆ็ไธไธช็ป Device Unit๏ผ็กฌไปถ่ฎพๅค Mount Unit๏ผๆไปถ็ณป็ป็ๆ่ฝฝ็น Automount Unit๏ผ่ชๅจๆ่ฝฝ็น Path Unit๏ผๆไปถๆ่ทฏๅพ Scope Unit๏ผไธๆฏ็ฑ Systemd ๅฏๅจ็ๅค้จ่ฟ็จ Slice Unit๏ผ่ฟ็จ็ป Snapshot Unit๏ผSystemd ๅฟซ็
ง๏ผๅฏไปฅๅๅๆไธชๅฟซ็
ง Socket Unit๏ผ่ฟ็จ้ด้ไฟก็ socket Swap Unit๏ผswap ๆไปถ Timer Unit๏ผๅฎๆถๅจ systemctl list-unitsๅฝไปคๅฏไปฅๆฅ็ๅฝๅ็ณป็ป็ๆๆ Unit # ๅๅบๆญฃๅจ่ฟ่ก็ Unit $ systemctl list-units # ๅๅบๆๆUnit๏ผๅ
ๆฌๆฒกๆๆพๅฐ้
็ฝฎๆไปถ็ๆ่
ๅฏๅจๅคฑ่ดฅ็ $ systemctl list-units --all # ๅๅบๆๆๆฒกๆ่ฟ่ก็ Unit $ systemctl list-units --all --state=inactive # ๅๅบๆๆๅ ่ฝฝๅคฑ่ดฅ็ Unit $ systemctl list-units --failed # ๅๅบๆๆๆญฃๅจ่ฟ่ก็ใ็ฑปๅไธบ service ็ Unit $ systemctl list-units --type=service ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:4:1","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Unit ็ถๆ systemctl statusๅฝไปค็จไบๆฅ็็ณป็ป็ถๆๅๅไธช Unit ็็ถๆ # ๆพ็คบ็ณป็ป็ถๆ $ systemctl status # ๆพ็คบๅไธช Unit ็็ถๆ $ sysystemctl status bluetooth.service # ๆพ็คบ่ฟ็จไธปๆบ็ๆไธช Unit ็็ถๆ $ systemctl -H root@rhel7.example.com status httpd.service ้คไบstatusๅฝไปค๏ผsystemctl่ฟๆไพไบไธไธชๆฅ่ฏข็ถๆ็็ฎๅๆนๆณ๏ผไธป่ฆไพ่ๆฌๅ
้จ็ๅคๆญ่ฏญๅฅไฝฟ็จ # ๆพ็คบๆไธช Unit ๆฏๅฆๆญฃๅจ่ฟ่ก $ systemctl is-active application.service # ๆพ็คบๆไธช Unit ๆฏๅฆๅคไบๅฏๅจๅคฑ่ดฅ็ถๆ $ systemctl is-failed application.service # ๆพ็คบๆไธช Unit ๆๅกๆฏๅฆๅปบ็ซไบๅฏๅจ้พๆฅ $ systemctl is-enabled application.service ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:4:2","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Unit ็ฎก็ ๅฏนไบ็จๆทๆฅ่ฏด๏ผๆๅธธ็จ็ๆฏไธ้ข่ฟไบๅฝไปค๏ผ็จไบๅฏๅจๅๅๆญข Unit๏ผไธป่ฆๆฏ service๏ผ # ็ซๅณๅฏๅจไธไธชๆๅก $ sudo systemctl start apache.service # ็ซๅณๅๆญขไธไธชๆๅก $ sudo systemctl stop apache.service # ้ๅฏไธไธชๆๅก $ sudo systemctl restart apache.service # ๆๆญปไธไธชๆๅก็ๆๆๅญ่ฟ็จ $ sudo systemctl kill apache.service # ้ๆฐๅ ่ฝฝไธไธชๆๅก็้
็ฝฎๆไปถ $ sudo systemctl reload apache.service # ้่ฝฝๆๆไฟฎๆน่ฟ็้
็ฝฎๆไปถ $ sudo systemctl daemon-reload # ๆพ็คบๆไธช Unit ็ๆๆๅบๅฑๅๆฐ $ systemctl show httpd.service # ๆพ็คบๆไธช Unit ็ๆๅฎๅฑๆง็ๅผ $ systemctl show -p CPUShares httpd.service # ่ฎพ็ฝฎๆไธช Unit ็ๆๅฎๅฑๆง $ sudo systemctl set-property httpd.service CPUShares=500 ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:4:3","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"ไพ่ตๅ
ณ็ณป Unit ไน้ดๅญๅจไพ่ตๅ
ณ็ณป๏ผA ไพ่ตไบ B๏ผๅฐฑๆๅณ็ Systemd ๅจๅฏๅจ A ็ๆถๅ๏ผๅๆถไผๅปๅฏๅจ B systemctl list-dependenciesๅฝไปคๅๅบไธไธช Unit ็ๆๆไพ่ตใ $ systemctl list-dependencies nginx.service ไธ้ขๅฝไปค็่พๅบ็ปๆไนไธญ๏ผๆไบไพ่ตๆฏ Target ็ฑปๅ๏ผ่ฏฆ่งไธๆ๏ผ๏ผ้ป่ฎคไธไผๅฑๅผๆพ็คบใๅฆๆ่ฆๅฑๅผ Target๏ผๅฐฑ้่ฆไฝฟ็จ--allๅๆฐใ systemctl list-dependencies --all nginx.service ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:4:4","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Unit ็้
็ฝฎๆไปถ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:5:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"ๆฆ่ฟฐ ๆฏไธไธช Unit ้ฝๆไธไธช้
็ฝฎๆไปถ๏ผๅ่ฏ Systemd ๆไนๅฏๅจ่ฟไธช Unitใ Systemd ้ป่ฎคไป็ฎๅฝ/etc/systemd/system/่ฏปๅ้
็ฝฎๆไปถใไฝๆฏ๏ผ้้ขๅญๆพ็ๅคง้จๅๆไปถ้ฝๆฏ็ฌฆๅท้พๆฅ๏ผๆๅ็ฎๅฝ/usr/lib/systemd/system/๏ผ็ๆญฃ็้
็ฝฎๆไปถๅญๆพ้ฃไธช็ฎๅฝใ systemd enbaleๅฝไปค็จไบๅจไธ้ขไธคไธช็ฎๅฝไน้ด๏ผๅปบ็ซ็ฌฆๅท้พๆฅๅ
ณ็ณปใ $ sudo systemctl enable custom.service # ็ญๅไบ $ sudo ln -s '/usr/lib/systemd/system/custom.service' '/etc/systemd/system/multi-user.target.wants/custom.service' ๅฆๆ้
็ฝฎๆไปถ้้ข่ฎพ็ฝฎไบๅผๆบๅฏๅจ๏ผsystemd enableๅฝไปค็ธๅฝไบๆฟๆดปๅผๆบๅฏๅจใ ไธไนๅฏนๅบ็๏ผsystemd disableๅฝไปค็จไบๅจไธคไธช็ฎๅฝไน้ด๏ผๆค้็ฌฆๅท้พๆฅๅ
ณ็ณป๏ผ็ธๅฝไบๆค้ๅผๆบๅฏๅจใ $ sudo systemctl disable custom.service ้
็ฝฎๆไปถ็ๅ็ผๅ๏ผๅฐฑๆฏ่ฏฅ Unit ็็ง็ฑป๏ผๆฏๅฆsshdใsockedใๅฆๆ็็ฅ๏ผSystemd ้ป่ฎคๅ็ผๅไธบ.service๏ผๆไปฅsshdไผ่ขซ็่งฃๆsshd.serviceใ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:5:1","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"้
็ฝฎๆไปถ็็ถๆ systemctl list-unit-filesๅฝไปค็จไบๅๅบๆๆ้
็ฝฎๆไปถใ # ๅๅบๆๆ้
็ฝฎๆไปถ $ systemctl list-unit-files # ๅๅบๆๅฎ็ฑปๅ็้
็ฝฎๆไปถ $ systemctl list-unit-files --type=service ่ฟไธชๅฝไปคไผ่พๅบไธไธชๅ่กจใ $ systemctl list-unit-files UNIT FILE STATE chronyd.service enabled clamd@.service static clamd@scan.service disabled ่ฟไธชๅ่กจๆพ็คบๆฏไธช้
็ฝฎๆไปถ็็ถๆ๏ผไธๅ
ฑๆๅ็งใ ้
็ฝฎๆไปถ็ถๆ enabled๏ผๅทฒๅปบ็ซๅฏๅจ้พๆฅ disabled๏ผๆฒกๅปบ็ซๅฏๅจ้พๆฅ static๏ผ่ฏฅ้
็ฝฎๆไปถๆฒกๆ[Install]้จๅ๏ผๆ ๆณๆง่ก๏ผ๏ผๅช่ฝไฝไธบๅ
ถไป้
็ฝฎๆไปถ็ไพ่ต masked๏ผ่ฏฅ้
็ฝฎๆไปถ่ขซ็ฆๆญขๅปบ็ซๅฏๅจ้พๆฅ ๆณจๆ๏ผไป้
็ฝฎๆไปถ็็ถๆๆ ๆณ็ๅบ๏ผ่ฏฅ Unit ๆฏๅฆๆญฃๅจ่ฟ่กใ่ฟๅฟ
้กปๆง่กๅ้ขๆๅฐ็systemctl statusๅฝไปคใ $ systemctl status bluetooth.service ไธๆฆไฟฎๆน้
็ฝฎๆไปถ๏ผๅฐฑ่ฆ่ฎฉ Systemd ้ๆฐๅ ่ฝฝ้
็ฝฎๆไปถ๏ผ็ถๅ้ๆฐๅฏๅจ๏ผๅฆๅไฟฎๆนไธไผ็ๆใ $ sudo systemctl daemon-reload $ sudo systemctl restart httpd.service ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:5:2","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"้
็ฝฎๆไปถ็ๆ ผๅผ ้
็ฝฎๆไปถๅฐฑๆฏๆฎ้็ๆๆฌๆไปถ๏ผๅฏไปฅ็จๆๆฌ็ผ่พๅจๆๅผใ systemctl catๅฝไปคๅฏไปฅๆฅ็้
็ฝฎๆไปถ็ๅ
ๅฎนใ $ systemctl cat atd.service [Unit] Description=ATD daemon [Service] Type=forking ExecStart=/usr/bin/atd [Install] WantedBy=multi-user.target ไปไธ้ข็่พๅบๅฏไปฅ็ๅฐ๏ผ้
็ฝฎๆไปถๅๆๅ ไธชๅบๅใๆฏไธชๅบๅ็็ฌฌไธ่ก๏ผไฝฟ็จๆนๆฌๅท่กจ็คบ็ๅบๅซๅ๏ผๆฏๅฆ[Unit]ใ ๆณจๆ๏ผ้
็ฝฎๆไปถ็ๅบๅๅๅๅญๆฎตๅ๏ผ้ฝๆฏๅคงๅฐๅๆๆใ ๆฏไธชๅบๅๅ
้จๆฏไธไบ็ญๅท่ฟๆฅ็้ฎๅผๅฏนใ [Section] Directive1=value Directive2=value . . . ๆณจๆ๏ผ้ฎๅผๅฏน็็ญๅทไธคไพงไธ่ฝๆ็ฉบๆ ผ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:5:3","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"Target ๅฏๅจ่ฎก็ฎๆบ็ๆถๅ๏ผ้่ฆๅฏๅจๅคง้็ Unitใๅฆๆๆฏไธๆฌกๅฏๅจ๏ผ้ฝ่ฆไธไธๅๅๆฌๆฌกๅฏๅจ้่ฆๅชไบ Unit๏ผๆพ็ถ้ๅธธไธๆนไพฟใSystemd ็่งฃๅณๆนๆกๅฐฑๆฏ Targetใ ็ฎๅ่ฏด๏ผTarget ๅฐฑๆฏไธไธช Unit ็ป๏ผๅ
ๅซ่ฎธๅค็ธๅ
ณ็ Unitใๅฏๅจๆไธช Target ็ๆถๅ๏ผSystemd ๅฐฑไผๅฏๅจ้้ขๆๆ็ Unitใไป่ฟไธชๆไนไธ่ฏด๏ผTarget ่ฟไธชๆฆๅฟต๏ผ่ท Target ็ไฝ็จๅพ็ฑปไผผใไธๅ็ๆฏ๏ผRunLevel ๆฏไบๆฅ็๏ผไธ่ฝๆๅคไธช RunLevel ๅๆถๅฏๅจ๏ผไฝๆฏๅคไธช Target ๅฏไปฅๅๆถๅฏๅจใ # ๆฅ็ๅฝๅ็ณป็ป็ๆๆ Target $ systemctl list-unit-files --type=target # ๆฅ็ไธไธช Target ๅ
ๅซ็ๆๆ Unit $ systemctl list-dependencies multi-user.target # ๆฅ็ๅฏๅจๆถ็้ป่ฎค Target $ systemctl get-default # ่ฎพ็ฝฎๅฏๅจๆถ็้ป่ฎค Target $ sudo systemctl set-default multi-user.target # ๅๆข Target ๆถ๏ผ้ป่ฎคไธๅ
ณ้ญๅไธไธช Target ๅฏๅจ็่ฟ็จ๏ผ # systemctl isolate ๅฝไปคๆนๅ่ฟ็ง่กไธบ๏ผ # ๅ
ณ้ญๅไธไธช Target ้้ขๆๆไธๅฑไบๅไธไธช Target ็่ฟ็จ $ sudo systemctl isolate multi-user.target Target ไธไผ ็ป RunLevel ็ๅฏนๅบๅ
ณ็ณปๅฆไธใ Traditional runlevel New target name Symbolically linked to... Runlevel 0 | runlevel0.target -\u003e poweroff.target Runlevel 1 | runlevel1.target -\u003e rescue.target Runlevel 2 | runlevel2.target -\u003e multi-user.target Runlevel 3 | runlevel3.target -\u003e multi-user.target Runlevel 4 | runlevel4.target -\u003e multi-user.target Runlevel 5 | runlevel5.target -\u003e graphical.target Runlevel 6 | runlevel6.target -\u003e reboot.target ๅฎไธinit่ฟ็จ็ไธป่ฆๅทฎๅซๅฆไธ๏ผ ๅทฎๅซ ้ป่ฎค็ RunLevel๏ผๅจ/etc/inittabๆไปถ่ฎพ็ฝฎ๏ผ็ฐๅจ่ขซ้ป่ฎค็ Target ๅไปฃ๏ผไฝ็ฝฎๆฏ/etc/systemd/system/default.target๏ผ้ๅธธ็ฌฆๅท้พๆฅๅฐgraphical.target๏ผๅพๅฝข็้ข๏ผๆ่
multi-user.target๏ผๅค็จๆทๅฝไปค่ก๏ผใ ๅฏๅจ่ๆฌ็ไฝ็ฝฎ๏ผไปฅๅๆฏ/etc/init.d็ฎๅฝ๏ผ็ฌฆๅท้พๆฅๅฐไธๅ็ RunLevel ็ฎๅฝ ๏ผๆฏๅฆ/etc/rc3.dใ/etc/rc5.d็ญ๏ผ๏ผ็ฐๅจๅๅญๆพๅจ/lib/systemd/systemๅ/etc/systemd/system็ฎๅฝใ ้
็ฝฎๆไปถ็ไฝ็ฝฎ๏ผไปฅๅinit่ฟ็จ็้
็ฝฎๆไปถๆฏ/etc/inittab๏ผๅ็งๆๅก็้
็ฝฎๆไปถๅญๆพๅจ/etc/sysconfig็ฎๅฝใ็ฐๅจ็้
็ฝฎๆไปถไธป่ฆๅญๆพๅจ/lib/systemd็ฎๅฝ๏ผๅจ/etc/systemd็ฎๅฝ้้ข็ไฟฎๆนๅฏไปฅ่ฆ็ๅๅง่ฎพ็ฝฎใ ","date":"2024-06-26","objectID":"/blog/20240626_systemd/:6:0","tags":["Linux","systemctl","system"],"title":"Systemd ๅญฆไน ","uri":"/blog/20240626_systemd/"},{"categories":["Technology"],"content":"MySQL Index","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผไป็ป ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:0","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ไปไนๆฏMySQL็็ดขๅผ MySQLๅฎๆนๅฏนไบ็ดขๅผ็ๅฎไน๏ผ็ดขๅผๆฏๅธฎๅฉMySQL้ซๆ่ทๅๆฐๆฎ็ๆฐๆฎ็ปๆใ MySQLๅจๅญๅจๆฐๆฎไนๅค๏ผๆฐๆฎๅบ็ณป็ปไธญ่ฟ็ปดๆค็ๆปก่ถณ็นๅฎๆฅๆพ็ฎๆณ็ๆฐๆฎ็ปๆ๏ผ่ฟไบๆฐๆฎ็ปๆไปฅๆ็งๅผ็จ(ๆๅ)่กจไธญ็ๆฐๆฎ๏ผ่ฟๆ ทๆไปฌๅฐฑๅฏไปฅ้่ฟๆฐๆฎ็ปๆไธๅฎ็ฐ็้ซ็บงๆฅๆพ็ฎๆณๆฅๅฟซ้ๆพๅฐๆไปฌๆณ่ฆ็ๆฐๆฎใ่่ฟ็งๆฐๆฎ็ปๆๅฐฑๆฏ็ดขๅผใ ็ฎๅ็่งฃไธบโๆๅฅฝๅบ็ๅฏไปฅๅฟซ้ๆฅๆพๆฐๆฎ็ๆฐๆฎ็ปๆโใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:1","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผๆฐๆฎ็ปๆ ไธๅพๅฑ็คบ็ๅฐฑๆฏไธ็งๅฏ่ฝ็ไบๅๆ ็็ดขๅผๆนๅผ๏ผ ไบๅๆ ็ดขๅผๆนๅผ ไบๅๆ ๆฐๆฎ็ปๆ็ๅผ็ซฏ๏ผๅฝๆ็ซฏๆ
ๅตไธ๏ผๆฐๆฎ้ๅขๆๅ
ฅๆถ๏ผไผไธ็ดๅๅณๆๅ
ฅ๏ผๅฝขๆ้พ่กจ๏ผๆฅ่ฏขๆ็ไผ้ไฝใ MySQLไธญๅธธ็จ็็ดขๅผๆฐๆฎ็ปๆๆBTree็ดขๅผ๏ผMyisam ๆฎ้็ดขๅผ๏ผ๏ผB+Tree็ดขๅผ๏ผInnodb ๆฎ้็ดขๅผ๏ผ,Hash็ดขๅผ๏ผMemory ๅญๅจๅผๆ๏ผ็ญ็ญใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:2","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผไผๅฟ ๆ้ซๆฐๆฎๆฃ็ดข็ๆ็๏ผ้ไฝๆฐๆฎๅบ็IOๆๆฌ ้่ฟ็ดขๅผๅฏนๆฐๆฎ่ฟ่กๆๅบ๏ผ้ไฝๆฐๆฎๆๅบ็ๆๆฌ๏ผ้ไฝไบCPU็ๆถ่ใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:3","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผไผๅฟ ็ดขๅผๅฎ้
ไธไนๆฏไธๅผ ่กจ๏ผไฟๅญไบไธป้ฎๅ็ดขๅผ็ๅญๆฎต๏ผๅนถไธๆๅๅฎไฝ่กจ็่ฎฐๅฝ๏ผ็ดขๅผ็ดขๅผไนๆฏ้่ฆๅ ็จ็ฉบ้ด็ใๅจ็ดขๅผๅคงๅคงๆ้ซๆฅ่ฏข้ๅบฆ็ๅๆถ๏ผๅดไผ้ไฝ่กจ็ๆดๆฐ้ๅบฆ๏ผๅจๅฏน่กจ่ฟ่กๆฐๆฎๅขๅ ๆน็ๅๆถ๏ผMySQLไธไป
่ฆๆดๆฐๆฐๆฎ๏ผ่ฟ้่ฆไฟๅญไธไธ็ดขๅผๆไปถใๆฏๆฌกๆดๆฐๆทปๅ ไบ็็ดขๅผๅ็ๅญๆฎต๏ผ้ฝไผๅป่ฐๆดๅ ไธบๆดๆฐๅธฆๆฅ็ๅๅผๅๅๅ็็ดขๅผ็ไฟกๆฏใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:4","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผไฝฟ็จๅบๆฏ ไธๅๆ
ๅต้่ฆๅๅปบ็ดขๅผ ไธป้ฎ่ชๅจๅปบ็ซๅฏไธ็ดขๅผ ้ข็นไฝไธบๆฅ่ฏขๆกไปถ็ๅญๆฎตๅบ่ฏฅๅๅปบ็ดขๅผ๏ผwhere ๅ้ข็่ฏญๅฅ๏ผ ๆฅ่ฏขไธญไธๅ
ถๅฎ่กจๅ
ณ่็ๅญๆฎต๏ผๅค้ฎๅ
ณ็ณปๅปบ็ซ็ดขๅผ ๅคๅญๆฎตๆฅ่ฏขไธๅพๅๅๅปบ็ปๅ็ดขๅผ ๆฅ่ฏขไธญๆๅบ็ๅญๆฎต๏ผๆๅบๅญๆฎต่ฅ้่ฟ็ดขๅผๅป่ฎฟ้ฎๅฐๅคงๅคงๆ้ซๆๅบ้ๅบฆ ๆฅ่ฏขไธญ็ป่ฎกๆ่
ๅ็ปๅญๆฎต ไธๅๆ
ๅตไธๆจ่ๅปบ็ซ็ดขๅผ ่กจ่ฎฐๅฝๅคชๅฐ ็ปๅธธๅขๅ ๆน็่กจ Where ๆกไปถ้็จไธๅฐ็ๅญๆฎตไธๅปบ็ซ็ดขๅผ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:5","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผๅ็ฑป ไธป้ฎ็ดขๅผ ่กจไธญ็ๅ่ฎพๅฎไธบไธป้ฎๅ๏ผๆฐๆฎๅบไผ่ชๅจๅปบ็ซไธป้ฎ็ดขๅผ ๅ็ฌๅๅปบ้ฎๅๅ ้คไธป้ฎ็ดขๅผ่ฏญๆณ๏ผ ๅๅปบไธป้ฎ็ดขๅผ่ฏญๆณ alter table ่กจๅ add primary key (ๅญๆฎต); ๅ ้คไธป้ฎ็ดขๅผ่ฏญๆณ alter table ่กจๅ drop primary key; ๅฏไธ็ดขๅผ ่กจไธญ็ๅๅๅปบไบๅฏไธ็บฆๆๆถ๏ผๆฐๆฎๅบไผ่ชๅจๅปบ็ซๅฏไธ็ดขๅผใ ๅ็ฌๅๅปบๅๅ ้คๅฏไธ็ดขๅผ่ฏญๆณ๏ผ ๅๅปบๅฏไธ็ดขๅผ่ฏญๆณ alter table ่กจๅ add unique ็ดขๅผๅ(ๅญๆฎต); ๆ create unique index ็ดขๅผๅ on ่กจๅ(ๅญๆฎต); ๅ ้คๅฏไธ็ดขๅผ่ฏญๆณ drop index ็ดขๅผๅ on ่กจๅ; ๅๅผ็ดขๅผ ๅณไธไธช็ดขๅผๅชๅ
ๅซๅไธชๅ๏ผไธไธช่กจๅฏไปฅๆๅคไธชๅๅผ็ดขๅผใ ๅปบ่กจๆถๅฏ้่กจไธ่ตทๅปบ็ซๅๅผ็ดขๅผ ๅ็ฌๅๅปบๅๅ ้คๅๅผ็ดขๅผ๏ผ ๅๅปบๅๅผ็ดขๅผ create index ็ดขๅผๅ on ่กจๅ(ๅญๆฎต); ๆ alter table ่กจๅ add index ็ดขๅผๅ(ๅญๆฎต); ๅ ้คๅๅผ็ดขๅผ drop index ็ดขๅผๅ on ่กจๅ; ๅคๅ็ดขๅผ ๅณไธไธช็ดขๅผๅ
ๅซๅคไธชๅใ ๅปบ่กจๆถๅฏ้่กจไธ่ตทๅปบ็ซๅคๅ็ดขๅผ ๅ็ฌๅๅปบๅๅ ้คๅคๅ็ดขๅผ๏ผ ๅๅปบๅคๅ็ดขๅผ create index ็ดขๅผๅ on ่กจๅ(ๅญๆฎต1๏ผๅญๆฎต2); ๅ ้คๅคๅ็ดขๅผ drop index ็ดขๅผๅ on ่กจๅ; ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:1:6","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๆง่ฝๅๆ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:2:0","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"MySQLๅธธ่ง็ถ้ข SQLไธญๅฏนๅคง้ๆฐๆฎ่ฟ่กๆฏ่พใๅ
ณ่ใๆๅบใๅ็ปๆถ๏ผไบง็CPU็ถ้ขใ ๅฎไพๅ
ๅญๆปก่ถณไธไบ็ผๅญๆฐๆฎๆๆๅบ็ญ้่ฆ๏ผๅฏผ่ดไบง็ๅคง้็็ฉ็IOใๆฅ่ฏขๆฐๆฎๆถๆซๆ่ฟๅคๆฐๆฎ่ก๏ผๅฏผ่ดๆฅ่ฏขๆ็ไฝใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:2:1","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"Explainๅๆ ไฝฟ็จ Explain ๅ
ณ้ฎๅญๅฏไปฅๆจกๆไผๅๅจๆง่ก SQL ๆฅ่ฏข่ฏญๅฅ๏ผไป่็ฅ้ MySQL ๆฏๅฆไฝๅค็ SQL ่ฏญๅฅ็ใๅฏไปฅ็จๆฅๅๆๆฅ่ฏข่ฏญๅฅๆๆฏ่กจ็็ปๆ็ๆง่ฝ็ถ้ขใไฝ็จๅฆไธ๏ผ ่กจ็่ฏปๅ้กบๅบ ๅชไบ็ดขๅผๅฏไปฅไฝฟ็จ ๆฐๆฎ่ฏปๅๆไฝ็ๆไฝ็ฑปๅ ๅชไบ็ดขๅผ่ขซๅฎ้
ไฝฟ็จ ่กจไน้ด็ๅผ็จ ๆฏๅผ ่กจๆๅคๅฐ่ก่ขซไผๅๅจๆฅ่ฏข Explain ๅ
ณ้ฎๅญไฝฟ็จ่ตทๆฅๆฏ่พ็ฎๅ๏ผexplain + SQL่ฏญๅฅ explainๆง่ก็ปๆๅๆฐ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:2:2","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"Explain ้่ฆๅญๆฎตๅ -- ๅๅปบๅๅผ ๆต่ฏ่กจ CREATE TABLE t1( id INT(10) AUTO_INCREMENT, content VARCHAR(100), PRIMARY KEY (id) ); CREATE TABLE t2( id INT(10) AUTO_INCREMENT, content VARCHAR(100), PRIMARY KEY (id) ); CREATE TABLE t3( id INT(10) AUTO_INCREMENT, content VARCHAR(100), PRIMARY KEY (id) ); CREATE TABLE t4( id INT(10) AUTO_INCREMENT, content VARCHAR(100), PRIMARY KEY (id) ); -- ๆฏๅผ ่กจไธญๆทปๅ ไธๆกๆฐๆฎ INSERT INTO t1(content) VALUES(CONCAT('t1_',FLOOR(1+RAND()*1000))); INSERT INTO t2(content) VALUES(CONCAT('t2_',FLOOR(1+RAND()*1000))); INSERT INTO t3(content) VALUES(CONCAT('t3_',FLOOR(1+RAND()*1000))); INSERT INTO t4(content) VALUES(CONCAT('t4_',FLOOR(1+RAND()*1000))); id select ๆฅ่ฏข็็ณปๅๅท๏ผ่กจ็คบๆฅ่ฏขไธญๆง่ก select ๅญๅฅๆๆไฝ่กจ็้กบๅบใ id ็ธๅๆถ๏ผๆง่ก้กบๅบ็ฑไธ่ณไธใ explain select * from t1,t2,t3 where t1.id=t2.id and t2.id = t3.id; id ไธๅๆถ๏ผๅฆๆไธบๅญๆฅ่ฏข๏ผid ็ๅบๅทไผ้ๅข๏ผid ๅผ่ถๅคงไผๅ
็บง่ถ้ซ๏ผๅๅ
่ขซๆง่กใ explain select t1.id from t1 where t1.id in (select t2.id from t2 where t2.id in (select t3.id from t3 where t3.id = 1) ); id ็ธๅๅไธๅ้ฝๅญๅจ๏ผid ็ธๅ็ๅฏไปฅ็่งฃไธบไธ็ป๏ผไปไธๅพไธ้กบๅบๆง่ก๏ผๆๆ็ปไธญ๏ผidๅผ่ถๅคง๏ผไผๅ
็บง่ถ้ซ่ถๅ
ๆง่กใ explain select t2.* from t2,(select * from t3) s3 where s3.id = t2.id; select_type ๆฅ่ฏข็็ฑปๅ๏ผๅธธ่งๅผๆ๏ผ SIMPLE๏ผ็ฎๅ็ select ๆฅ่ฏข๏ผๆฅ่ฏขไธญไธๅ
ๅซๅญๆฅ่ฏขๆ่
UNION explain select * from t1; PRIMARY๏ผๆฅ่ฏขไธญ่ฅๅ
ๅซไปปไฝๅคๆ็ๅญ้จๅ๏ผๆๅคๅฑๆฅ่ฏขๅ่ขซๆ ่ฎฐไธบ Primaryใ explain select * from (select t1.content from t1) s1; DERIVED๏ผๅจ FROM ๅ่กจไธญๅ
ๅซ็ๅญๆฅ่ฏข่ขซๆ ่ฎฐไธบ DERIVED๏ผ่ก็๏ผMySQL ไผ้ๅฝๆง่ก่ฟไบๅญๆฅ่ฏข๏ผๆ็ปๆๆพๅจไธดๆถ่กจ้ใ explain select * from (select t1.content from t1) s1; SUBQUERY๏ผๅจ SELECT ๆ WHERE ๅ่กจไธญๅ
ๅซไบๅญๆฅ่ฏขใ explain select t2.* from t2 where t2.id = (select t3.id from t3); table ๆพ็คบ่ฟไธ่ก็ๆฐๆฎๆฏๆฅ่ชๅชๅผ ่กจ็ใ type ่ฎฟ้ฎ็ฑปๅๆๅบ๏ผ ่ฎฟ้ฎ็ฑปๅ system:่กจไธญๅชๆไธ่ก่ฎฐๅฝ๏ผ็ญไบ็ณป็ป่กจ๏ผ๏ผ่ฟๆฏ const ็ฑปๅ็็นๆง๏ผๅนณๆถไธไผๅบ็ฐ๏ผ่ฟไธชไนๅฏไปฅๅฟฝ็ฅไธ่ฎกใ explain select * from (select t1.id from t1 where id = 1) t; const:่กจ็คบ้่ฟ็ดขๅผไธๆฌกๅฐฑๆพๅฐไบ๏ผconst ็จไบๆฏ่พ primary key ๆ่
unique ็ดขๅผใๅ ไธบๅชๅน้
ไธ่กๆฐๆฎ๏ผๆไปฅๅพๅฟซ๏ผๅฆๅฐไธป้ฎ็ฝฎไบ where ๅ่กจไธญ๏ผMySQL ๅฐฑ่ฝๅฐ่ฏฅๆฅ่ฏข่ฝฌๆขไธบไธไธชๅธธ้ใ explain select * from t1 where id = 1; eq_ref:ๅฏไธๆง็ดขๅผๆซๆ๏ผๅฏนไบๆฏไธช็ดขๅผ้ฎ๏ผ่กจไธญๅชๆไธๆก่ฎฐๅฝไธไนๅน้
ใๅธธ่งไธป้ฎๆๅฏไธ็ดขๅผๆซๆใ explain select t1.*,t2.* from t1 join t2 on t1.id = t2.id; ref:้ๅฏไธๆง็ดขๅผๆซๆ๏ผ่ฟๅๅน้
ๆไธชๅ็ฌๅผ็ๆๆ่กใๆฌ่ดจไธไนๆฏไธ็ง็ดขๅผ่ฎฟ้ฎ๏ผๅฎ่ฟๅๆๆๅน้
ๆไธชๅ็ฌๅผ็่ก๏ผ็ถๅ๏ผๅฎๅฏ่ฝไผๆพๅฐๅคไธช็ฌฆๅๆกไปถ็่ก๏ผๆไปฅๅฎๅบ่ฏฅๅฑไบๆฅๆพๅๆซๆ็ๆททๅไฝใ alter table t1 add index idx_t1_content(content); explain select * from t1 where t1.content = \"abc\"; range:ๅชๆฃ็ดข็ปๅฎ่ๅด็่ก๏ผไฝฟ็จไธไธช็ดขๅผๆฅ้ๆฉ่กใkey ๅๆพ็คบไฝฟ็จไบๅชไธช็ดขๅผ๏ผไธ่ฌๅฐฑๆฏๅจไฝ ็ where ่ฏญๅฅไธญๅบ็ฐไบ betweenใ\u003cใ\u003eใin ็ญ็ๆฅ่ฏข่ฟ็ง่ๅดๆซๆ็ดขๅผๆซๆๆฏๅ
จ่กจๆซๆ่ฆๅฅฝ๏ผๅ ไธบๅฎๅช้่ฆๅผๅงไบ็ดขๅผ็ๆไธ็น๏ผ่็ปๆ่ฏญๅฆไธ็น๏ผไธ็จๆซๆๅ
จ้จ็ดขๅผใ explain select * from t2 where t2.id \u003e0; index:Full Index Scan๏ผindex ไธ All ๅบๅซไธบ index ็ฑปๅๅช้ๅ็ดขๅผๆ ใ่ฟ้ๅธธๆฏ All ๅฟซ๏ผๅ ไธบ็ดขๅผๆไปถ้ๅธธๆฏๆฐๆฎๆไปถๅฐ๏ผไนๅฐฑๆฏ่ฏด่ฝ็ถ all ๅ index ้ฝๆฏ่ฏปๅ
จ่กจ๏ผไฝ index ๆฏไป็ดขๅผไธญ่ฏปๅ็๏ผ่ all ๆฏไป็กฌ็ไธญ่ฏป็ใ explain select id,content from t1; All:Full Table Scan๏ผๅฐ้ๅๅ
จ่กจไปฅๆพๅฐๅน้
็่กใ explain select * from t1 where t1.content = \"abc\"; ไปๆๅฅฝๅฐๆๅทฎไพๆฌกๆฏ๏ผsystem \u003e const \u003e eq_ref \u003e ref \u003e range \u003e All ไธ่ฌๆฅ่ฏด๏ผๆๅฅฝไฟ่ฏๆฅ่ฏข่ฝๅค่พพๅฐ range ็บงๅซ๏ผๆๅฅฝ่พพๅฐ refใ possible_keys ๆพ็คบๅฏ่ฝๅบ็จๅจ่ฟๅผ ่กจไธญ็็ดขๅผ๏ผไธไธชๆๅคไธชใๆฅ่ฏขๆถๅๅฐ็ๅญๆฎตไธๅฆๆๅญๅจ็ดขๅผ๏ผๅ็ธๅบ็ดขๅผๅฐไผ่ขซๅๅบๆฅ๏ผไฝไธไธๅฎไผ่ขซๆฅ่ฏขๅฎ้
ไฝฟ็จไธใ key ๆฅ่ฏขไธญๅฎ้
ไฝฟ็จ็็ดขๅผ๏ผๅฆๆไธบ NULL๏ผๅๆฒกๆไฝฟ็จ็ดขๅผใ key_len ่กจ็คบ็ดขๅผไธญไฝฟ็จ็ๅญ่ๆฐ๏ผๅฏ้่ฟ่ฏฅๅ่ฎก็ฎๆฅ่ฏขไธญไฝฟ็จ็็ดขๅผ็้ฟๅบฆใๅจไธๆๅคฑ็ฒพ็กฎๆง็ๆ
ๅตไธ๏ผ้ฟๅบฆ่ถ็ญ่ถๅฅฝใ ref ๆพ็คบ็ดขๅผ็ๅชไธๅ่ขซไฝฟ็จไบใๅชไบๅๆๅธธ้่ขซ็จไบๆฅๆพ็ดขๅผๅไธ็ๅผใ rows rows ๅๆพ็คบ MySQL ่ฎคไธบๅฎๆง่กๆฅ่ฏขๆถๅฟ
้กปๆฃๆฅ็่กๆฐใไธ่ฌ่ถๅฐ่ถๅฅฝใ extra -- ๅๅปบๆต่ฏ่กจ drop table if exists emps; CREATE TABLE emps ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT \"ไธป้ฎid\", name VARCHAR (24) COMMENT 'ๅงๅ', age INT COMMENT 'ๅนด้พ', job VARCHAR (20) COMMENT '่ไฝ' ); -- ๆๅ
ฅๆต่ฏๆฐๆฎ INSERT INTO emps(name,age,job) VALUES('ๅผ ไธ',22,'manager'); INSERT INTO emps(name,age,job) VALUES('lisi',23,'clerk'); INSERT INTO emps(name,age,job) VALUES('wangwu',24,'salsman'); INSERT INTO emps(name,age,job) VALUES('่ตตๅ
ญ',23,'salsman'); ไธไบๅธธ่ง็้่ฆ็้ขๅคไฟกๆฏ๏ผ Using filesort๏ผMySQL ๆ ๆณๅฉ็จ็ดขๅผๅฎๆ็ๆๅบๆไฝ็งฐไนไธบโๆไปถๆๅบโใ explain select * from emps order by age; Using temporary๏ผMySQL ๅจๅฏนๆฅ่ฏข็ปๆๆๅบๆถไฝฟ็จไธดๆถ่กจ๏ผๅธธ่งๆๅบ order by ๅๅ็ปๆฅ่ฏข group byใ explain select count(*),job from emps group by job; Using index๏ผ่กจ็คบ็ดขๅผ่ขซ็จๆฅๆง่ก็ดขๅผ้ฎๅผ็ๆฅๆพ๏ผ้ฟๅ
่ฎฟ้ฎไบ่กจ็ๆฐๆฎ่ก๏ผๆ็่ฟไธ้ใ explain select id,name from emps; Using where๏ผ่กจ็คบไฝฟ็จไบ where ่ฟๆปคใ explain select * from emps where name = \"ๅผ ไธ\"; ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:2:3","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๆฅ่ฏขไผๅ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:0","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"็ดขๅผๅคฑๆ ๆไฝณๅทฆๅ็ผๆณๅ๏ผๅฆๆ็ดขๅผไบๅคๅ๏ผ่ฆ้ตๅพชๆๅทฆๅ็ผๆณๅ๏ผๆ็ๆฏๆฅ่ฏขไป็ดขๅผ็ๆๅทฆๅๅๅผๅงๅนถไธไธ่ทณ่ฟ็ดขๅผไธญ็ๅใ ไธๅจ็ดขๅผไธๅไปปไฝ่ฎก็ฎใๅฝๆฐๆไฝ๏ผไผๅฏผ่ด็ดขๅผๅคฑๆ่ฝฌ่่ฝฌๅๅ
จ่กจๆซๆใ ๅญๅจๅผๆไธ่ฝไฝฟ็จ็ดขๅผไธญ่ๅดๆกไปถๅณ่พน็ๅใ MySQL ๅจไฝฟ็จไธ็ญไบๆถๆ ๆณไฝฟ็จ็ดขๅผไผๅฏผ่ดๅ
จ่กจๆซๆใ is null ๅฏไปฅไฝฟ็จ็ดขๅผ๏ผไฝๆฏ is not null ๆ ๆณไฝฟ็จ็ดขๅผใ like ไปฅ้้
็ฌฆๅผๅคดไผไฝฟ็ดขๅผๅคฑๆๅฏผ่ดๅ
จ่กจๆซๆใ ๅญ็ฌฆไธฒไธๅ ๅๅผๅท็ดขๅผไผๅคฑๆใ ไฝฟ็จ or ่ฟๆฅๆถ็ดขๅผๅคฑๆใ ๅฎๆๆผ็คบ ๅ่ฎพ index(a,b,c) ๅคๅ็ดขๅผ๏ผๆณจๆ or ไธไผ็ๆ๏ผand ไผ่ชๅจ่ฐๆด้กบๅบไธบๆๅทฆๅๅใ where่ฏญๅฅ ็ดขๅผๆฏๅฆ่ขซไฝฟ็จ where a = 3 Yes๏ผไฝฟ็จๅฐa where a = 3 and b = 5 Yes๏ผไฝฟ็จๅฐ a๏ผb where a = 3 and b = 4 and c = 5 Yes๏ผไฝฟ็จๅฐ a๏ผb๏ผc Where b = 4 ๆ่
where b = 4 and c = 4 ๆ่
where c = 5 No where a = 3 and c = 5 Yes๏ผๅช็จๅฐ a๏ผkey_len ไผๅฐไธไบ where a = 3 and b \u003e 4 and c = 5 Yes๏ผไฝฟ็จๅฐ a๏ผb where a = 3 and b like โkk%โ and c = 5 Yes๏ผไฝฟ็จๅฐ a๏ผb๏ผc where a = 3 and b like โ%kkโ and c = 5 Yes๏ผๅช็จๅฐ a where a = 3 and b like โ%kk%โ and c = 5 Yes๏ผๅช็จๅฐ a where a = 3 and b like โk%kk%โ and c = 5 Yes๏ผไฝฟ็จๅฐ a๏ผb๏ผc ็ดขๅผไฝฟ็จๅปบ่ฎฎ ๅฏนไบๅๅผ็ดขๅผ๏ผๅฐฝ้้ๆฉ้ๅฏนๅฝๅๆฅ่ฏขๅญๆฎต่ฟๆปคๆงๆดๅฅฝ็็ดขๅผใ ๅฏนไบ็ปๅ็ดขๅผ๏ผๅฝๅ where ๆฅ่ฏขไธญ่ฟๆปคๆงๆดๅฅฝ็ๅญๆฎตๅจ็ดขๅผๅญๆฎต้กบๅบไธญไฝ็ฝฎ่ถ้ ๅ่ถๅฅฝใ ๅฏนไบ็ปๅ็ดขๅผ๏ผๅฐฝ้้ๆฉ่ฝๅคๅ
ๅซๅฝๅๆฅ่ฏขไธญ where ๅญๅฅไธญๆดๅคๅญๆฎต็็ดขๅผใ ๅฐฝๅฏ่ฝ้่ฟๅๆ็ป่ฎกไฟกๆฏๅ่ฐๆด query ็ๅๆณๆฅ่พพๅฐ้ๆฉๅ้็ดขๅผ็็ฎ็ใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:1","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๅ่กจๆฅ่ฏขไผๅ ็ดขๅผไผๅ ็ปๅธธ็จไบๆฅ่ฏขๆกไปถ็ๅๅปบ็ซ็ดขๅผ ้ฟๅ
ๅจๅคง่กจไธไฝฟ็จๅ
จๆ็ดขๅผ๏ผๅ ไธบๅฎๅฏ่ฝไผๅฝฑๅๆง่ฝ ๅฏนไบ็ปๅธธ้่ฆๆๅบๆๅ็ป็ๅ๏ผๅฏไปฅ่่ๆทปๅ ็ดขๅผ ไฝฟ็จ่ฆ็็ดขๅผ๏ผ็กฎไฟ็ดขๅผๅ
ๅซไบๆฅ่ฏขๆ้่ฆ็ๆๆๅ๏ผ้ฟๅ
ไบๅ่กจๆไฝ ๆฅ่ฏข่ฏญๅฅไผๅ ้ฟๅ
ไฝฟ็จ select *๏ผๅช้ๆฉๅฎ้
้่ฆ็ๅ ้ฟๅ
ๅจ where ๅญๅฅไธญไฝฟ็จไธๅฏ่งๅฝๆฐ๏ผไผๅ ไธบๅฎๅฏ่ฝๅฏผ่ด็ดขๅผๅคฑๆ ๅ็ไฝฟ็จ limit๏ผ้ๅถ่ฟๅ็่ฎฐๅฝๆฐ้๏ผ้ฟๅ
ไธๅฟ
่ฆ็ๆฐๆฎไผ ่พๅๅค็ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:2","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๅ
ณ่ๆฅ่ฏขไผๅ ๅ
่ฟๆฅๆถ๏ผMySQL ไผ่ชๅจๆๅฐ็ปๆ้็้ไธบ้ฉฑๅจ่กจ๏ผๆไปฅๅคง่กจ็ๅญๆฎตๆๅฅฝๅ ไธ็ดขๅผใๅบงๅค่ฟๆฅๆถ๏ผๅทฆ่กจไผๅ
จ่กจๆซๆ๏ผๆไปฅๅณ่พนๅคง่กจๅญๆฎตๆๅฅฝๅ ไธ็ดขๅผ๏ผๅณๅค่ฟๆฅๅ็ใๆไปฌๆๅฅฝไฟ่ฏ่ขซ้ฉฑๅจ่กจไธ็ๅญๆฎตๅปบ็ซไบ็ดขๅผใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:3","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๆๅบไผๅ ๅฐฝ้้ฟๅ
ไฝฟ็จ Using fileSort ๆนๅผๆๅบ order by ่ฏญๅฅไฝฟ็จ็ดขๅผๆๅทฆๅๅๆไฝฟ็จ where ๅญๅฅไธ order by ๅญๅฅๆกไปถ็ปๅๆปก่ถณ็ดขๅผๆๅทฆๅๅใ where ๅญๅฅไธญๅฆๆๅบ็ฐ็ดขๅผ่ๅดๆฅ่ฏขไผๅฏผ่ด order by ็ดขๅผๅคฑๆใ ๅ็
งไธ้ขๅฎๆๆผ็คบ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:4","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๅ็ปไผๅ ๅ็
งๆๅบไผๅ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:3:5","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๆ
ขๆฅ่ฏขๆฅๅฟ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:4:0","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ไป็ป MySQL ็ๆ
ขๆฅ่ฏขๆฅๅฟๆฏ MySQL ๆไพ็ไธ็งๆฅๅฟ่ฎฐๅฝ๏ผๅฎ็จๆฅ่ฎฐๅฝๅจ MySQL ไธญๅๅบๆถ้ด่ถ
่ฟ่ฎพๅฎ้ๅผ็่ฏญๅฅ๏ผๅ
ทไฝๆ่ฟ่กๆถ้ด่ถ
่ฟ long_query_time ๅผ็ SQL ๏ผๅไผ่ขซ่ฎฐๅฝๅฐๆ
ขๆฅ่ฏขๆฅๅฟไธญใๅฏไปฅ็ฑๅฎๆฅๆฅ็ๅชไบ SQL ่ถ
ๅบไบๆไปฌๆๅคงๅฟ่ๆถ้ดๅผใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:4:1","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"ๆ
ขๆฅ่ฏขๆฅๅฟไฝฟ็จ ้ป่ฎคๆ
ๅตไธ๏ผMySQL ๆฐๆฎๅบๅฉๆๅผๅฏๆ
ขๆฅ่ฏขๆฅๅฟ๏ผ้่ฆๆๅจ่ฎพ็ฝฎๅๆฐใ ๆฅ็ๆฏๅฆๅผๅฏๆ
ขๆฅ่ฏขๆฅๅฟ๏ผ show variables like '%slow_query_log%'; ๅผๅฏๆฅๅฟ๏ผ set global show_query_log = 1; ่ฎพ็ฝฎๆถ้ด้ๅผ๏ผ set global long_query_time = 1; ๆฅ็่ฎพ็ฝฎ็ๆถ้ด้ๅผ๏ผ show variables like 'long_query_time%'; ๆฅ็่ถ
ๆถ็ sql ่ฎฐๅฝๆฅๅฟ๏ผMySQL ็ๆฐๆฎๆไปถๅคนไธ โ\\Data\\่ฎพๅคๅ็งฐ-slow.logโ ๆณจๆ๏ผ้่ฐไผๅบๆฏไธ๏ผไธ่ฌไธๅปบ่ฎฎๅผๅฏๆนๅๆฐ๏ผๆ
ขๆฅ่ฏขๆฅๅฟๅฐๆฅๅฟ่ฎฐๅฝๅๅ
ฅๆไปถ๏ผๅผๅฏๆ
ขๆฅ่ฏขๆฅๅฟไผๆๅคๆๅฐๅธฆๆฅไธๅฎ็ๆง่ฝๅฝฑๅใ ","date":"2023-12-14","objectID":"/blog/20231214_mysqlindex/:4:2","tags":["Index","็ดขๅผ","MySQL","ไผๅ"],"title":"MySQL ็ดขๅผ","uri":"/blog/20231214_mysqlindex/"},{"categories":["Technology"],"content":"้ช่ฑ็ฎๆณ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๅ่จ ็ณป็ปๅฏไธIDๆฏๆไปฌๅจ่ฎพ่ฎกไธไธช็ณป็ป็ๆถๅๅธธๅธธไผ้่ง็้ฎ้ข๏ผไนๅธธๅธธไธบ่ฟไธช้ฎ้ข่็บ ็ปใ ่ฟ็ฏๆ็ซ ๅฐฑๆฏ็ปๅคงๅฎถๆไพไธไธช็ๆๅๅธๅผๅฏไธๅ
จๅฑid็ๆๆนๆก็ๆ่ทฏ๏ผๅธๆๅฏไปฅๅ
ฑๅๅคงๅฎถใ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:1:0","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"้ฎ้ข ไธบไปไน้่ฆๅๅธๅผๅ
จๅฑๅฏไธIDไปฅๅๅๅธๅผID็ไธๅก้ๆฑ ๅจๅคๆๅๅธๅผ็ณป็ปไธญ๏ผๅพๅพ้่ฆๅฏนๅคง้็ๆฐๆฎๅๆถๆฏ่ฟ่กๅฏไธๆ ่ฏ๏ผๅฆๅจ็พๅข็น่ฏ็้่ใๆฏไปใ้ค้ฅฎใ้
ๅบ ็ซ็ผ็ตๅฝฑ็ญไบงๅ็็ณป็ปไธญๆฐๆฎ้ๆธๅข้ฟ๏ผๅฏนๆฐๆฎๅบๅๅบๅ่กจๅ้่ฆๆไธไธชๅฏไธIDๆฅๆ ่ฏไธๆกๆฐๆฎๆไฟกๆฏ๏ผ ็นๅซๆฏ่ฎขๅใ้ชๆใไผๆ ๅธ้ฝ้่ฆๆๅฏไธIDๅๆ ่ฏ ๆญคๆถไธไธช่ฝๅค็ๆๅ
จๅฑๅฏไธID็็ณป็ปๆฏ้ๅธธๅฟ
่ฆ็ ID็ๆ่งๅ้จๅ็กฌๆง่ฆๆฑ ๅ
จๅฑๅฏไธ ่ถๅฟ้ๅข ๅจ MySQL ็ InnoDB ๅผๆไธญไฝฟ็จ็ๆฏ่้็ดขๅผ๏ผ็ฑไบๅคๆฐ RDBMS ไฝฟ็จ Btree ็ๆฐๆฎ็ปๆๆฅๅญๅจ็ดขๅผ๏ผๅจไธป้ฎ็้ๆฉไธ้ขๆไปฌๅบ่ฏฅๅฐฝ้ไฝฟ็จๆๅบ็ไธป้ฎไฟ่ฏๅๅ
ฅๆง่ฝ ๅ่ฐ้ๅข ไฟ่ฏไธไธไธชIDไธๅฎๅคงไบไธไธไธชID๏ผไพๅฆไบๅก็ๆฌๅทใIMๅข้ๆถๆฏใๆๅบ็ญ็นๆฎ้ๆฑ ไฟกๆฏๅฎๅ
จ ๅฆๆIDๆฏ่ฟ็ปญ๏ผๆถๆ็จๆท็็ฌๅๅทฅไฝๅฐฑ้ๅธธๅฎนๆๅไบ๏ผ็ดๆฅๆ็
ง้กบๅบไธ่ฝฝๆๅฎURLๅณๅฏ๏ผๅฆๆๆฏ่ฎขๅๅทๅฐฑๅฑ้ฉไบ๏ผ็ซไบๅฏนๆๅฏไปฅ็ดๆฅ็ฅ้ๆไปฌไธๅคฉ็ๅ้๏ผๆไปฅๅจไธไบๅบ็จๅบๆฏไธ๏ผ้่ฆIDๆ ่งๅไธ่งๅ๏ผ่ฎฉ็ซไบๅฏนๆไธๅฅฝ็ ๅซๆถ้ดๆณ ไธๆ ท่ฝๅคๅฟซ้ๅจๅผๅไธญไบ่งฃ่ฟไธชๅๅธๅผIDไปไนๆถๅ็ๆ็ IDๅท็ๆ็ณป็ป็ๅฏ็จๆง่ฆๆฑ ้ซๅฏ็จ ๅๅธไธไธช่ทๅๅๅธๅผID่ฏทๆฑ๏ผๆๅกๅจๅฐฑ่ฆไฟ่ฏ 99.999% ็ๆ
ๅตไธ็ปๆๅๅปบไธไธชๅฏไธๅๅธๅผID ไฝๅปถ่ฟ ๅไธไธช่ทๅๅๅธๅผID็่ฏทๆฑ๏ผๆๅกๅจๅฐฑ่ฆๅฟซ๏ผๆ้ ้ซQPS ไพๅฆๅนถๅไธๅฃๆฐ10ไธไธชๅๅปบๅๅธๅผID่ฏทๆฑๅๆถๆ่ฟๆฅ๏ผๆๅกๅจ่ฆ้กถๅพไฝไธไธไธๅญๆๅๅๅปบ10ไธไธชๅๅธๅผID ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:2:0","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"้็จ่งฃๅณๆนๆก ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:3:0","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"UUID ไป็ป UUID.randomUUID(), UUID็ๆ ๅๅๅ
ๅซ32ไธช16่ฟๅถๆฐๅญ๏ผไปฅ่ฟๅญๅทๅไธบไบๆฎต๏ผๅฝขๅผไธบ 8-4-4-4-12็36ไธชๅญ็ฌฆ๏ผๆง่ฝ้ๅธธ้ซ๏ผๆฌๅฐ็ๆ๏ผๆฒกๆ็ฝ็ปๆถ่ใ UUID็ปๆ้จๅ ๅฝๅๆฅๆๅๆถ้ด๏ผUUID็็ฌฌไธไธช้จๅไธๆถ้ดๆๅ
ณ๏ผๅฆๆไฝ ๅจ็ๆไธไธชUUIDไนๅ๏ผ่ฟๅ ็งๅ็ๆไธไธชUUID๏ผๅ็ฌฌไธไธช้จๅไธๅ๏ผๅ
ถไฝ็ธๅใ ๆถ้ๅบๅใ ๅ
จๅฑๅฏไธ็IEEEๆบๅจ่ฏๅซๅท๏ผๅฆๆๆ็ฝๅก๏ผไป็ฝๅกMACๅฐๅ่ทๅพ๏ผๆฒกๆ็ฝๅกไปฅๅ
ถไปๆนๅผ่ทๅพใ ๅญๅจ้ฎ้ข ๅ
ฅๆฐๆฎๅบๆง่ฝๅทฎ๏ผๅ ไธบUUIDๆฏๆ ๅบ็ ๆ ๅบ๏ผๆ ๆณ้ขๆตไป็็ๆ้กบๅบ๏ผไธ่ฝ็ๆ้ๅขๆๅบ็ๆฐๅญ ้ฆๅ
ๅๅธๅผidไธ่ฌ้ฝไผไฝไธบ้ๆธ๏ผไฝๆฏๆ็
งmysqlๅฎๆนๆจ่ไธป้ฎๅฐฝ้่ถ็ญ่ถๅฅฝ๏ผUUIDๆฏไธไธช้ฝๅพ้ฟ๏ผๆไปฅไธๆฏๅพๆจ่ใ ไธป้ฎ๏ผIDไฝไธบไธป้ฎๆถ๏ผๅจ็นๅฎ็็ฏๅขไธไผๅญๅจไธไบ้ฎ้ข ๆฏๅฆๅDBไธป้ฎ็ๅบๆฏไธ๏ผUUIDๅฐฑ้ๅธธไธ้็จMySQLๅฎๆนๆๆ็กฎ็่ฏดๆ ็ดขๅผ๏ผB+ๆ ็ดขๅผ็ๅ่ฃ ๆข็ถๅๅธๅผIDๆฏไธป้ฎ๏ผ็ถๅไธป้ฎๆฏๅ
ๅซ็ดขๅผ็๏ผ่mysql็็ดขๅผๆฏ้่ฟB+ๆ ๆฅๅฎ็ฐ็๏ผๆฏไธๆฌกๆฐ็UUIDๆฐๆฎ็ๆๅ
ฅ๏ผไธบไบๆฅ่ฏข็ไผๅ๏ผ้ฝไผๅฏน็ดขๅผๅบๅฑ็B+ๆ ่ฟ่กไฟฎๆน๏ผๅ ไธบUUIDๆฐๆฎๆฏๆ ๅบ็๏ผๆไปฅๆฏไธๆฌกUUIDๆฐๆฎ็ๆๅ
ฅ้ฝไผๅฏนไธป้ฎ็B+ๆ ่ฟ่กๅพๅคง็ไฟฎๆน๏ผ่ฟไธ็นๅพไธๅฅฝ๏ผๆๅ
ฅๅฎๅ
จๆ ๅบ๏ผไธไฝไผๅฏผ่ดไธไบไธญ้ด่็นไบง็ๅ่ฃ๏ผไนไผ็ฝ็ฝๅ้ ๅบๅพๅคไธ้ฅฑๅ็่็น๏ผ่ฟๆ ทๅคงๅคง้ไฝไบๆฐๆฎๅบๆๅ
ฅ็ๆง่ฝใ UUIDๅช่ฝไฟ่ฏๅ
จๅฑๅฏไธๆง๏ผไธๆปก่ถณๅ้ข็่ถๅฟ้ๅข๏ผๅ่ฐ้ๅข ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:3:1","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๆฐๆฎๅบ่ชๅขไธป้ฎ ๅๆบ ๅจๅๅธๅผ้้ข๏ผๆฐๆฎๅบ็่ชๅขIDๆบๅถ็ไธป่ฆๅ็ๆฏ๏ผๆฐๆฎๅบ่ชๅขIDๅmysqlๆฐๆฎๅบ็replace intoๅฎ็ฐ็๏ผ่ฟ้็replace into่ทinsertๅ่ฝ ็ฑปไผผ๏ผไธๅ็นๅจไบ๏ผreplace into้ฆๅ
ๅฐ่ฏๆๅ
ฅๆฐๆฎๅ่กจไธญ๏ผๅฆๆๅ็ฐ่กจไธญๅทฒ็ปๆๆญค่กๆฐๆฎ๏ผๆ นๆฎไธป้ฎๆๅฏไธ็ดขๅผๅคๆญ๏ผๅๅ
ๅ ้ค๏ผๅจๆๅ
ฅ๏ผๅฆๅ็ดๆฅๆๅ
ฅๆฐๆฐๆฎใ REPLACE INTO็ๅซไนๆฏๆๅ
ฅไธๆก่ฎฐๅฝ๏ผๅฆๆ่กจไธญๅฏไธ็ดขๅผ็ๅผ้ๅฐๅฒ็ช๏ผๅๆฟๆข่ๆฐๆฎ ICREATE TABLE t_test( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, state CHAR (1) NOT NULL DEFAULT '', UNIQUE KEY state (state) ) REPLACE INTO t_test(state) values('b'); select LAST_INSERT_ID(); ๆไปฌๆฏๆฌกๆๅ
ฅ็ๆถๅ๏ผๅ็ฐ้ฝไผๆๅๆฅ็ๆฐๆฎ็ปๆฟๆข๏ผๅนถไธIDไนไผๅขๅ ่ฟๅฐฑๆปก่ถณไบ ้ๅขๆง ๅ่ฐๆง ๅฏไธๆง ๅจๅๅธๅผๆ
ๅตไธ๏ผๅนถไธๅนถๅ้ไธๅค็ๆ
ๅต๏ผๅฏไปฅไฝฟ็จ่ฟ็งๆนๆกๆฅ่งฃๅณ๏ผ่ทๅพไธไธชๅ
จๅฑ็ๅฏไธID ๅๅธๅผ้็พค ้ฃๆฐๆฎๅบ่ชๅขIDๆบๅถ้ๅๅๅๅธๅผIDๅ๏ผ ็ญๆกๆฏไธๅคช้ๅ ็ณป็ปๆฐดๅนณๆฉๅฑๆฏ่พๅฐ้พ๏ผๆฏๅฆๅฎไนๅฅฝๆญฅ้ฟๅๆบๅจๅฐๆฐไนๅ๏ผๅฆๆ่ฆๆทปๅ ๆบๅจ่ฏฅๆไนๅ๏ผๅ่ฎพ็ฐๅจๆไธๅฐๆบๅจๅๅทๆฏ๏ผ1,2,3,4,5,๏ผๆญฅ้ฟๆฏ1๏ผ๏ผ่ฟไธชๆถๅ้่ฆๆฉๅฎนๆบๅจไธๅฐ๏ผๅฏไปฅ่ฟๆ ทๅ๏ผๆ็ฌฌไบๅฐๆบๅจ็ๅๅงๅผ่ฎพ็ฝฎๅพๆฏ็ฌฌไธๅฐ่ถ
่ฟๅพๅค๏ผ่ฒไผผ่ฟๅฅฝ๏ผไฝๆฏๅ่ฎพ็บฟไธๅฆๆๆ100ๅฐๆบๅจ๏ผ่ฟไธชๆถๅๆฉๅฎน่ฆๆไนๅ๏ผ็ฎ็ดๆฏๅฉๆขฆ๏ผๆไปฅ็ณป็ปๆฐดๅนณๆฉๅฑๆนๆกๅคๆ้พไปฅๅฎ็ฐใ ๆฐๆฎๅบๅๅ่ฟๆฏๅพๅคง๏ผๆฏๆฌก่ทๅID้ฝๅพ่ฏปๅไธๆฌกๆฐๆฎๅบ๏ผ้ๅธธๅฝฑๅๆง่ฝ๏ผไธ็ฌฆๅๅๅธๅผID้้ข็ๅปถ่ฟไฝๅ้ซQPS็่งๅ๏ผๅจ้ซๅนถๅไธ๏ผๅฆๆ้ฝๅปๆฐๆฎๅบ้้ข่ทๅID๏ผ้ฃๆฏ้ๅธธๅฝฑๅๆง่ฝ็๏ผ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:3:2","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๅบไบRedis็ๆๅ
จๅฑID็ญ็ฅ ๅๆบ ๅ ไธบRedisๆฏๅ็บฟ็จ๏ผๅคฉ็ไฟ่ฏๅๅญๆง๏ผๅฏไปฅไฝฟ็จๅๅญๆไฝ INCR ๅ INCRBY ๆฅๅฎ็ฐ INCRBY๏ผ่ฎพ็ฝฎๅข้ฟๆญฅ้ฟ ๅๅธๅผ้็พค ๆณจๆ๏ผๅจRedis้็พคๆ
ๅตไธ๏ผๅๆ ทๅMySQLไธๆ ท้่ฆ่ฎพ็ฝฎไธๅ็ๅข้ฟๆญฅ้ฟ๏ผๅๆถkeyไธๅฎ่ฆ่ฎพ็ฝฎๆๆๆ๏ผๅฏไปฅไฝฟ็จRedis้็พคๆฅ่ทๅๆด้ซ็ๅๅ้ใ ๅ่ฎพไธไธช้็พคไธญๆ5ๅฐRedis๏ผๅฏไปฅๅๅงๅๆฏๅฐRedis็ๅผๅๅซๆฏ 1,2,3,4,5 ๏ผ ็ถๅ่ฎพ็ฝฎๆญฅ้ฟ้ฝๆฏ5 ๅไธชRedis็ๆ็IDไธบ๏ผ A๏ผ1 6 11 16 21 B๏ผ2 7 12 17 22 C๏ผ3 8 13 18 23 D๏ผ4 9 14 19 24 E๏ผ5 10 15 20 25 ไฝๆฏๅญๅจ็้ฎ้ขๆฏ๏ผๅฐฑๆฏRedis้็พค็็ปดๆคๅไฟๅ
ปๆฏ่พ้บป็ฆ๏ผ้
็ฝฎ้บป็ฆใๅ ไธบ่ฆ่ฎพ็ฝฎๅ็นๆ
้๏ผๅจๅ
ตๅผๅฎ ไฝๆฏไธป่ฆๆฏ็้ฎ้ขๅฐฑๆฏ๏ผไธบไบไธไธชID๏ผๅด้่ฆๅผๅ
ฅๆดไธชRedis้็พค๏ผๆ็งๆ้ธก็็จ็ๅ็ๆ่ง ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:3:3","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"้ช่ฑ็ฎๆณ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:0","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ไป็ป Twitter็ๅๅธๅผ่ชๅขID็ฎๆณ๏ผSnowflake ๆๅTwitterๆๅญๅจ็ณป็ปไปMySQL่ฟ็งปๅฐCassandra๏ผ็ฑFacebookๅผๅไธๅฅๅผๆบๅๅธๅผNoSQLๆฐๆฎๅบ็ณป็ป๏ผๅ ไธบCassandraๆฒกๆ้กบๅบID็ๆๆบๅถ๏ผๆๆๅผๅไบ่ฟๆ ทไธๅฅๅ
จๅฑๅฏไธID็ๆๆๅกใ Twitter็ๅๅธๅผ้ช่ฑ็ฎๆณSnowFlake๏ผ็ปๆต่ฏSnowFlakeๆฏ็งๅฏไปฅไบง็26ไธไธช่ชๅขๅฏๆๅบ็ID twitter็SnowFlake็ๆID่ฝๅคๆ็
งๆถ้ดๆๅบ็ๆ SnowFlake็ฎๆณ็ๆID็็ปๆๆฏไธไธช64Bitๅคงๅฐ็ๆดๆฐ๏ผไธบไธไธชLongๅ๏ผ่ฝฌๆขๆๅญ็ฌฆไธฒๅ้ฟๅบฆๆๅค19๏ผ ๅๅธๅผ็ณป็ปๅ
ไธไผไบง็ID็ขฐๆ๏ผ็ฑdatacenter ๅ workerIDๅๅบๅ๏ผๅนถไธๆ็่พ้ซ ๅ
จๅฑๅฏไธID็ๅบๆฌ่ฆๆฑ ๅจๅๅธๅผ็ฏๅขไธ๏ผๅฟ
้กปๅ
จๅฑๅฏไธๆง ไธ่ฌ้ฝ้่ฆๅ่ฐ้ๅข๏ผๅ ไธบไธ่ฌๅฏไธID้ฝไผๅญๅจๆฐๆฎๅบ๏ผ่InnoDB็็นๆงๅฐฑๆฏๅฐๅ
ๅฎนๅญๅจๅจไธป้ฎ็ดขๅผไธ็ๅถๅญ่็น๏ผ่ไธๆฏไปๅทฆๅพๅณ้ๅข็๏ผๆๆ่่ๅฐๆฐๆฎๅบๆง่ฝ๏ผไธ่ฌ็ๆIDไนๆๅฅฝๆฏๅ่ฐ้ๅข็ใไธบไบ้ฒๆญขIDๅฒ็ชๅฏไปฅไฝฟ็จ36ไฝUUID๏ผไฝๆฏUUIDๆไธไบ็ผบ็น๏ผ้ฆๅ
ๆฏๅฎ็ธๅฏนๆฏ่พ้ฟ๏ผๅนถไธๅฆๅคUUIDไธ่ฌๆฏๆ ๅบ็ ๅฏ่ฝ่ฟไผ้่ฆๆ ่งๅ๏ผๅ ไธบๅฆๆไฝฟ็จๅฏไธIDไฝไธบ่ฎขๅๅท่ฟ็ง๏ผไธบไบไธ่ฎฉๅซไบบ็ฅ้ไธๅคฉ็่ฎขๅ้ๅคๅฐ๏ผๅฐฑ้่ฆ่ฟ็ง่งๅ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:1","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"็ปๆ ้ช่ฑ็ฎๆณ็ๅ ไธชๆ ธๅฟ็ปๆ้จๅ ๅจJavaไธญ64bit็่ฏไนฆๆฏlong็ฑปๅ๏ผๆไปฅๅจSnowFlake็ฎๆณ็ๆ็IDๅฐฑๆฏlong็ฑปๅญๅจ็ ้ช่ฑ็ฎๆณๆ ธๅฟ็ปๆ้จๅ **็ฌฌไธ้จๅ** ไบ่ฟๅถไธญๆ้ซไฝๆฏ็ฌฆๅทไฝ๏ผ1่กจ็คบ่ดๆฐ๏ผ0่กจ็คบๆญฃๆฐใ็ๆ็IDไธ่ฌ้ฝๆฏ็จๆดๆฐ๏ผๆไปฅๆ้ซไฝๅบๅฎไธบ0ใ **็ฌฌไบ้จๅ** ็ฌฌไบ้จๅๆฏ41bitๆถ้ดๆณไฝ๏ผ็จๆฅ่ฎฐๅฝๆถ้ดๆณ๏ผๆฏซ็ง็บง 41ไฝๅฏไปฅ่กจ็คบ 2^41 -1 ไธชๆฐๅญ ๅฆๆๅช็จๆฅ่กจ็คบๆญฃๆดๆฐ๏ผๅฏไปฅ่กจ็คบ็่ๅดๆฏ๏ผ0 - 2^41 -1๏ผๅ1ๆฏๅ ไธบๅฏไปฅ่กจ็คบ็ๆฐๅผ่ๅดๆฏไป0ๅผๅง่ฎก็ฎ็๏ผ่ไธๆฏไป1ใ ไนๅฐฑๆฏ่ฏด41ไฝๅฏไปฅ่กจ็คบ 2^41 - 1 ๆฏซ็ง็ๅผ๏ผ่ฝฌๆขๆๅไฝๅนดๅๆฏ 69.73ๅนด **็ฌฌไธ้จๅ** ็ฌฌไธ้จๅไธบๅทฅไฝๆบๅจID๏ผ10Bit็จๆฅ่ฎฐๅฝๅทฅไฝๆบๅจID ๅฏไปฅ้จ็ฝฒๅจ2^10 = 1024ไธช่็น๏ผๅ
ๆฌ5ไฝ datacenterId๏ผๆฐๆฎไธญๅฟ๏ผๆบๆฟ๏ผ ๅ 5ไฝ workerID๏ผๆบๅจ็ ๏ผ 5ไฝๅฏไปฅ่กจ็คบ็ๆๅคงๆญฃๆดๆฐๆฏ 2 ^ 5 = 31ไธชๆฐๅญ๏ผๆฅ่กจ็คบไธๅ็ๆฐๆฎไธญๅฟ ๅ ๆบๅจ็ **็ฌฌๅ้จๅ** 12ไฝbitๅฏไปฅ็จๆฅ่กจ็คบ็ๆญฃๆดๆฐๆฏ 2^12 = 4095๏ผๅณๅฏไปฅ็จ0 1 2 โฆ 4094 ๆฅ่กจ็คบๅไธไธชๆบๅจๅไธไธชๆถ้ดๆณๅ
ไบง็็4095ไธชIDๅบๅทใ SnowFlakeๅฏไปฅไฟ่ฏๆๆ็ๆ็IDๆๆถ้ด่ถๅฟ้ๅข๏ผๆดไธชๅๅธๅผ็ณป็ปๅ
ไธไผไบง็้ๅคID๏ผๅ ไธบๆ datacenterId ๅ workerId ๆฅๅๅบๅ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:2","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๅฎ็ฐ ้ช่ฑ็ฎๆณๆฏ็ฑ scala ็ฎๆณ็ผๅ็๏ผๆไบบไฝฟ็จjavaๅฎ็ฐ๏ผgithubๅฐๅ /** * twitter็snowflake็ฎๆณ -- javaๅฎ็ฐ * * @author beyond */ public class SnowFlake { /** * ่ตทๅง็ๆถ้ดๆณ */ private final static long START_STMP = 1480166465631L; /** * ๆฏไธ้จๅๅ ็จ็ไฝๆฐ */ private final static long SEQUENCE_BIT = 12; //ๅบๅๅทๅ ็จ็ไฝๆฐ private final static long MACHINE_BIT = 5; //ๆบๅจๆ ่ฏๅ ็จ็ไฝๆฐ private final static long DATACENTER_BIT = 5;//ๆฐๆฎไธญๅฟๅ ็จ็ไฝๆฐ /** * ๆฏไธ้จๅ็ๆๅคงๅผ */ private final static long MAX_DATACENTER_NUM = -1L ^ (-1L \u003c\u003c DATACENTER_BIT); private final static long MAX_MACHINE_NUM = -1L ^ (-1L \u003c\u003c MACHINE_BIT); private final static long MAX_SEQUENCE = -1L ^ (-1L \u003c\u003c SEQUENCE_BIT); /** * ๆฏไธ้จๅๅๅทฆ็ไฝ็งป */ private final static long MACHINE_LEFT = SEQUENCE_BIT; private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT; private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT; private long datacenterId; //ๆฐๆฎไธญๅฟ private long machineId; //ๆบๅจๆ ่ฏ private long sequence = 0L; //ๅบๅๅท private long lastStmp = -1L;//ไธไธๆฌกๆถ้ดๆณ public SnowFlake(long datacenterId, long machineId) { if (datacenterId \u003e MAX_DATACENTER_NUM || datacenterId \u003c 0) { throw new IllegalArgumentException(\"datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0\"); } if (machineId \u003e MAX_MACHINE_NUM || machineId \u003c 0) { throw new IllegalArgumentException(\"machineId can't be greater than MAX_MACHINE_NUM or less than 0\"); } this.datacenterId = datacenterId; this.machineId = machineId; } /** * ไบง็ไธไธไธชID * * @return */ public synchronized long nextId() { long currStmp = getNewstmp(); if (currStmp \u003c lastStmp) { throw new RuntimeException(\"Clock moved backwards. Refusing to generate id\"); } if (currStmp == lastStmp) { //็ธๅๆฏซ็งๅ
๏ผๅบๅๅท่ชๅข sequence = (sequence + 1) \u0026 MAX_SEQUENCE; //ๅไธๆฏซ็ง็ๅบๅๆฐๅทฒ็ป่พพๅฐๆๅคง if (sequence == 0L) { currStmp = getNextMill(); } } else { //ไธๅๆฏซ็งๅ
๏ผๅบๅๅท็ฝฎไธบ0 sequence = 0L; } lastStmp = currStmp; return (currStmp - START_STMP) \u003c\u003c TIMESTMP_LEFT //ๆถ้ดๆณ้จๅ | datacenterId \u003c\u003c DATACENTER_LEFT //ๆฐๆฎไธญๅฟ้จๅ | machineId \u003c\u003c MACHINE_LEFT //ๆบๅจๆ ่ฏ้จๅ | sequence; //ๅบๅๅท้จๅ } private long getNextMill() { long mill = getNewstmp(); while (mill \u003c= lastStmp) { mill = getNewstmp(); } return mill; } private long getNewstmp() { return System.currentTimeMillis(); } public static void main(String[] args) { SnowFlake snowFlake = new SnowFlake(2, 3); for (int i = 0; i \u003c (1 \u003c\u003c 12); i++) { System.out.println(snowFlake.nextId()); } } } ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:3","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๆป็ป ้ช่ฑ็ฎๆณไผ็ผบ็น ไผ็น ๆฏซ็งๆฐๅจ้ซ็ปด๏ผ่ชๅขๅบๅๅจไฝไฝ๏ผๆดไธชID้ฝๆฏ่ถๅฟ้ๅข็ ไธไพ่ตๆฐๆฎๅบ็ญ็ฌฌไธๆน็ณป็ป๏ผไปฅๆๅก็ๆนๅผ้จ็ฝฒ๏ผ็จณๅฎๆงๆด้ซ๏ผ็ๆID็ๆง่ฝไนๆฏ้ๅธธ้ซ็ ๅฏไปฅๆ นๆฎ่ช่บซไธๅก็นๆงๅ้
bitไฝ๏ผ้ๅธธ็ตๆดป ็ผบ็น ไพ่ตๆบๅจๆถ้๏ผๅฆๆๆบๅจๆถ้ๅๆจ๏ผไผๅฏผ่ด้ๅคID็ๆ ๅจๅๆบไธๆฏ้ๅข็๏ผไฝ็ฑไบๆถๅๅฐๅๅธๅผ็ฏๅข๏ผๆฏๅฐๆบๅจไธ็ๆถ้ไธๅฏ่ฝๅฎๅ
จๅๆญฅ๏ผๆๆถๅไผๅบ็ฐไธๆฏๅ
จๅฑ้ๅข็ๆ
ๅต๏ผๆญค็ผบ็นๅฏไปฅ่ฎคไธบๆ ๆ่ฐ๏ผไธ่ฌๅๅธๅผIDๅช่ฆๆฑ่ถๅฟ้ๅข๏ผๅนถไธไผไธฅๆ ผ่ฆๆฑ้ๅข๏ผ90%็้ๆฑๅช่ฆๆฑ่ถๅฟ้ๅขใ ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:4","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"ๅ
ถๅฎ่กฅๅ
ไธบไบ่งฃๅณๆถ้ๅๆจ้ฎ้ข๏ผๅฏผ่ดID้ๅค๏ผๅ้ขๆไบบไธ้จๆๅบไบ่งฃๅณ็ๆนๆก ็พๅบฆๅผๆบ็ๅๅธๅผๅฏไธID็ๆๅจ UidGenerator Leaf - ็พๅข็น่ฏๅๅธๅผID็ๆ็ณป็ป ","date":"2023-10-11","objectID":"/blog/20231011_globaluniqueid/:4:5","tags":["ๅๅธๅผๅ
จๅฑID","้ซๅนถๅ","ๅๆบ"],"title":"ๅๅธๅผๅ
จๅฑๅฏไธID","uri":"/blog/20231011_globaluniqueid/"},{"categories":["Technology"],"content":"Javaๅค็บฟ็จ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅผๅ
ฅ ๆณจๆ ไธไธช ๆณจๆ ๆจชๅน
ๆ่ฆ ไธไธช ๆ่ฆ ๆจชๅน
ไฟกๆฏ ไธไธช ไฟกๆฏ ๆจชๅน
ๆๅทง ไธไธช ๆๅทง ๆจชๅน
ๆๅ ไธไธช ๆๅ ๆจชๅน
้ฎ้ข ไธไธช ้ฎ้ข ๆจชๅน
่ญฆๅ ไธไธช ่ญฆๅ ๆจชๅน
ๅคฑ่ดฅ ไธไธช ๅคฑ่ดฅ ๆจชๅน
ๅฑ้ฉ ไธไธช ๅฑ้ฉ ๆจชๅน
Bug ไธไธช Bug ๆจชๅน
็คบไพ ไธไธช ็คบไพ ๆจชๅน
ๅผ็จ ไธไธช ๅผ็จ ๆจชๅน
","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:1:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"่ฟ็จไธ็บฟ็จ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:2:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ไป็ป ่ฟ็จ ็จๅบ็ฑๆไปคๅๆฐๆฎ็ปๆ๏ผไฝ่ฟไบๆไปค่ฆ่ฟ่ก๏ผๆฐๆฎ่ฆ่ฏปๅ๏ผๅฐฑๅฟ
้กปๅฐๆไปคๅ ่ฝฝ่ณ CPU ๏ผๆฐๆฎๅ ่ฝฝ่ณๅ
ๅญใๅจๆไปค่ฟ่ก่ฟ็จไธญ่ฟ้่ฆ็จๅฐ็ฃ็ใ็ฝ็ป็ญ่ฎพๅคใ่ฟ็จๅฐฑๆฏ็จๆฅๅ ่ฝฝๆไปคใ็ฎก็ๅ
ๅญใ็ฎก็ IO ็ใ ๅฝไธไธช็จๅบ่ขซ่ฟ่ก๏ผไป็ฃ็ๅ ่ฝฝ่ฟไธช็จๅบ็ไปฃ็ ่ณๅ
ๅญ๏ผ่ฟๆถๅฐฑๅผๅฏไบไธไธช่ฟ็จใ ่ฟ็จๅฐฑๅฏไปฅ่งไธบ็จๅบ็ไธไธชๅฎไพใๅคง้จๅ็จๅบๅฏไปฅๅๆถ่ฟ่กๅคไธชๅฎไพ่ฟ็จ๏ผไพๅฆ่ฎฐไบๆฌใ็ปๅพใๆต่งๅจ็ญ๏ผ๏ผไนๆ็็จๅบๅช่ฝๅฏๅจไธไธชๅฎไพ่ฟ็จ๏ผไพๅฆ็ฝๆไบ้ณไนใ360ๅฎๅ
จๅซๅฃซ็ญ๏ผ ็บฟ็จ ไธไธช่ฟ็จไนๅ
ๅฏไปฅๅไธบไธๅฐๅคไธช็บฟ็จใ ไธไธช็บฟ็จๅฐฑๆฏไธไธชๆไปคๆต๏ผๅฐๆไปคๆตไธญ็ไธๆกๆกๆไปคไปฅไธๅฎ็้กบๅบไบค็ปCPUๆง่กใ Javaไธญ๏ผ็บฟ็จไฝไธบๆๅฐ่ฐๅบฆๅไฝ๏ผ่ฟ็จไฝไธบ่ตๆบๅ้
็ๆๅฐๅไฝใๅจ Windows ไธญ่ฟ็จๆฏไธๆดปๅจ็๏ผๅชๆฏไฝไธบ็บฟ็จ็ๅฎนๅจใ ็บฟ็จไธ่ฟ็จๅฏนๆฏ ่ฟ็จๅบๆฌไธ็ธไบ็ฌ็ซ็๏ผ่็บฟ็จๅญๅจไบ่ฟ็จๅ
๏ผๆฏ่ฟ็จ็ไธไธชๅญ้ ่ฟ็จๆฅๆๅ
ฑไบซ็่ตๆบ๏ผๅฆๅ
ๅญ็ฉบ้ด็ญ๏ผไพๅ
ถๅ
้จ็็บฟ็จๅ
ฑไบซ ่ฟ็จ้ด้ไฟก่พไธบๅคๆ ๅไธๅฐ่ฎก็ฎๆบ็่ฟ็จ้ไฟก็งฐไธบIPC๏ผInter-process communication๏ผ ไธๅ่ฎก็ฎๆบไน้ด็่ฟ็จ้ไฟก๏ผ้่ฆ้่ฟ็ฝ็ป๏ผๅนถ้ตๅพชๅ
ฑๅ็ๅ่ฎฎ๏ผไพๅฆ HTTP ็บฟ็จ้ไฟก็ธๅฏน็ฎๅ๏ผๅ ไธบไปไปฌๅ
ฑไบซ่ฟ็จๅ
็ๅ
ๅญใไพๅฆ๏ผๅคไธช็บฟ็จๅฏไปฅ่ฎฟ้ฎๅไธไธชๅ
ฑไบซๅ้ ็บฟ็จๆด่ฝป้๏ผ็บฟ็จไธไธๆๅๆขๆๆฌไธ่ฌไธ่ฆๆฏ่ฟ็จไธไธๆๅๆขไฝ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:2:1","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅนถ่กไธๅนถๅ ๅๆ ธ CPU ไธ๏ผ็บฟ็จๅฎ้
่ฟๆฏไธฒ่กๆง่ก็๏ผๆไฝ็ณป็ปไธญๆไธไธช็ปไปถๅซๅไปปๅก่ฐๅบฆๅจ๏ผๅฐ CPU ็ๆถ้ด็๏ผWindows ไธๆถ้ด็ๆๅฐ็บฆไธบ15ๆฏซ็ง๏ผๅ็ปไธๅ็็จๅบไฝฟ็จ๏ผๅชๆฏ็ฑไบ CPU ๅจ็บฟ็จ้ด๏ผๆถ้ด็ๅพ็ญ๏ผ็ๅๆข้ๅธธๅฟซ๏ผไบบ็ฑปๆ่งๆฏๅๆถ่ฟ่ก็ใๆป็ปไธๅฅ่ฏๅฐฑๆฏ๏ผๅพฎ่งไธฒ่ก๏ผๅฎ่งๅนถ่ก๏ผไธ่ฌไผๅฐ่ฟ็ง็บฟ็จ่ฝฎๆตไฝฟ็จ CPU ็ๅๆณ็งฐไธบๅนถๅ๏ผconcurrent CPU ๆถ้ด็1 ๆถ้ด็2 ๆถ้ด็3 ๆถ้ด็4 core ็บฟ็จ1 ็บฟ็จ2 ็บฟ็จ3 ็บฟ็จ4 ๅนถๅ ๅคๆ ธCPUไธ๏ผๆฏไธชๆ ธ๏ผcore๏ผ้ฝๅฏไปฅ่ฐๅบฆ่ฟ่ก็บฟ็จ๏ผ่ฟๆถๅ็บฟ็จๅฏไปฅๆฏๅนถ่ก็ CPU ๆถ้ด็1 ๆถ้ด็2 ๆถ้ด็3 ๆถ้ด็4 Core1 ็บฟ็จ1 ็บฟ็จ2 ็บฟ็จ3 ็บฟ็จ4 Core2 ็บฟ็จ1 ็บฟ็จ2 ็บฟ็จ3 ็บฟ็จ4 ๅนถ่ก ๅผ็จRob Pike็ไธๆฎตๆ่ฟฐ๏ผ **ๅนถๅ๏ผconcurrent๏ผ**ๆฏๅไธๆถ้ดๅบๅฏน๏ผdealing with๏ผๅคไปถไบๆ
็่ฝๅ **ๅนถ่ก๏ผparallel๏ผ**ๆฏๅไธๆถ้ดๅจๆๅ๏ผdoing๏ผๅคไปถไบๆ
็่ฝๅ ็จไพ ๅฎถๅบญไธปๅฆๅ้ฅญ๏ผๆๆซๅซ็๏ผ็ปๅญฉๅญๅๅฅถ๏ผๅฅนไธไธชไบบ่ฝฎๆตไบคๆฟๅ่ฟไนๅคไปถไบ๏ผ่ฟๆถๅฐฑๆฏๅนถๅ ๅฎถๅบญไธปๅฆ้ไฝฃไบไธชไฟๅง๏ผๅฅนไปฌไธ่ตทๅ่ฟไบไบ๏ผ่ฟๆถๆขๆๅนถๅ๏ผไนๆๅนถ่ก๏ผ่ฟๆถไผไบง็็ซไบ๏ผไพๅฆ้
ๅชๆไธๅฃ๏ผไธไธชไบบ็จ้
ๆถ๏ผๅฆไธไธชไบบๅฐฑๅพ็ญๅพ
๏ผ ้ไบไธไธชไฟๅง๏ผไธไธชไธๅ้ฅญ๏ผไธไธชไธๆๆซๅซ็๏ผไธไธชไธๅๅฅถ๏ผไบไธๆๆฐ๏ผ่ฟๆถๅฐฑๆฏๅนถ่ก Rob Pike ่ตๆ Golang่ฏญ่จ็ๅ้ ่
Rob Pike - ็พ็ง็พๅบฆ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:2:2","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅบ็จ ๅบ็จไนๅผๆญฅ่ฐ็จ ไปฅ่ฐ็จ่งๅบฆๆฅ่ฎฒ๏ผๅฆๆ ้่ฆ็ญๅพ
็ปๆ่ฟๅ๏ผๆ่ฝ็ปง็ปญ่ฟ่กๅฐฑๆฏๅๆญฅ ไธ้่ฆ็ญๅพ
็ปๆ่ฟๅ๏ผๅฐฑ่ฝ็ปง็ปญ่ฟ่กๅฐฑๆฏๅผๆญฅ ่ฎพ่ฎก ๅค็บฟ็จๅฏไปฅ่ฎฉๆนๆณๆง่กๅไธบๅผๆญฅ็๏ผๆขไธ่ฆๅทดๅทดๅนฒ็ญ็๏ผๆฏๅฆ่ฏด่ฏปๅ็ฃ็ๆไปถๆถ๏ผๅ่ฎพ่ฏปๅๆไฝ่ฏ่ดนไบ5ๅ้๏ผๅฆๆๆฒกๆ็บฟ็จ่ฐๅบฆๆบๅถ๏ผ่ฟ5็งCPUไปไน้ฝๅไธไบ๏ผๅ
ถๅฎไปฃ็ ้ฝๅพๆๅโฆ ็ป่ฎบ ๆฏๅฆๅจ้กน็ฎไธญ๏ผ่ง้ขๆไปถ้่ฆ่ฝฌๆขๆ ผๅผ็ญๆไฝๆฏ่พ่ดนๆถ๏ผ่ฟๆถๅผๅฏไธไธชๆฐ็บฟ็จๅค็่ง้ข่ฝฌๆข๏ผ้ฟๅ
้ปๅกไธป็บฟ็จ tomcat็ๅผๆญฅservletไนๆฏ็ฑปไผผ็็ฎ็๏ผ่ฎฉ็จๆท็บฟ็จๅค็่ๆถ่พ้ฟ็ๆไฝ๏ผ้ฟๅ
้ปๅกtomcat็ๅทฅไฝ็บฟ็จ UI็จๅบไธญ๏ผๅผ็บฟ็จ่ฟ่กๅ
ถไปๆไฝ๏ผ้ฟๅ
้ปๅกUI็บฟ็จ ๅบ็จไนๆ้ซๆ็ ๅ
ๅๅฉ็จๅคๆ ธCPU็ไผๅฟ๏ผๆ้ซ่ฟ่กๆ็๏ผๆณ่ฑกไธ้ข็ๅบๆฏ๏ผๆง่ก3ไธช่ฎก็ฎ๏ผๆๅๅฐ่ฎก็ฎ็ปๆๆฑๆป ่ฎก็ฎ 1 ่ฑ่ดน 10 ms ่ฎก็ฎ 2 ่ฑ่ดน 11 ms ่ฎก็ฎ 3 ่ฑ่ดน 9 ms ๆฑๆป้่ฆ 1 ms ๅฆๆๆฏไธฒ่กๆง่ก๏ผ้ฃไนๆปๅ
ฑ่ฑ่ดน็ๆถ้ดๆฏ10 + 11 + 9 + 1 = 31ms ไฝๅฆๆๆฏๅๆ ธCPU๏ผๅไธชๆ ธๅฟๅๅซไฝฟ็จ็บฟ็จ1ๆง่ก่ฎก็ฎ1๏ผ็บฟ็จ2ๆง่ก่ฎก็ฎ2๏ผ็บฟ็จ3ๆง่ก่ฎก็ฎ3๏ผ้ฃไน3ไธช็บฟ็จๆฏๅนถ่ก็๏ผ่ฑ่ดนๆถ้ดๅชๅๅณไบๆ้ฟ็้ฃไธช็บฟ็จ่ฟ่ก็ๆถ้ด๏ผๅณ11msๆๅๅ ไธๆฑๆปๆถ้ดๅชไผ่ฑ่ดน12ms ๆณจๆ ้่ฆๅจๅคๆ ธCPUๆ่ฝๆ้ซๆ็๏ผๅๆ ธไป็ถๆฏ่ฝฎๆตๆง่ก ็ป่ฎบ ๅๆ ธCPUไธ๏ผๅค็บฟ็จไธ่ฝๅฎ้
ๆ้ซ็จๅบ่ฟ่กๆ็๏ผๅชๆฏไธบไบ่ฝๅคๅจไธๅ็ไปปๅกไน้ดๅๆข๏ผไธๅ็บฟ็จ่ฝฎๆตไฝฟ็จCPU๏ผไธ่ณไบไธไธช็บฟ็จๆปๅ ็จCPU๏ผๅซ็็บฟ็จๆฒกๆณๅนฒๆดป ๅคๆ ธCPUๅฏไปฅๅนถ่ก่ทๅคไธช็บฟ็จ๏ผไฝ่ฝๅฆๆ้ซ็จๅบ่ฟ่กๆ็่ฟๆฏ่ฆๅๆ
ๅต็ ๆไบไปปๅก๏ผ็ป่ฟ็ฒพๅฟ่ฎพ่ฎก๏ผๅฐไปปๅกๆๅ๏ผๅนถ่กๆง่ก๏ผๅฝ็ถๅฏไปฅๆ้ซ็จๅบ็่ฟ่กๆ็๏ผไฝไธๆฏๆๆ่ฎก็ฎไปปๅก้ฝ่ฝๆๅ๏ผๅ่้ฟๅง่พพๅฐๅฎๅพ๏ผ ไนไธๆฏๆๆไปปๅก้ฝ้่ฆๆๅ๏ผไปปๅก็็ฎ็ๅฆๆไธๅ๏ผ่ฐๆๅๅๆ็ๆฒกๅฅๆไน IOๆไฝไธๅ ็จCPU๏ผๅชๆฏๆไปฌไธ่ฌๆท่ดๆไปถไฝฟ็จ็ๆฏ้ปๅกIO๏ผ่ฟๆถ็ธๅฝไบ็บฟ็จ่ฝ็ถไธ็จCPU๏ผไฝ้่ฆไธ็ด็ญๅพ
IO็ปๆ๏ผๆฒก่ฝๅ
ๅๅฉ็จ็บฟ็จใๆไปฅๆ็จๅ้ข็้้ปๅกIOๅๅผๆญฅIOไผๅ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:2:3","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Java็บฟ็จ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅๅปบๅ่ฟ่ก็บฟ็จ ๆนๆณไธ Thread Threadไฝฟ็จๆญฅ้ชค ๅๅปบไธไธช็ปงๆฟไบThread็ฑป็ๅญ็ฑป ้ๅThread็ฑป็run() โโ\u003e ๅฐๆญค็บฟ็จๆง่ก็ๆไฝๅฃฐๆๅจrun()ไธญ ๅๅปบThread็ฑป็ๅญ็ฑป็ๅฏน่ฑก ้่ฟๆญคๅฏน่ฑก่ฐ็จstart()ๆง่ก็บฟ็จ ๅๅปบๆจก็ // ๅๅปบ็บฟ็จๅฏน่ฑก Thread t = new Thread() { public void run() { // ่ฆๆง่ก็ไปปๅก } }; // ๅฏๅจ็บฟ็จ t.start(); ๅฎ้
ๅบ็จ็คบไพ // ๆ้ ๆนๆณ็ๅๆฐๆฏ็ป็บฟ็จๆๅฎๅๅญ๏ผๆจ่ Thread t1 = new Thread(\"t1\") { @Override // run ๆนๆณๅ
ๅฎ็ฐไบ่ฆๆง่ก็ไปปๅก public void run() { log.debug(\"hello\"); } }; t1.start(); ่พๅบ 19:19:00 [t1] c.ThreadStarter - hello ๆนๆณไบ Runable Runableไฝฟ็จๆญฅ้ชค ๅๅปบไธไธชๅฎ็ฐไบRunnableๆฅๅฃ็็ฑป ๅฎ็ฐ็ฑปๅปๅฎ็ฐRunnableไธญ็ๆฝ่ฑกๆนๆณ๏ผrun() ๅๅปบๅฎ็ฐ็ฑป็ๅฏน่ฑก ๅฐๆญคๅฏน่ฑกไฝไธบๅๆฐไผ ้ๅฐThread็ฑป็ๆ้ ๅจไธญ๏ผๅๅปบThread็ฑป็ๅฏน่ฑก ้่ฟThread็ฑป็ๅฏน่ฑก่ฐ็จstart() ๅฏๅจ็บฟ็จ ่ฐ็จๅฝๅ็บฟ็จ็run()โโ\u003e่ฐ็จไบRunnable็ฑปๅ็target็run() ๆ็บฟ็จๅไปปๅก๏ผ้่ฆๆง่ก็ไปฃ็ ๏ผๅๅผ Thread ไปฃ่กจ็บฟ็จ Runable ๅฏ่ฟ่ก็ไปปๅก๏ผ็บฟ็จ้่ฆๆง่ก็ไปฃ็ ๏ผ ๅๅปบๆจก็ Runnable runnable = new Runnable() { public void run(){ // ่ฆๆง่ก็ไปปๅก } }; // ๅๅปบ็บฟ็จๅฏน่ฑก Thread t = new Thread( runnable ); // ๅฏๅจ็บฟ็จ t.start(); ๅฎ้
ๅบ็จ็คบไพ // ๅๅปบไปปๅกๅฏน่ฑก Runnable task2 = new Runnable() { @Override public void run() { log.debug(\"hello\"); } }; // ๅๆฐ1 ๆฏไปปๅกๅฏน่ฑก; ๅๆฐ2 ๆฏ็บฟ็จๅๅญ๏ผๆจ่ Thread t2 = new Thread(task2, \"t2\"); t2.start(); ่พๅบ 19:19:00 [t2] c.ThreadStarter - hello Java 8ไปฅๅๅฏไปฅไฝฟ็จ Lambda ็ฒพ็ฎไปฃ็ // ๅๅปบไปปๅกๅฏน่ฑก Runnable task2 = () -\u003e log.debug(\"hello\"); // ๅๆฐ1 ๆฏไปปๅกๅฏน่ฑก; ๅๆฐ2 ๆฏ็บฟ็จๅๅญ๏ผๆจ่ Thread t2 = new Thread(task2, \"t2\"); t2.start(); Thread ไธ Runnable ็ๅ
ณ็ณป ๆนๆณไธๆฏๆ็บฟ็จๅไปปๅกๅๅนถๅจไบไธ่ตท๏ผๆนๆณไบๆฏๆ็บฟ็จๅไปปๅกๅๅผไบ ็จ Runable ๆดๅฎนๆไธ็บฟ็จๆฑ ็ญ้ซ็บง API ้
ๅ ็จ Runable ่ฎฉไปปๅก็ฑป่ฑ็ฆปไบ Thread ็ปงๆฟไฝ็ณป๏ผๆด็ตๆดป ๆนๆณไธ Callable FutureTaskไฝฟ็จๆญฅ้ชค ๅๅปบไธไธชๅฎ็ฐ Callable ็ๅฎ็ฐ็ฑป ๅฎ็ฐ call() ๆนๆณ๏ผๅฐๆญค็บฟ็จ้่ฆๆง่ก็ๆไฝๅฃฐๆๅจ call() ไธญ ๅๅปบ Callable ๆฅๅฃๅฎ็ฐ็ฑป็ๅฏน่ฑก ๅฐๆญค Callable ๆฅๅฃๅฎ็ฐ็ฑป็ๅฏน่ฑกไฝไธบไผ ้ๅฐ FutureTask ๆ้ ๅจไธญ๏ผๅๅปบ FutureTask ็ๅฏน่ฑก ๅฐ FutureTask ็ๅฏน่ฑกไฝไธบๅๆฐไผ ้ๅฐ Thread ็ฑป็ๆ้ ๅจไธญ๏ผๅๅปบ Thread ๅฏน่ฑก๏ผๅนถ่ฐ็จ start() ่ทๅ Callable ไธญ call() ๆนๆณ็่ฟๅๅผ ๅฎ็ฐCallableๆฅๅฃ็ๆนๅผๅๅปบ็บฟ็จ็ๅผบๅคงไนๅค call() ๅฏไปฅๆ่ฟๅๅผ็ call() ๅฏไปฅๆๅบๅผๅธธ๏ผ่ขซๅค้ข็ๆไฝๆ่ท๏ผ่ทๅๅผๅธธ็ไฟกๆฏ Callable ๆฏๆฏๆๆณๅ็ ๅฎ้
ๅบ็จ็คบไพ // ๅๅปบไปปๅกๅฏน่ฑก FutureTask\u003cInteger\u003e task3 = new FutureTask\u003c\u003e(() -\u003e { log.debug(\"hello\"); return 100; }); // ๅๆฐ1 ๆฏไปปๅกๅฏน่ฑก; ๅๆฐ2 ๆฏ็บฟ็จๅๅญ๏ผๆจ่ new Thread(task3, \"t3\").start(); // ไธป็บฟ็จ้ปๅก๏ผๅๆญฅ็ญๅพ
task ๆง่กๅฎๆฏ็็ปๆ Integer result = task3.get(); log.debug(\"็ปๆๆฏ:{}\", result); ่พๅบ 19:22:27 [t3] c.ThreadStarter - hello 19:22:27 [main] c.ThreadStarter - ็ปๆๆฏ:100 ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:1","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"่งๅฏๅคไธช็บฟ็จๅๆถ่ฟ่ก ่งๅพ ไบคๆฟๆง่ก ่ฐๅ
่ฐๅ๏ผไธ็ฑๆไปฌๆงๅถ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:2","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๆฅ็่ฟ็จ็บฟ็จ่ฟ่ก็ๆนๆณ Windows ไปปๅก็ฎก็ๅจๅฏไปฅๆฅ็่ฟ็จๅ็บฟ็จๆฐ๏ผไนๅฏไปฅ็จๆฅๆๆญป่ฟ็จ tasklist ๆฅ็่ฟ็จ taskkill ๆๆญป่ฟ็จ Linux ps -ef ๆฅ็ๆๆ่ฟ็จ ps -fT -p\u003cPID\u003e ๆฅ็ๆไธช่ฟ็จ๏ผPID๏ผ็ๆๆ็บฟ็จ kill ๆๆญป่ฟ็จ top ๆๅคงๅHๅๆขๆฏๅฆๆพ็คบ็บฟ็จ top -H -p\u003cPID\u003e ๆฅ็ๆไธช่ฟ็จ๏ผPID๏ผ็ๆๆ็บฟ็จ Java jps ๆฅ็ๆๆJava่ฟ็จ jstack \u003cPID\u003e ๆฅ็ๆไธชJava่ฟ็จ๏ผPID๏ผ็ๆๆ็บฟ็จ็ถๆ jconsole ๆฅๆฅ็ๆไธชJava่ฟ็จไธญ็บฟ็จ็่ฟ่ก็ถๆ๏ผๅพๅฝข็้ข๏ผ jconsole ่ฟ็จ็ๆง้
็ฝฎ ้่ฆไปฅๅฆไธๆนๅผ่ฟ่กJava็ฑป java -Djava.rmi.server.hostname=`ipๅฐๅ` -Dcom.sun.management.jmxremote Dcom.sun.management.jmxremote.port=`่ฟๆฅ็ซฏๅฃ` -Dcom.sun.management.jmxremote.ssl=ๆฏๅฆๅฎๅ
จ่ฟๆฅ Dcom.sun.management.jmxremote.authenticate=ๆฏๅฆ่ฎค่ฏ java็ฑป ไฟฎๆน /etc/hosts ๆไปถๅฐ 127.0.0.1 ๆ ๅฐ่ณไธปๆบๅ ๅฆๆ่ฆ่ฎค่ฏ่ฎฟ้ฎ๏ผ่ฟ้่ฆๅๅฆไธๆญฅ้ชค ๅคๅถ jmxremote.password ๆไปถ ไฟฎๆน jmxremote.password ๅ jmxremote.access ๆไปถ็ๆ้ไธบ600ๅณๆไปถๆๆ่
ๅฏ่ฏปๅ ่ฟๆฅๆถๅกซๅ
ฅ controlRole๏ผ็จๆทๅ๏ผ๏ผR\u0026D๏ผๅฏ็ ๏ผ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:3","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"็บฟ็จ่ฟ่กๅ็ ๆ ไธๆ ๅธง Java Virtual Machine Stacks๏ผJava่ๆๆบๆ ๏ผ ๆไปฌ้ฝ็ฅ้jVMไธญ็ฑๅ ใๆ ใๆนๆณๅบๆ็ปๆ๏ผๅ
ถไธญๆ ๅ
ๅญๆฏ็ป่ฐ็จ็ๅข๏ผๅ
ถๅฎๅฐฑๆฏ็บฟ็จ๏ผๆฏไธช็บฟ็จๅฏๅจๅ๏ผ่ๆๆบๅฐฑไผไธบๅ
ถๅ้
ไธๅๆ ๅ
ๅญ ๆฏไธชๆ ็ฑๅคไธชๆ ๅธง๏ผFrame๏ผ็ปๆ๏ผๅฏนๅบ็ๆฏๆฌกๆนๆณ่ฐ็จๆถๆๅ ็จ็ๅ
ๅญ ๆฏไธช็บฟ็จๅช่ฝๆไธไธชๆดปๅจๆ ๅธง๏ผๅฏนๅบ็ๅฝๅๆญฃๅจๆง่ก็้ฃไธชๆนๆณ ็บฟ็จไธไธๆๅๆข๏ผThread Context Switch๏ผ ๅ ไธบไปฅไธไธไบๅๅ ๅฏผ่ดCPUไธๅๆง่กๅฝๅ็็บฟ็จ๏ผ่ฝฌ่ๆง่กๅฆไธไธช็บฟ็จ็ไปฃ็ ็บฟ็จ็CPUๆถ้ด็็จๅฎ ๅๅพๅๆถ ๆๆด้ซไผๅ
็บง็็บฟ็จ้่ฆ่ฟ่ก ็บฟ็จ่ชๅทฑ่ฐ็จไบ sleepใyieldใwaitใjoinใparkใsynchronizedใlock ็ญๆนๆณ ๅฝ Context Switch ๅ็ๆถ๏ผ้่ฆ็ฑๆไฝ็ณป็ปไฟๅญๅฝๅ็บฟ็จ็็ถๆ๏ผๅนถๆขๅคๅฆไธไธช็บฟ็จ็็ถๆ๏ผJavaไธญๅฏนๅบ็ๆฆๅฟตๅฐฑๆฏ็จๅบ่ฎกๆฐๅจ๏ผProgram Counter Register๏ผ๏ผๅฎ็ไฝ็จๆฏ่ฎฐไฝไธไธๆก JVM ๆไปค็ๆง่กๅฐๅ๏ผๆฏ็บฟ็จ็งๆ็ ็ถๆๅ
ๆฌ็จๅบ่ฎกๆฐๅจใ่ๆๆบๆ ไธญๆฏไธชๆ ๅธง็ไฟกๆฏ๏ผๅฆๅฑ้จๅ้ใๆไฝๆฐๆ ใๆพๅๅฐๅ็ญ Context Switch ้ข็นๅ็ไผๅฝฑๅๆง่ฝ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:4","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"็บฟ็จๅธธ่งๆนๆณ ๆนๆณๅ static ๅ่ฝ่ฏดๆ ๆณจๆ start() ๅฏๅจไธไธชๆฐ็บฟ ็จ๏ผๅจๆฐ็็บฟ็จ ่ฟ่ก run ๆนๆณ ไธญ็ไปฃ็ start ๆนๆณๅชๆฏ่ฎฉ็บฟ็จ่ฟๅ
ฅๅฐฑ็ปช๏ผ้้ขไปฃ็ ไธไธๅฎ็ซๅป ่ฟ่ก๏ผCPU ็ๆถ้ด็่ฟๆฒกๅ็ปๅฎ๏ผใๆฏไธช็บฟ็จๅฏน่ฑก็ startๆนๆณๅช่ฝ่ฐ็จไธๆฌก๏ผๅฆๆ่ฐ็จไบๅคๆฌกไผๅบ็ฐ IllegalThreadStateException run() ๆฐ็บฟ็จๅฏๅจๅไผ ่ฐ็จ็ๆนๆณ ๅฆๆๅจๆ้ Thread ๅฏน่ฑกๆถไผ ้ไบ Runnable ๅๆฐ๏ผๅ ็บฟ็จๅฏๅจๅไผ่ฐ็จ Runnable ไธญ็ run ๆนๆณ๏ผๅฆๅ้ป ่ฎคไธๆง่กไปปไฝๆไฝใไฝๅฏไปฅๅๅปบ Thread ็ๅญ็ฑปๅฏน่ฑก๏ผ ๆฅ่ฆ็้ป่ฎค่กไธบ join() ็ญๅพ
็บฟ็จ่ฟ่ก็ป ๆ join(long n) ็ญๅพ
็บฟ็จ่ฟ่ก็ป ๆ,ๆๅค็ญๅพ
n ๆฏซ็ง getId() ่ทๅ็บฟ็จ้ฟๆดๅ ็ id id ๅฏไธ getName() ่ทๅ็บฟ็จๅ setName(String) ไฟฎๆน็บฟ็จๅ getPriority() ่ทๅ็บฟ็จไผๅ
็บง setPriority(int) ไฟฎๆน็บฟ็จไผๅ
็บง javaไธญ่งๅฎ็บฟ็จไผๅ
็บงๆฏ1~10 ็ๆดๆฐ๏ผ่พๅคง็ไผๅ
็บง ่ฝๆ้ซ่ฏฅ็บฟ็จ่ขซ CPU ่ฐๅบฆ็ๆบ็ getState() ่ทๅ็บฟ็จ็ถๆ Java ไธญ็บฟ็จ็ถๆๆฏ็จ 6 ไธช enum ่กจ็คบ๏ผๅๅซไธบ๏ผ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED isInterrupted() ๅคๆญๆฏๅฆ่ขซๆ ๆญ๏ผ ไธไผๆธ
้คๆๆญๆ ่ฎฐ isAlive() ็บฟ็จๆฏๅฆๅญๆดป ๏ผ่ฟๆฒกๆ่ฟ่กๅฎ ๆฏ๏ผ interrupt() ๆๆญ็บฟ็จ ๅฆๆ่ขซๆๆญ็บฟ็จๆญฃๅจ sleep๏ผwait๏ผjoin ไผๅฏผ่ด่ขซๆๆญ ็็บฟ็จๆๅบ InterruptedException๏ผๅนถๆธ
้ค ๆๆญๆ ่ฎฐ ๏ผๅฆๆๆๆญ็ๆญฃๅจ่ฟ่ก็็บฟ็จ๏ผๅไผ่ฎพ็ฝฎ ๆๆญๆ ่ฎฐ ๏ผpark ็็บฟ็จ่ขซๆๆญ๏ผไนไผ่ฎพ็ฝฎ ๆๆญๆ ่ฎฐ interrupted() static ๅคๆญๅฝๅ็บฟ็จๆฏ ๅฆ่ขซๆๆญ ไผๆธ
้คๆๆญๆ ่ฎฐ currentThread() static ่ทๅๅฝๅๆญฃๅจๆง ่ก็็บฟ็จ sleep(long n) static ่ฎฉๅฝๅๆง่ก็็บฟ ็จไผ็ nๆฏซ็ง๏ผ ไผ็ ๆถ่ฎฉๅบ cpu ็ๆถ้ด็็ปๅ
ถๅฎ ็บฟ็จ yield() static ๆ็คบ็บฟ็จ่ฐๅบฆๅจ ่ฎฉๅบๅฝๅ็บฟ็จๅฏน CPU็ไฝฟ็จ ไธป่ฆๆฏไธบไบๆต่ฏๅ่ฐ่ฏ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:5","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"start ไธ run ่ฐ็จ run() public static void main(String[] args) { Thread t1 = new Thread(\"t1\") { @Override public void run() { log.debug(Thread.currentThread().getName()); FileReader.read(Constants.MP4_FULL_PATH); } }; t1.run(); log.debug(\"do other things ...\"); } ่พๅบ 19:39:14 [main] c.TestStart - main 19:39:14 [main] c.FileReader - read [1.mp4] start ... 19:39:18 [main] c.FileReader - read [1.mp4] end ... cost: 4227 ms 19:39:18 [main] c.TestStart - do other things ... ็จๅบไปๅจmain็บฟ็จ่ฟ่ก๏ผFileReader.read()ๆนๆณ่ฐ็จ่ฟๆฏๅๆญฅ็ ่ฐ็จ start() ๅฐไธ่ฟฐไปฃ็ ็t1.run()ๆนไธบ t1.start(); ่พๅบ 19:41:30 [main] c.TestStart - do other things ... 19:41:30 [t1] c.TestStart - t1 19:41:30 [t1] c.FileReader - read [1.mp4] start ... 19:41:35 [t1] c.FileReader - read [1.mp4] end ... cost: 4542 ms ็จๅบๅจt1็บฟ็จไธญ่ฟ่ก๏ผFileReader.read()ๆนๆณ่ฐ็จๆฏๅผๆญฅ็ ๅฐ็ป ็ดๆฅ่ฐ็จ run() ๆฏๅจไธป็บฟ็จไธญๆง่กไบrunๆนๆณไธญๅ
ๅฎน๏ผๆฒกๆ็ๆญฃๅฏๅจๆฐ็็บฟ็จ ไฝฟ็จ start() ๆฏๅฏๅจๆฐ็็บฟ็จ๏ผ้่ฟๆฐ็็บฟ็จ้ดๆฅๆง่กไบrunๆนๆณไธญ็ไปฃ็ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:6","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"sleep ไธ yield sleep ่ฐ็จ sleep ไผ่ฎฉๅฝๅ็บฟ็จไป Running ่ฟๅ
ฅ Timed Waiting ็ถๆ๏ผ้ปๅก๏ผ ๅ
ถไป็บฟ็จๅฏไปฅไฝฟ็จ interrupt ๆนๆณๆๆญๆญฃๅจ็ก็ ็็บฟ็จ๏ผ่ฟๆถ sleep ๆนๆณไผ่ทๅบ InterruptedException ็ก็ ็ปๆๅ็็บฟ็จๆชๅฟ
ไผ็ซๅปๅพๅฐๆง่ก ๅปบ่ฎฎไฝฟ็จ TimeUnit ็ sleep ไปฃๆฟ Thread ็ sleep ๆฅ่ทๅพๆดๅฅฝ็ๅฏ่ฏปๆง yield ่ฐ็จ yield ไผ่ฎฉๅฝๅ็บฟ็จไป Running ่ฟๅ
ฅ Runnable ๅฐฑ็ปช็ถๆ๏ผ็ถๅ่ฐๅบฆๆง่กๅ
ถไป็บฟ็จ ๅ
ทไฝ็ๅฎ็ฐไพ่ตไบๆไฝ็ณป็ป็ไปปๅก่ฐๅบฆๅจ ็บฟ็จไผๅ
็บง ็บฟ็จไผๅ
็บงไผๆ็คบ๏ผhint๏ผ่ฐๅบฆๅจไผๅ
่ฐๅบฆ่ฏฅ็บฟ็จ๏ผไฝๅฎไป
ไป
ๆฏไธไธชๆ็คบ๏ผ่ฐๅบฆๅจๅฏไปฅๅฟฝ็ฅๅฎ ๅฆๆ CPU ๆฏ่พๅฟ๏ผ้ฃไนไผๅ
็บง้ซ็็บฟ็จไผ่ทๅพๆดๅค็ๆถ้ด็๏ผไฝ CPU ็ฉบ้ฒๆถ๏ผไผๅ
็บงๅ ไนๆฒกๆไฝ็จ Runnable task1 = () -\u003e { int count = 0; for (;;) { System.out.println(\"----\u003e1 \" + count++); } }; Runnable task2 = () -\u003e { int count = 0; for (;;) { // Thread.yield(); System.out.println(\"----\u003e2 \" + count++); } }; Thread t1 = new Thread(task1, \"t1\"); Thread t2 = new Thread(task2, \"t2\"); // t1.setPriority(Thread.MIN_PRIORITY); // t2.setPriority(Thread.MAX_PRIORITY); t1.start(); t2.start(); ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:7","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"joinๆนๆณ่ฏฆ่งฃ ไธบไปไน้่ฆjoin ๆง่กไธ้ขไปฃ็ ๏ผๆๅฐrๆฏไปไน๏ผ static int r = 0; public static void main(String[] args) throws InterruptedException { test1(); } private static void test1() throws InterruptedException { log.debug(\"ๅผๅง\"); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅผๅง\"); sleep(1); log.debug(\"็ปๆ\"); r = 10; }); t1.start(); log.debug(\"็ปๆไธบ:{}\", r); log.debug(\"็ปๆ\"); } ๅๆ ๅ ไธบไธป็บฟ็จๅ็บฟ็จt1ๆฏๅนถ่กๆง่ก็๏ผt1็บฟ็จ้่ฆ1็งไนๅๆ่ฝ็ฎๅบr=10 ่ไธป็บฟ็จไธๅผๅงๅฐฑ่ฆๆๅฐr็็ปๆ๏ผๆไปฅๅช่ฝๆๅฐๅบr=0 ่งฃๅณๅๆณ ไฝฟ็จ sleep ่กไธ่ก๏ผไธบไปไน๏ผ ็จ join๏ผๅ ๅจt1.start()ไนๅๅณๅฏ ๅๆญฅๅบ็จๆกไพ ไปฅ่ฐ็จๆน่งๅบฆๆฅ่ฎฒ๏ผๅฆๆ ้่ฆ็ญๅพ
็ปๆ่ฟๅ๏ผๆ่ฝ็ปง็ปญ่ฟ่กๅฐฑๆฏๅๆญฅ ไธ้่ฆ็ญๅพ
็ปๆ่ฟๅ๏ผๅฐฑ่ฝ็ปง็ปญ่ฟ่กๅฐฑๆฏๅผๆญฅ ๅๆญฅ ็ญๅพ
ๅคไธช็ปๆ ้ฎ๏ผไธ้ขไปฃ็ cost ๅคง็บฆๅคๅฐ็ง๏ผ static int r1 = 0; static int r2 = 0; public static void main(String[] args) throws InterruptedException { test2(); } private static void test2() throws InterruptedException { Thread t1 = new Thread(() -\u003e { sleep(1); r1 = 10; }); Thread t2 = new Thread(() -\u003e { sleep(2); r2 = 20; }); long start = System.currentTimeMillis(); t1.start(); t2.start(); t1.join(); t2.join(); long end = System.currentTimeMillis(); log.debug(\"r1: {} r2: {} cost: {}\", r1, r2, end - start); } ๅๆๅฆไธ ็ฌฌไธไธช join๏ผ็ญๅพ
t1ๆถ๏ผt2ๅนถๆฒกๆๅๆญข๏ผ่ๅจ่ฟ่ก ็ฌฌไบไธช join๏ผ1sๅ๏ผๆง่กๅฐๆญค๏ผt2ไน่ฟ่กไบ1s๏ผๅ ๆญคไนๅช้ๅ็ญๅพ
1s ๅฆๆ้ข ๅไธคไธช join ๅข๏ผ 20:45:43.239 [main] c.TestJoin - r1: 10 r2: 20 cost: 2005 ๅผๆญฅ ๆๆถๆ็join ็ญๅพ
ๆถ้ด static int r1 = 0; static int r2 = 0; public static void main(String[] args) throws InterruptedException { test3(); } public static void test3() throws InterruptedException { Thread t1 = new Thread(() -\u003e { sleep(1); r1 = 10; }); long start = System.currentTimeMillis(); t1.start(); // ็บฟ็จๆง่ก็ปๆไผๅฏผ่ด join ็ปๆ t1.join(1500); long end = System.currentTimeMillis(); log.debug(\"r1: {} r2: {} cost: {}\", r1, r2, end - start); } ่พๅบ 20:48:01.320 [main] c.TestJoin - r1: 10 r2: 0 cost: 1010 ๆฒก็ญๅคๆถ้ด static int r1 = 0; static int r2 = 0; public static void main(String[] args) throws InterruptedException { test3(); } public static void test3() throws InterruptedException { Thread t1 = new Thread(() -\u003e { sleep(2); r1 = 10; }); long start = System.currentTimeMillis(); t1.start(); // ็บฟ็จๆง่ก็ปๆไผๅฏผ่ด join ็ปๆ t1.join(1500); long end = System.currentTimeMillis(); log.debug(\"r1: {} r2: {} cost: {}\", r1, r2, end - start); } ่พๅบ 20:52:15.623 [main] c.TestJoin - r1: 0 r2: 0 cost: 1502 ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:8","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"interruptๆนๆณ่ฏฆ่งฃ ๆๆญ sleep๏ผwait๏ผjoin ็็บฟ็จ **sleep๏ผwait๏ผjoin **่ฟไบๆนๆณ้ฝไผ่ฎฉ็บฟ็จ่ฟๅ
ฅ้ปๅก็ถๆ ๆๆญ sleep ็็บฟ็จ๏ผไผๆธ
็ฉบๆๆญ็ถๆ๏ผไปฅsleepไธบไพ private static void test1() throws InterruptedException { Thread t1 = new Thread(()-\u003e{ sleep(1); }, \"t1\"); t1.start(); sleep(0.5); t1.interrupt(); log.debug(\" ๆๆญ็ถๆ: {}\",t1.isInterrupted()); } ่พๅบ java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at cn.itcast.n2.util.Sleeper.sleep(Sleeper.java:8) at cn.itcast.n4.TestInterrupt.lambda$test1$3(TestInterrupt.java:59) at java.lang.Thread.run(Thread.java:745) 21:18:10.374 [main] c.TestInterrupt - ๆๆญ็ถๆ: false ๆๆญๆญฃๅธธ่ฟ่ก็็บฟ็จ ๆๆญๆญฃๅธธ่ฟ่ก็็บฟ็จ๏ผไธไผๆธ
็ฉบๆๆญ็ถๆ private static void test2() throws InterruptedException { Thread t2 = new Thread(()-\u003e{ while(true) { Thread current = Thread.currentThread(); boolean interrupted = current.isInterrupted(); if(interrupted) { log.debug(\" ๆๆญ็ถๆ: {}\", interrupted); break; } } }, \"t2\"); t2.start(); sleep(0.5); t2.interrupt(); } ่พๅบ 20:57:37.964 [t2] c.TestInterrupt - ๆๆญ็ถๆ: true ๆๆญ park ็บฟ็จ ๆๆญ park ็บฟ็จ๏ผไธไผๆธ
็ฉบๆๆญ็ถๆ private static void test3() throws InterruptedException { Thread t1 = new Thread(() -\u003e { log.debug(\"park...\"); LockSupport.park(); log.debug(\"unpark...\"); log.debug(\"ๆๆญ็ถๆ๏ผ{}\",Thread.currentThread().isInterrupted()); }, \"t1\"); t1.start(); sleep(0.5); t1.interrupt(); } ่พๅบ 21:11:52.795 [t1] c.TestInterrupt - park... 21:11:53.295 [t1] c.TestInterrupt - unpark... 21:11:53.295 [t1] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue ๅฆๆๆๆญๆ ่ฎฐๅทฒ็ปๆฏ true๏ผๅ park ไผๅคฑๆ private static void test4() { Thread t1 = new Thread(() -\u003e { for (int i = 0; i \u003c 5; i++) { log.debug(\"park...\"); LockSupport.park(); log.debug(\"ๆๆญ็ถๆ๏ผ{}\", Thread.currentThread().isInterrupted()); } }); t1.start(); sleep(1); t1.interrupt(); } ่พๅบ 21:13:48.783 [Thread-0] c.TestInterrupt - park... 21:13:49.809 [Thread-0] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue 21:13:49.812 [Thread-0] c.TestInterrupt - park... 21:13:49.813 [Thread-0] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue 21:13:49.813 [Thread-0] c.TestInterrupt - park... 21:13:49.813 [Thread-0] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue 21:13:49.813 [Thread-0] c.TestInterrupt - park... 21:13:49.813 [Thread-0] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue 21:13:49.813 [Thread-0] c.TestInterrupt - park... 21:13:49.813 [Thread-0] c.TestInterrupt - ๆๆญ็ถๆ๏ผtrue ๆ็คบ ๅฏไปฅไฝฟ็จThread.interrupted() ๆธ
้คๆๆญ็ถๆ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:9","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ไธๆจ่็ๆนๆณ ่ฟๆไธไบไธๆจ่ไฝฟ็จ็ๆนๆณ๏ผ่ฟไบๆนๆณๅทฒ่ฟๆถ๏ผๅฎนๆ็ ดๅๅๆญฅไปฃ็ ๅ๏ผ้ ๆ็บฟ็จๆญป้ ๆนๆณๅ static ๅ่ฝ่ฏดๆ stop() ๅๆญข็บฟ็จ่ฟ่ก suspend() ๆ่ตท๏ผๆๅ๏ผ็บฟ็จ่ฟ่ก resume() ๆขๅค็บฟ็จ่ฟ่ก ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:10","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ไธป็บฟ็จไธๅฎๆค็บฟ็จ ้ป่ฎคๆ
ๅตไธ๏ผJava ่ฟ็จ้่ฆ็ญๅพ
ๆๆ็บฟ็จ้ฝ่ฟ่ก็ปๆ๏ผๆไผ็ปๆใๆไธ็ง็นๆฎ็็บฟ็จๅซๅๅฎๆค็บฟ็จ๏ผๅช่ฆๅ
ถไป้ๅฎๆค็บฟ็จ่ฟ่ก็ปๆไบ๏ผๅณไฝฟๅฎๆค็บฟ็จ็ไปฃ็ ๆฒกๆๆง่กๅฎ๏ผไนไผๅผบๅถ็ปๆใ ๅบ็จ็คบไพ log.debug(\"ๅผๅง่ฟ่ก...\"); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅผๅง่ฟ่ก...\"); sleep(2); log.debug(\"่ฟ่ก็ปๆ...\"); }, \"daemon\"); // ่ฎพ็ฝฎ่ฏฅ็บฟ็จไธบๅฎๆค็บฟ็จ t1.setDaemon(true); t1.start(); sleep(1); log.debug(\"่ฟ่ก็ปๆ...\"); ่พๅบ 08:26:38.123 [main] c.TestDaemon - ๅผๅง่ฟ่ก... 08:26:38.213 [daemon] c.TestDaemon - ๅผๅง่ฟ่ก... 08:26:39.215 [main] c.TestDaemon - ่ฟ่ก็ปๆ... ๆณจๆ ๅๅพๅๆถๅจ็บฟ็จๅฐฑๆฏไธ็งๅฎๆค็บฟ็จ Tomcat ไธญ็ Acceptor ๅ Poller ็บฟ็จ้ฝๆฏๅฎๆค็บฟ็จ๏ผๆไปฅ Tomcat ๆฅๆถๅฐ shutdown ๅฝไปคๅ๏ผไธไผ็ญๅพ
ๅฎไปฌๅค็ๅฎๅฝๅ่ฏทๆฑ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:11","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ไบ็ง็ถๆ ่ฟๆฏไป ๆไฝ็ณป็ป ๅฑ้ขๆฅๅๅๆ่ฟฐ็ ็บฟ็จไบ็ง็ถๆ ใๅๅง็ถๆใไป
ๆฏๅจ่ฏญ่จๅฑ้ขๅๅปบไบ็บฟ็จๅฏน่ฑก๏ผ่ฟๆชไธๆไฝ็ณป็ป็บฟ็จๅ
ณ่ ใๅฏ่ฟ่ก็ถๆใ๏ผๅฐฑ็ปช็ถๆ๏ผๆ่ฏฅ็บฟ็จๅทฒ็ป่ขซๅๅปบ๏ผไธๆไฝ็ณป็ป็บฟ็จๅ
ณ่๏ผ๏ผๅฏไปฅ็ฑ CPU ่ฐๅบฆๆง่ก ใ่ฟ่ก็ถๆใๆ่ทๅไบ CPU ๆถ้ด็่ฟ่กไธญ็็ถๆ ๅฝ CPU ๆถ้ด็็จๅฎ๏ผไผไปใ่ฟ่ก็ถๆใ่ฝฌๆข่ณใๅฏ่ฟ่ก็ถๆใ๏ผไผๅฏผ่ด็บฟ็จ็ไธไธๆๅๆข ใ้ปๅก็ถๆใ ๅฆๆ่ฐ็จไบ้ปๅก API๏ผๅฆ BIO ่ฏปๅๆไปถ๏ผ่ฟๆถ่ฏฅ็บฟ็จๅฎ้
ไธไผ็จๅฐ CPU๏ผไผๅฏผ่ด็บฟ็จไธไธๆๅๆข๏ผ่ฟๅ
ฅ ใ้ปๅก็ถๆใ ็ญ BIO ๆไฝๅฎๆฏ๏ผไผ็ฑๆไฝ็ณป็ปๅค้้ปๅก็็บฟ็จ๏ผ่ฝฌๆข่ณใๅฏ่ฟ่ก็ถๆใ ไธใๅฏ่ฟ่ก็ถๆใ็ๅบๅซๆฏ๏ผๅฏนใ้ปๅก็ถๆใ็็บฟ็จๆฅ่ฏดๅช่ฆๅฎไปฌไธ็ดไธๅค้๏ผ่ฐๅบฆๅจๅฐฑไธ็ดไธไผ่่ ่ฐๅบฆๅฎไปฌ ใ็ปๆญข็ถๆใ่กจ็คบ็บฟ็จๅทฒ็ปๆง่กๅฎๆฏ๏ผ็ๅฝๅจๆๅทฒ็ป็ปๆ๏ผไธไผๅ่ฝฌๆขไธบๅ
ถๅฎ็ถๆ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:12","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅ
ญ็ง็ถๆ ่ฟๆถไป Java API ๅฑ้ขๆฅๆ่ฟฐ็ ๆ นๆฎ Thread.State ๆไธพ๏ผๅไธบๅ
ญ็ง็ถๆ ็บฟ็จๅ
ญ็ง็ถๆ NEW ็บฟ็จๅ่ขซๅๅปบ๏ผไฝๆฏ่ฟๆฒกๆ่ฐ็จ RUNNABLE ๅฝ่ฐ็จไบ start() ๆนๆณ ๆนๆณไนๅ๏ผๆณจๆ๏ผJava API ๅฑ้ข็ RUNNABLE ็ถๆๆถต็ไบ ๆไฝ็ณป็ป ๅฑ้ข็ใๅฏ่ฟ่ก็ถๆใใใ่ฟ่ก็ถๆใๅใ้ปๅก็ถๆใ๏ผ็ฑไบ BIO ๅฏผ่ด็็บฟ็จ้ปๅก๏ผๅจ Java ้ๆ ๆณๅบๅ๏ผไป็ถ่ฎคไธบ ๆฏๅฏ่ฟ่ก๏ผ BLOCKED ๏ผ WAITING ๏ผ TIMED_WAITING ้ฝๆฏ Java API ๅฑ้ขๅฏนใ้ปๅก็ถๆใ็็ป TERMINATED ๅฝ็บฟ็จไปฃ็ ่ฟ่ก็ปๆ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:3:13","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅ
ฑไบซๆจกๅ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Javaไฝ็ฐ ไธคไธช็บฟ็จๅฏนๅๅงๅผไธบ0็้ๆๅ้ไธไธชๅ่ชๅข๏ผไธไธชๅ่ชๅ๏ผๅๅ5000ๆฌก๏ผ็ปๆๆฏ0ๅ๏ผ static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -\u003e { for (int i = 0; i \u003c 5000; i++) { counter++; } }, \"t1\"); Thread t2 = new Thread(() -\u003e { for (int i = 0; i \u003c 5000; i++) { counter--; } }, \"t2\"); t1.start(); t2.start(); t1.join(); t2.join(); log.debug(\"{}\",counter); } ้ฎ้ขๅๆ ไปฅไธ็็ปๆๅฏ่ฝๆฏๆญฃๆฐใ่ดๆฐใ้ถใไธบไปไนๅข๏ผๅ ไธบJavaไธญๅฏน้ๆๅ้็่ชๅข๏ผ่ชๅๅนถไธๆฏๅๅญๆไฝ๏ผ่ฆๅฝปๅบ็่งฃ๏ผๅฟ
้กปไปๅญ่็ ่งๅบฆๆฅ่ฟ่กๅๆ ไพๅฆๅฏนไบ i++ ่่จ๏ผiไธบ้ๆๅ้๏ผ๏ผๅฎ้
ไผไบง็ๅฆไธ็JVMๅญ่็ ๆไปค๏ผ getstatic i // ่ทๅ้ๆๅ้i็ๅผ iconst_1 // ๅๅคๅธธ้1 iadd // ่ชๅข putstatic i // ๅฐไฟฎๆนๅ็ๅผๅญๅ
ฅ้ๆๅ้i ่ๅฏนๅบ i-- ไนๆฏ็ฑปไผผ๏ผ getstatic i // ่ทๅ้ๆๅ้ i ็ๅผ iconst_1 // ๅๅคๅธธ้1 isub // ่ชๅ putstatic i // ๅฐไฟฎๆนๅ็ๅผๅญๅ
ฅ้ๆๅ้ i ่Java็ๅ
ๅญๆจกๅๅฆไธ๏ผๅฎๆ้ๆๅ้็่ชๅข๏ผ่ชๅ้่ฆๅจไธปๅญๅๅทฅไฝๅ
ๅญไธญ่ฟ่กๆฐๆฎไบคๆข Javaๅ
ๅญๆจกๅ ๅฆๆๆฏๅ็บฟ็จไปฅไธ8่กไปฃ็ ๆฏ้กบๅบๆง่ก๏ผไธไผไบค้๏ผๆฒกๆ้ฎ้ข๏ผ ๅ็บฟ็จไธ่ฟ่ก ไฝๅค็บฟ็จไธ่ฟ8่กไปฃ็ ๅฏ่ฝไบค้่ฟ่ก๏ผ ๅบ็ฐ่ดๆฐ็ๆ
ๅต๏ผ ๅค็บฟ็จไธ่ฟ่กไธๅบ็ฐ่ดๆฐๆ
ๅต ๅบ็ฐๆญฃๆฐ็ๆ
ๅต๏ผ ๅค็บฟ็จไธ่ฟ่กๅบ็ฐๆญฃๆฐๆ
ๅต ไธด็ๅบCritical Section ไธไธช็จๅบ่ฟ่กๅคไธช็บฟ็จๆฌ่บซๆฏๆฒกๆ้ฎ้ข็ ้ฎ้ขๅบๅจๅค็บฟ็จ่ฎฟ้ฎๅ
ฑไบซ่ตๆบ ๅคไธช็บฟ็จ่ฏปๅ
ฑไบซ่ตๆบๅ
ถๅฎไนๆฒกๆ้ฎ้ข ๅจๅคไธช็บฟ็จๅฏนๅ
ฑไบซ่ตๆบ่ฏปๅๆไฝๆถๅ็ๆไปคไบค้๏ผๅฐฑไผๅบ็ฐ้ฎ้ข ไธๆฎตไปฃ็ ๅๅฆๆๅญๅจๅฏนๅ
ฑไบซ่ตๆบ็ๅค็บฟ็จ่ฏปๅๆไฝ๏ผ็งฐ่ฟๆฎตไปฃ็ ๅไธบไธด็ๅบ ไพๅฆ๏ผไธ้ขไปฃ็ ไธญ็ไธด็ๅบ static int counter = 0; static void increment() // ไธด็ๅบ { counter++; } static void decrement() // ไธด็ๅบ { counter--; } ็ซๆๆกไปถRace Condition ๅคไธช็บฟ็จๅจไธด็ๅบๅ
ๆง่ก๏ผ็ฑไบไปฃ็ ็ๆง่กๅบๅไธๅ่ๅฏผ่ด็ปๆๆ ๆณ้ขๆต๏ผ็งฐไนไธบๅ็ไบ็ซๆๆกไปถ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:1","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Synchronized ไธบไบ้ฟๅ
ไธด็ๅบ็็ซๆๆกไปถๅ็๏ผ็ฑๅค็งๆๆฎตๅฏไปฅ่พพๅฐ็ฎ็ ้ปๅกๅผ็่งฃๅณๆนๆก๏ผSynchronized๏ผLock ้้ปๅกๅผ็่งฃๅณๆนๆก๏ผๅๅญๅ้ ๆฌๆฌกไฝฟ็จ้ปๅกๅผ็่งฃๅณๆนๆก๏ผSynchronized๏ผๆฅ่งฃๅณไธ่ฟฐ้ฎ้ข๏ผๅณไฟ็งฐ็ ๅฏน่ฑก้ ๏ผๅฎ้็จไบๆฅ็ๆนๅผ่ฎฉๅไธๆถๅป่ณๅคๅชๆไธไธช็บฟ็จ่ฝๆๆ ๅฏน่ฑก้ ๏ผๅ
ถไป็บฟ็จๅๆณ่ทๅ่ฟไธช ๅฏน่ฑก้ ๆถๅฐฑไผ่ขซ้ปๅกไฝ๏ผ่ฟๆ ทๅฐฑ่ฝไฟ่ฏๆฅๆ้็็บฟ็จๅฏไปฅๅฎๅ
จ็ๆง่กไธด็ๅบ็ไปฃ็ ๏ผไธ็จๆ
ๅฟ็บฟ็จไธไธๆๅๆข ๆณจๆ ่ฝ็ถJavaไธญไบๆฅๅๅๆญฅ้ฝๅฏไปฅ้็จSynchronizedๅ
ณ้ฎๅญๆฅๅฎๆ๏ผไฝๅฎไปฌ่ฟๆฏๆๅบๅซ็ ไบๆฅๆฏไฟ่ฏไธด็ๅบ็็ซๆๅ็๏ผๅไธๆถๅปๅช่ฝๆไธไธช็บฟ็จๆง่กไธด็ๅบไปฃ็ ๅๆญฅๆฏ็ฑไบ็บฟ็จๆง่ก็ๅ
ๅ๏ผ้กบๅบไธๅ๏ผ้่ฆไธไธช็บฟ็จ็ญๅพ
ๅ
ถไป็บฟ็จ่ฟ่กๅฐๆไธช็น Synchronized่ฏญๆณ synchronized(ๅฏน่ฑก) // ็บฟ็จ1๏ผ ็บฟ็จ2(blocked) { ไธด็ๅบ } ่งฃๅณ static int counter = 0; static final Object room = new Object(); public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -\u003e { for (int i = 0; i \u003c 5000; i++) { synchronized (room) { counter++; } } }, \"t1\"); Thread t2 = new Thread(() -\u003e { synchronized (room) { for (int i = 0; i \u003c 5000; i++) { counter--; } } }, \"t2\"); t1.start(); t2.start(); t1.join(); t2.join(); log.debug(\"{}\",counter); } ๆง่ก่ฟ็จ Synchronizedๆง่ก่ฟ็จ ้ขๅๅฏน่ฑกๆน่ฟ ๆ้่ฆไฟๆค็ๅ
ฑไบซๅ้ๆพๅ
ฅไธไธช็ฑป class Room { int value = 0; public void increment() { synchronized (this) { value++; } } public void decrement() { synchronized (this) { value--; } } public int get() { synchronized (this) { return value; } } } @Slf4j public class Test1 { public static void main(String[] args) throws InterruptedException { Room room = new Room(); Thread t1 = new Thread(() -\u003e { for (int j = 0; j \u003c 5000; j++) { room.increment(); } }, \"t1\"); Thread t2 = new Thread(() -\u003e { for (int j = 0; j \u003c 5000; j++) { room.decrement(); } }, \"t2\"); t1.start(); t2.start(); t1.join(); t2.join(); log.debug(\"count: {}\" , room.get()); } } ๆนๆณไธ็synchronized class Test{ public synchronized void test() { } } ็ญไปทไบ class Test{ public void test() { synchronized(this) { } } } class Test{ public synchronized static void test() { } } ็ญไปทไบ class Test{ public static void test() { synchronized(Test.class) { } } } ไธๅ synchronzied็ๆนๆณ ไธๅ synchronized ็ๆนๆณๅฐฑๅฅฝๆฏไธ้ตๅฎ่งๅ็ไบบ๏ผไธๅป่ๅฎๆ้๏ผๅฅฝๆฏ็ฟป็ชๆท่ฟๅป็๏ผ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:2","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"็บฟ็จๅ
ซ้ ๅ
ถๅฎๅฐฑๆฏ่ๅฏsynchronized้ไฝ็ๆฏๅชไธชๅฏน่ฑก ๆ
ๅต1๏ผ12 ๆ 21 @Slf4j(topic = \"c.Number\") class Number{ public synchronized void a() { log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n1.b(); }).start(); } ๆ
ๅต2๏ผ1sๅ 12๏ผๆ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public synchronized void a() { sleep(1); log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n1.b(); }).start(); } ๆ
ๅต3๏ผ3 1sๅ 12๏ผๆ23 1sๅ 1๏ผๆ32 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public synchronized void a() { sleep(1); log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } public void c() { log.debug(\"3\"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n1.b(); }).start(); new Thread(()-\u003e{ n1.c(); }).start(); } ๆ
ๅต4๏ผ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public synchronized void a() { sleep(1); log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); Number n2 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n2.b(); }).start(); } ๆ
ๅต5๏ผ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public static synchronized void a() { sleep(1); log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n1.b(); }).start(); } ๆ
ๅต6๏ผ1sๅ 12๏ผๆ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public static synchronized void a() { sleep(1); log.debug(\"1\"); } public static synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n1.b(); }).start(); } ๆ
ๅต7๏ผ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public static synchronized void a() { sleep(1); log.debug(\"1\"); } public synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); Number n2 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n2.b(); }).start(); } ๆ
ๅต8๏ผ1sๅ 12๏ผๆ2 1sๅ 1 @Slf4j(topic = \"c.Number\") class Number{ public static synchronized void a() { sleep(1); log.debug(\"1\"); } public static synchronized void b() { log.debug(\"2\"); } } public static void main(String[] args) { Number n1 = new Number(); Number n2 = new Number(); new Thread(()-\u003e{ n1.a(); }).start(); new Thread(()-\u003e{ n2.b(); }).start(); } ๅ้็็บฟ็จๅฎๅ
จๅๆ ๆๅๅ้ๅ้ๆๅ้ๆฏๅฆ็บฟ็จๅฎๅ
จ๏ผ ๅฆๆๅฎไปฌๆฒกๆๅ
ฑไบซ๏ผๅ็บฟ็จๅฎๅ
จ ๅฆๆๅฎไปฌ่ขซๅ
ฑไบซไบ๏ผๆ นๆฎๅฎไปฌ็็ถๆๆฏๅฆ่ฝๅคๆนๅ๏ผๅๅไธค็งๆ
ๅต ๅฆๆๅชๆ่ฏปๆไฝ๏ผๅ็บฟ็จๅฎๅ
จ ๅฆๆๆ่ฏปๅๆไฝ๏ผๅ่ฟๆฎตไปฃ็ ๆฏไธด็ๅบ๏ผ้่ฆ่่็บฟ็จๅฎๅ
จ ๅฑ้จๅ้ๆฏๅฆ็บฟ็จๅฎๅ
จ๏ผ ๅฑ้จๅ้ๆฏ็บฟ็จๅฎๅ
จ็ ไฝๅฑ้จๅ้ๅผ็จ็ๅฏน่ฑกๅๆชๅฟ
ๅฆๆ่ฏฅๅฏน่ฑกๆฒกๆ้็ฆปๆนๆณ็ไฝ็จ่ฎฟ้ฎ๏ผๅฎๆฏ็บฟ็จๅฎๅ
จ็ ๅฆๆ่ฏฅๅฏน่ฑก้็ฆปๆนๆณ็ไฝ็จ่ๅด๏ผ้่ฆ่่็บฟ็จๅฎๅ
จ ๅฑ้จๅ้็บฟ็จๅฎๅ
จๅๆ๏ผ public static void test1() { int i = 10; i++; } ๆฏไธช็บฟ็จ่ฐ็จtest1()ๆนๆณๆถๅฑ้จๅ้i๏ผไผๅจๆฏไธช็บฟ็จ็ๆ ๅธงๅ
ๅญไธญ่ขซๅๅปบๅคไปฝ๏ผๅ ๆญคไธๅญๅจๅ
ฑไบซ public static void test1(); descriptor: ()V flags: ACC_PUBLIC, ACC_STATIC Code: stack=1, locals=1, args_size=0 0: bipush 10 2: istore_0 3: iinc 0, 1 6: return LineNumberTable: line 10: 0 line 11: 3 line 12: 6 LocalVariableTable: Start Length Slot Name Signature 3 4 0 i I ๅฆไธๅพๅฑ็คบ ๆ ๅธงๅฑ็คบ ๅฑ้จๅ้็ๅผ็จ็จๆไธๅ ๅ
็ไธไธชๆๅๅ้็ไพๅญ class ThreadUnsafe { ArrayList\u003cString\u003e list = new ArrayList\u003c\u003e(); public void method1(int loopNumber) { for (int i = 0; i \u003c loopNumber; i++) { // { ไธด็ๅบ, ไผไบง็็ซๆๆกไปถ method2(); method3(); // } ไธด็ๅบ } } private void method2() { list.add(\"1\"); } private void method3() { list.remove(0); } } ๆง่ก static final int THREAD_NUMBER = 2; static final int LOOP_NUMBER = 200; public static void main(String[] args) { ThreadUnsafe test = new ThreadUnsafe(); for (int i = 0; i \u003c THREAD_NUMBER; i++) { new Thread(() -\u003e { test.method1(LOOP_NUMBER); }, \"Thread\" + i).start(); } } ๅ
ถไธญไธ็งๆ
ๅตๆฏ๏ผๅฆๆ็บฟ็จ2่ฟๆชadd๏ผ็บฟ็จ1 removeๅฐฑไผๆฅ้๏ผ Exception in thread \"Thread1\" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:3","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅธธ่ง็บฟ็จๅฎๅ
จ็ฑป String Integer StringBuffer Random Vector Hashtable java.util.concurrentๅ
ไธ็็ฑป ่ฟ้่ฏดๅฎไปฌๆฏ็บฟ็จๅฎๅ
จ็ๆฏๆ๏ผๅคไธช็บฟ็จ่ฐ็จๅฎไปฌๅไธไธชๅฎไพ็ๆไธชๆนๆณๆถ๏ผๆฏ็บฟ็จๅฎๅ
จ็ใไนๅฏไปฅ็่งฃไธบ Hashtable table = new Hashtable(); new Thread(()-\u003e{ table.put(\"key\", \"value1\"); }).start(); new Thread(()-\u003e{ table.put(\"key\", \"value2\"); }).start(); ๅฎไปฌๆฏไธชๆนๆณๆฏๅๅญ็ ไฝๆณจๆๅฎไปฌๅคไธชๆนๆณ็็ปๅไธๆฏๅๅญ็ ็บฟ็จๅฎๅ
จ็ฑปๆนๆณ็็ปๅ ๅๆไธ้ขไปฃ็ ๆฏๅฆ็บฟ็จๅฎๅ
จ Hashtable table = new Hashtable(); // ็บฟ็จ1๏ผ็บฟ็จ2 if( table.get(\"key\") == null) { table.put(\"key\", value); } ไปฃ็ ๅพ่งฃ ไธๅฏๅ็ฑป็บฟ็จๅฎๅ
จๆง StringใInteger็ญ้ฝๆฏไธๅฏๅ็ฑป๏ผๅ ไธบๅ
ถๅ
้จ็็ถๆไธๅฏไปฅๆนๅ๏ผๅ ๆญคๅฎไปฌ็ๆนๆณ้ฝๆฏ็บฟ็จๅฎๅ
จ็ใ public class Immutable{ private int value = 0; public Immutable(int value){ this.value = value; } public int getValue(){ return this.value; } } ๅฆๆๆณๅขๅ ไธไธชๅขๅ ็ๆนๆณๅข public class Immutable{ private int value = 0; public Immutable(int value){ this.value = value; } public int getValue(){ return this.value; } public Immutable add(int v){ return new Immutable(this.value + v); } } ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:4","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Monitorๆฆๅฟต Javaๅฏน่ฑกๅคด ไปฅ32ไฝ่ๆๆบไธบไพ ๆฎ้ๅฏน่ฑก ๆฎ้ๅฏน่ฑกๅคด ๆฐ็ปๅฏน่ฑก ๆฐ็ปๅฏน่ฑกๅคด ๅ
ถไธญ Mark Word ็ปๆไธบ MarkWord็ปๆ 64ไฝ่ๆๆบ Mark Word 64ไฝ่ๆๆบMarkWord ๅ่่ตๆ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:5","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"wait notify API ไป็ป obj.wait()่ฎฉ่ฟๅ
ฅobject็่งๅจ็็บฟ็จๅฐwaitSet็ญๅพ
obj.notify()ๅจobjectไธๆญฃๅจwaitSet็ญๅพ
็็บฟ็จไธญๆไธไธชๅค้ obj.notifyAll()่ฎฉobjectไธๆญฃๅจwaitSet็ญๅพ
็็บฟ็จๅ
จ้จๅค้ ๅฎไปฌ้ฝๆฏ็บฟ็จไน้ด่ฟ่กๅไฝ็ๆๆฎต๏ผ้ฝๅฑไบObjectๅฏน่ฑก็ๆนๆณ๏ผๅฟ
้กป่ทๅพๆญคๅฏน่ฑก็้๏ผๆ่ฝ่ฐ็จ่ฟๅ ไธชๆนๆณ final static Object obj = new Object(); public static void main(String[] args) { new Thread(() -\u003e { synchronized (obj) { log.debug(\"ๆง่ก....\"); try { obj.wait(); // ่ฎฉ็บฟ็จๅจobjไธไธ็ด็ญๅพ
ไธๅป } catch (InterruptedException e) { e.printStackTrace(); } log.debug(\"ๅ
ถๅฎไปฃ็ ....\"); } }).start(); new Thread(() -\u003e { synchronized (obj) { log.debug(\"ๆง่ก....\"); try { obj.wait(); // ่ฎฉ็บฟ็จๅจobjไธไธ็ด็ญๅพ
ไธๅป } catch (InterruptedException e) { e.printStackTrace(); } log.debug(\"ๅ
ถๅฎไปฃ็ ....\"); } }).start(); // ไธป็บฟ็จไธค็งๅๆง่ก sleep(2); log.debug(\"ๅค้ obj ไธๅ
ถๅฎ็บฟ็จ\"); synchronized (obj) { obj.notify(); // ๅค้objไธไธไธช็บฟ็จ // obj.notifyAll(); // ๅค้objไธๆๆ็ญๅพ
็บฟ็จ } } notify็ไธ็ง็ปๆ 20:00:53.096 [Thread-0] c.TestWaitNotify - ๆง่ก.... 20:00:53.099 [Thread-1] c.TestWaitNotify - ๆง่ก.... 20:00:55.096 [main] c.TestWaitNotify - ๅค้ obj ไธๅ
ถๅฎ็บฟ็จ 20:00:55.096 [Thread-0] c.TestWaitNotify - ๅ
ถๅฎไปฃ็ .... notifyAll็ปๆ 19:58:15.457 [Thread-0] c.TestWaitNotify - ๆง่ก.... 19:58:15.460 [Thread-1] c.TestWaitNotify - ๆง่ก.... 19:58:17.456 [main] c.TestWaitNotify - ๅค้ obj ไธๅ
ถๅฎ็บฟ็จ 19:58:17.456 [Thread-1] c.TestWaitNotify - ๅ
ถๅฎไปฃ็ .... 19:58:17.456 [Thread-0] c.TestWaitNotify - ๅ
ถๅฎไปฃ็ .... wait()ๆนๆณไผ้ๆพๅฏน่ฑก็้๏ผ่ฟๅ
ฅWaitSet็ญๅพ
ๅบ๏ผไป่่ฎฉๅ
ถไป็บฟ็จๅฐฑๅฐฑๆๆบไผ่ทๅๅฏน่ฑก็้ใๆ ้ๅถ็ญๅพ
๏ผ็ดๅฐnotifyไธบๆญข wait(long n)ๆๆถ้็็ญๅพ
๏ผๅฐnๆฏซ็งๅ็ปๆ็ญๅพ
๏ผๆๆฏ่ขซnotify sleep(long n) ๅ wait(long n) ็ๅบๅซ sleep ๆฏ Thread ๆนๆณ๏ผ่ wait ๆฏ Object ็ๆนๆณ sleep ไธ้่ฆๅผบๅถๅ synchronized ้
ๅไฝฟ็จ๏ผไฝ wait ้่ฆๅ synchronized ไธ่ตทไฝฟ็จ sleep ๅจ็ก็ ็ๅๆถ๏ผไธไผ้ๆพๅฏน่ฑก้๏ผไฝ wait ๅจ็ญๅพ
็ๆถๅไผ้ๆพๅฏน่ฑก้ ๅฎไปฌ็ถๆ TIMED_WAITINGsss ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:6","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Park \u0026 Unpark ๅบๆฌไฝฟ็จ ๅฎไปฌๆฏ LockSupport ็ฑปไธญ็ๆนๆณ // ๆๅๅฝๅ็บฟ็จ LockSupport.park(); // ๆขๅคๆไธช็บฟ็จ็่ฟ่ก LockSupport.unpark(ๆๅ็บฟ็จๅฏน่ฑก) ๅ
park ๅ unpark Thread t1 = new Thread(() -\u003e { log.debug(\"start...\"); sleep(1); log.debug(\"park...\"); LockSupport.park(); log.debug(\"resume...\"); },\"t1\"); t1.start(); sleep(2); log.debug(\"unpark...\"); LockSupport.unpark(t1); ่พๅบ็ปๆ 18:42:52.585 c.TestParkUnpark [t1] - start... 18:42:53.589 c.TestParkUnpark [t1] - park... 18:42:54.583 c.TestParkUnpark [main] - unpark... 18:42:54.583 c.TestParkUnpark [t1] - resume... ๅ
unpark ๅ park Thread t1 = new Thread(() -\u003e { log.debug(\"start...\"); sleep(2); log.debug(\"park...\"); LockSupport.park(); log.debug(\"resume...\"); }, \"t1\"); t1.start(); sleep(1); log.debug(\"unpark...\"); LockSupport.unpark(t1); ่พๅบ็ปๆ 18:43:50.765 c.TestParkUnpark [t1] - start... 18:43:51.764 c.TestParkUnpark [main] - unpark... 18:43:52.769 c.TestParkUnpark [t1] - park... 18:43:52.769 c.TestParkUnpark [t1] - resume... ็น็น wait๏ผnotify ๅ notifyAll ๅฟ
้กป้
ๅ Object Monitor ไธ่ตทไฝฟ็จ๏ผ่ park๏ผunparkไธๅฟ
park \u0026 unpark ๆฏไปฅ็บฟ็จไธบๅไฝๆฅใ้ปๅกใๅใๅค้ใ็บฟ็จ๏ผ่ notify ๅช่ฝ้ๆบๅค้ไธไธช็ญๅพ
็บฟ็จ๏ผnotifyAll ๆฏๅค้ๆๆ็ญๅพ
็บฟ็จ๏ผๅฐฑไธ้ฃไนใ็ฒพ็กฎใ park \u0026 unpark ๅฏไปฅๅ
unpark๏ผ่ wait \u0026 notify ไธ่ฝๅ
notify ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:7","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"้ๆฐ็่งฃ็บฟ็จ็ถๆ่ฝฌๆข ็บฟ็จ็ถๆ่ฝฌๆขๅพ ๅ่ฎพๆ็บฟ็จThread t ๆ
ๅต1 NEW -\u003e RUNABLE ๅฝ่ฐ็จt.start()ๆนๆณๆถ๏ผ็ฑNEW -\u003e RUNNABLE ๆ
ๅต2 RUNNABLE \u003c-\u003e WAITING t ็บฟ็จ่ฐ็จsynchronized(obj)่ทๅไบๅฏน่ฑก้ๅ ่ฐ็จobj.wait()ๆนๆณๆถ๏ผt ็บฟ็จไปRUNNABLE -\u003e WAITING ่ฐ็จobj.notify(),obj.notifyAll(),t.interruptๆถ ็ซไบ้ๆๅ๏ผt ็บฟ็จไปWAITING -\u003e RUNNABLE ็ซไบ้ๅคฑ่ดฅ๏ผt ็บฟ็จไปWAITING -\u003e BLOCKED public class TestWaitNotify { final static Object obj = new Object(); public static void main(String[] args) { new Thread(() -\u003e { synchronized (obj) { log.debug(\"ๆง่ก....\"); try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } log.debug(\"ๅ
ถๅฎไปฃ็ ....\"); // ๆญ็น } },\"t1\").start(); new Thread(() -\u003e { synchronized (obj) { log.debug(\"ๆง่ก....\"); try { obj.wait(); } catch (InterruptedException e) { e.printStackTrace(); } log.debug(\"ๅ
ถๅฎไปฃ็ ....\"); // ๆญ็น } },\"t2\").start(); sleep(0.5); log.debug(\"ๅค้ obj ไธๅ
ถๅฎ็บฟ็จ\"); synchronized (obj) { obj.notifyAll(); // ๅค้objไธๆๆ็ญๅพ
็บฟ็จ } } } ๆ
ๅต3RUNNABLE \u003cโ\u003e WAITING ๅฝๅ็บฟ็จ่ฐ็จt.join()ๆนๆณๆถ๏ผๅฝๅ็บฟ็จไปRUNABLE โโ\u003e WAITING ๆณจๆๅฝๅ็บฟ็จๅจt ็บฟ็จๅฏน่ฑก็็่งๅจไธ็ญๅพ
t ็บฟ็จ่ฟ่ก็ปๆ๏ผๆ่ฐ็จไบๅฝๅ็บฟ็จ็interrupt()ๆถ๏ผๅฝๅ็บฟ็จไปWAITING โโ\u003e RUNABLE ๆ
ๅต4RUNABLE \u003cโ\u003e WAITING ๅฝๅ็บฟ็จ่ฐ็จLockSupport.park()ๆนๆณไผ่ฎฉๅฝๅ็บฟ็จไปRUNNABLE โโ\u003e WAITING ่ฐ็จLockSupport.unpark(็ฎๆ ็บฟ็จ)ๆ่ฐ็จไบ็บฟ็จ็interrupt()๏ผไผ่ฎฉ็ฎๆ ็บฟ็จไปWAITING โโ\u003e RUNABLE ๆ
ๅต5RUNNABLE \u003cโ\u003e TIMED_WAITING t็บฟ็จ็จsynchronized(obj)่ทๅไบๅฏน่ฑก้ๅ ่ฐ็จobj.wait(long n)ๆนๆณๆถ๏ผt็บฟ็จไปRUNNABLE โโ\u003e TIMED_WAITING t็บฟ็จ็ญๅพ
ๆถ้ด่ถ
่ฟไบnๆฏซ็ง๏ผๆ่ฐ็จobj.notify()๏ผobj.notifyAll()๏ผt.interrupt()ๆถ ็ซไบ้ๆๅ๏ผt็บฟ็จไปTIMED_WAITING โโ\u003e RUNNABLE ็ซไบ้ๅคฑ่ดฅ๏ผt็บฟ็จไปTIMED_WAITING โโ\u003e BLOCKED โ ๆ
ๅต6RUNNABLE \u003cโ\u003e TIMED_WAITING ๅฝ็บฟ็จ่ฐ็จt.join(long n)ๆนๆณๆถ๏ผๅฝๅๅ
็บฟ็จไปRUNNABLE โโ\u003e TIMED_WAITING ๆณจๆๆฏๅฝๅ็บฟ็จๅจ t็บฟ็จ ๅฏน่ฑก็็่งๅจไธ็ญๅพ
ๅฝๅ็บฟ็จ็ญๅพ
ๆถ้ด่ถ
่ฟไบnๆฏซ็ง๏ผๆ t็บฟ็จ ่ฟ่ก็ปๆ๏ผๆ่ฐ็จไบๅฝๅ็บฟ็จ็interrupt()ๆถ๏ผๅฝๅ็บฟ็จไปTIMED_WAITING โโ\u003e RUNNABLE ๆ
ๅต7RUNNABLE \u003cโ\u003e TIMED_WAITING ๅฝๅ็บฟ็จ่ฐ็จThread.sleep(long n)๏ผๅฝๅ็บฟ็จไปRUNNABLE โโ\u003e TIMED_WAITING ๅฝๅ็บฟ็จ็ญๅพ
ๆถ้ด่ถ
่ฟไบnๆฏซ็ง๏ผๅฝๅ็บฟ็จไปTIMED_WAITING โโ\u003e RUNNABLE ๆ
ๅต8RUNNABLE \u003cโ\u003e TIMED_WAITING ๅฝๅ็บฟ็จ่ฐ็จLockSupport.parkNanos(long nanos)ๆLockSupport.parkUntil(long mills)ๆถ๏ผๅฝๅ็บฟ็จไปRUNNABLE โโ\u003e TIMED_WAITING ่ฐ็จLockSupport.unpark(็ฎๆ ็บฟ็จ)ๆ่ฐ็จไบ็บฟ็จ็interrupt()๏ผๆๆฏ็ญๅพ
่ถ
ๆถ๏ผไผ่ฎฉ็ฎๆ ็บฟ็จไปTIMED_WAITING โโ\u003e RUNNABLE ๆ
ๅต9RUNNABLE \u003cโ\u003e BLOCKED t็บฟ็จ ็จsynchronized(obj)่ทๅไบๅฏน่ฑก้ๆถๅฆๆ็ซไบๅคฑ่ดฅ๏ผไปRUNNABLE โโ\u003e BLOCKED ๆobj้็บฟ็จ็ๅๆญฅไปฃ็ ๅๆง่กๅฎๆฏ๏ผไผๅค้่ฏฅๅฏน่ฑกไธๆๆBLOCKED็็บฟ็จ้ๆฐ็ซไบ๏ผๅฆๆๅ
ถไธญ t็บฟ็จ ็ซไบๆๅ๏ผไปBLOCKED โโ\u003e RUNNABLE๏ผๅ
ถไปๅคฑ่ดฅ็็บฟ็จไป็ถBLOCKED ๆ
ๅต10RUNNABLE \u003cโ\u003e TERMINATED ๅฝๅ็บฟ็จๆๆไปฃ็ ่ฟ่กๅฎๆฏ๏ผ่ฟๅ
ฅTERMINATED ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:8","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅคๆ้ ๅคๆไธ็ธๅนฒ็้ ็คบไพ๏ผไธ้ดๅคงๅฑๅญๆไธคไธชๅ่ฝ๏ผ็ก่งใๅญฆไน ๏ผไบไธ็ธๅนฒ ็ฐๅจๅฐๅ่ฆๅญฆไน ๏ผๅฐๅฅณ่ฆ็ก่ง๏ผไฝๅฆๆๅช็จไธ้ดๅฑๅญ๏ผไธไธชๅฏน่ฑก้๏ผ็่ฏ๏ผ้ฃไนๅนถๅๅบฆๅพไฝ ่งฃๅณๆนๆณๆฏๅๅคๅคไธชๆฟ้ด๏ผๅคไธชๅฏน่ฑก้๏ผ ไปฃ็ ๆผ็คบ class BigRoom { public void sleep() { synchronized (this) { log.debug(\"sleeping 2 ๅฐๆถ\"); Sleeper.sleep(2); } } public void study() { synchronized (this) { log.debug(\"study 1 ๅฐๆถ\"); Sleeper.sleep(1); } } } // ๆง่กๆญฅ้ชค BigRoom bigRoom = new BigRoom(); new Thread(() -\u003e { bigRoom.compute(); },\"ๅฐๅ\").start(); new Thread(() -\u003e { bigRoom.sleep(); },\"ๅฐๅฅณ\").start(); ๆง่ก็ปๆ 12:13:54.471 [ๅฐๅ] c.BigRoom - study 1 ๅฐๆถ 12:13:55.476 [ๅฐๅฅณ] c.BigRoom - sleeping 2 ๅฐๆถ ่งๅฏ็บฟ็จๅฏๅจๆถ้ด ๆน่ฟๆนๆก class BigRoom { private final Object studyRoom = new Object(); private final Object bedRoom = new Object(); public void sleep() { synchronized (bedRoom) { log.debug(\"sleeping 2 ๅฐๆถ\"); Sleeper.sleep(2); } } public void study() { synchronized (studyRoom) { log.debug(\"study 1 ๅฐๆถ\"); Sleeper.sleep(1); } } } ๆง่ก็ปๆ 12:15:35.069 [ๅฐๅ] c.BigRoom - study 1 ๅฐๆถ 12:15:35.069 [ๅฐๅฅณ] c.BigRoom - sleeping 2 ๅฐๆถ ๅฐ้็็ฒๅบฆ็ปๅ ๅฅฝๅค๏ผๅฏไปฅๅขๅผบๅนถๅๅบฆ ๅๅค๏ผๅฆๆไธไธช็บฟ็จ้่ฆๅๆถ่ทๅๅคๆ้๏ผๅฐฑๅฎนๆๅ็ๆญป้ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:9","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๆดป่ทๆง ๆญป้ ๆ่ฟๆ ท็ๆ
ๅต๏ผไธไธช็บฟ็จ้่ฆๅๆถ่ทๅๅคๆ้๏ผ่ฟๆถๅฐฑๅฎนๆๅ็ๆญป้ t1็บฟ็จ่ทๅพAๅฏน่ฑก้๏ผๆฅไธๆฅๆณ่ทๅBๅฏน่ฑก็้t2็บฟ็จ่ทๅพBๅฏน่ฑก้๏ผๆฅไธๆฅๆณ่ทๅAๅฏน่ฑก็้ ไปฃ็ ๆผ็คบ Object A = new Object(); Object B = new Object(); Thread t1 = new Thread(() -\u003e { synchronized (A) { log.debug(\"lock A\"); sleep(1); synchronized (B) { log.debug(\"lock B\"); log.debug(\"ๆไฝ...\"); } } }, \"t1\"); Thread t2 = new Thread(() -\u003e { synchronized (B) { log.debug(\"lock B\"); sleep(0.5); synchronized (A) { log.debug(\"lock A\"); log.debug(\"ๆไฝ...\"); } } }, \"t2\"); t1.start(); t2.start(); ่ฟ่ก็ปๆ 12:22:06.962 [t2] c.TestDeadLock - lock B 12:22:06.962 [t1] c.TestDeadLock - lock A ๅฎไฝๆญป้ ๆฃๆตๆญป้ๅฏไปฅไฝฟ็จ jconsole ๅทฅๅ
ท๏ผๆ่
ไฝฟ็จ jps ๅฎไฝ่ฟ็จ id๏ผๅ็จ jstack ๅฎไฝๆญป้ cmd \u003e jps Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 12320 Jps 22816 KotlinCompileDaemon 33200 TestDeadLock // JVM ่ฟ็จ 11508 Main 28468 Launcher cmd \u003e jstack 33200 Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 2018-12-29 05:51:40 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.91-b14 mixed mode): \"DestroyJavaVM\" #13 prio=5 os_prio=0 tid=0x0000000003525000 nid=0x2f60 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE \"Thread-1\" #12 prio=5 os_prio=0 tid=0x000000001eb69000 nid=0xd40 waiting for monitor entry [0x000000001f54f000] java.lang.Thread.State: BLOCKED (on object monitor) at thread.TestDeadLock.lambda$main$1(TestDeadLock.java:28) - waiting to lock \u003c0x000000076b5bf1c0\u003e (a java.lang.Object) - locked \u003c0x000000076b5bf1d0\u003e (a java.lang.Object) at thread.TestDeadLock$$Lambda$2/883049899.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) \"Thread-0\" #11 prio=5 os_prio=0 tid=0x000000001eb68800 nid=0x1b28 waiting for monitor entry [0x000000001f44f000] java.lang.Thread.State: BLOCKED (on object monitor) at thread.TestDeadLock.lambda$main$0(TestDeadLock.java:15) - waiting to lock \u003c0x000000076b5bf1d0\u003e (a java.lang.Object) - locked \u003c0x000000076b5bf1c0\u003e (a java.lang.Object) at thread.TestDeadLock$$Lambda$1/495053715.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) // ็ฅๅป้จๅ่พๅบ Found one Java-level deadlock: ============================= \"Thread-1\": waiting to lock monitor 0x000000000361d378 (object 0x000000076b5bf1c0, a java.lang.Object),which is held by \"Thread-0\" \"Thread-0\": waiting to lock monitor 0x000000000361e768 (object 0x000000076b5bf1d0, a java.lang.Object),which is held by \"Thread-1\" Java stack information for the threads listed above: =================================================== \"Thread-1\": at thread.TestDeadLock.lambda$main$1(TestDeadLock.java:28) - waiting to lock \u003c0x000000076b5bf1c0\u003e (a java.lang.Object) - locked \u003c0x000000076b5bf1d0\u003e (a java.lang.Object) at thread.TestDeadLock$$Lambda$2/883049899.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) \"Thread-0\": at thread.TestDeadLock.lambda$main$0(TestDeadLock.java:15) - waiting to lock \u003c0x000000076b5bf1d0\u003e (a java.lang.Object) - locked \u003c0x000000076b5bf1c0\u003e (a java.lang.Object) at thread.TestDeadLock$$Lambda$1/495053715.run(Unknown Source) at java.lang.Thread.run(Thread.java:745) Found 1 deadlock. ้ฟๅ
ๆญป้่ฆๆณจๆๅ ้้กบๅบ ๅฆๅคๅฆๆ็ฑไบๆไธช็บฟ็จ่ฟๅ
ฅๆญปๅพช็ฏ๏ผๅฏผ่ดๅ
ถๅฎ็บฟ็จไธ็ด็ญๅพ
๏ผๅฏนไบ่ฟ็งๆ
ๅต Linux ไธๅฏไปฅ้่ฟ top ๅ
ๅฎไฝๅฐ CPU ๅ ็จ้ซ็ Java ่ฟ็จ๏ผๅๅฉ็จtop -Hp ่ฟ็จidๆฅๅฎไฝๆฏๅชไธช็บฟ็จ๏ผๆๅๅ็จ jstack ๆๆฅ ๅฒๅญฆๅฎถๅฐฑ้ค้ฎ้ข ๅฒๅญฆๅฎถๅฐฑ้ค้ฎ้ข ๆๆ ไฝๅฒๅญฆๅฎถ๏ผๅดๅๅจๅ้ฅญๆกๆ ไปไปฌๅชๅไธคไปถไบ๏ผๆ่ๅๅ้ฅญ๏ผๆ่ไธไผๅฟๅๅฃ้ฅญ๏ผๅๅฎ้ฅญๅๆฅ็ๆ่ ๅ้ฅญๆถ่ฆ็จไธคๆ น็ญทๅญๅ๏ผๆกไธไธๅ
ฑๆ5ๆ น็ญทๅญ๏ผๆฏไฝๅฒๅญฆๅฎถๅทฆๅณๆ่พนๅๆไธๆ น็ญทๅญ ๅฆๆ็ญทๅญ่ขซ่บซ่พน็ไบบๆฟ็๏ผ่ชๅทฑๅฐฑๅพ็ญๅพ
็ญทๅญ็ฑปๅฎไน class Chopstick { String name; public Chopstick( String name) { this.name = name; } @Override public String toString() { return \"็ญทๅญ{\" + name + '}'; } } ๅฒๅญฆๅฎถ็ฑปๅฎไน class Philosopher extends Thread { Chopstick left; Chopstick right; public Philosopher(String name, Chopstick left, Chopstick right) { super(name); this.left = left; this.right = right; } private void eat() { log.debug(\"eating...\"); Sleeper.sleep(1); } @Override public void run() { while (true) { // ่ทๅพๅทฆๆ็ญทๅญ synchronized (left) { // ่ทๅพๅณๆ็ญทๅญ synchronized (right) { // ๅ้ฅญ eat(); } // ๆพไธๅณๆ็ญทๅญ } // ๆพไธๅทฆๆ็ญทๅญ } } } ๅฐฑ้คๆจกๆ Chopstick c1 = new Chopstick(\"1\"); Chopstick c2 = new Chopstick(\"2\"); Chopstick c3 = new Chopstick(\"3\"); Chopstick c4 = new Chopstick(\"4\"); Chopstick c5 = new Chopstick(\"5\"); new Philosopher(\"่","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:10","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ReentrantLock ็ธๅฏนไบ synchronized ๅฎๅ
ทๅคๅฆไธ็น็น ๅฏไธญๆญ ๅฏไปฅ่ฎพ็ฝฎ่ถ
ๆถๆถ้ด ๅฏไปฅ่ฎพ็ฝฎไธบๅ
ฌๅนณ้ ๆฏๆๅคไธชๆกไปถๅ้ ไธ synchronized ไธๆ ท๏ผ้ฝๆฏๆๅฏ้ๅ
ฅ ๅบๆฌ่ฏญๆณ // ่ทๅ้ reentrantLock.lock(); try { // ไธด็ๅบ } finally { // ้ๆพ้ reentrantLock.unlock(); } ๅฏ้ๅ
ฅ ๅฏ้ๅ
ฅๆฏๆๅไธไธช็บฟ็จๅฆๆ้ฆๆฌก่ทๅพไบ่ฟๆ้๏ผ้ฃไนๅ ไธบๅฎๆฏ่ฟๆ้็ๆฅๆ่
๏ผๅ ๆญคๆๆๅฉๅๆฌก่ทๅ่ฟๆ้๏ผๅฆๆๆฏไธๅฏ้ๅ
ฅ้๏ผ้ฃไน็ฌฌไบๆฌก่ทๅพ้ๆถ๏ผ่ชๅทฑไนไผ่ขซ้ๆกไฝ static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { method1(); } public static void method1() { lock.lock(); try { log.debug(\"execute method1\"); method2(); } finally { lock.unlock(); } } public static void method2() { lock.lock(); try { log.debug(\"execute method2\"); method3(); } finally { lock.unlock(); } } public static void method3() { lock.lock(); try { log.debug(\"execute method3\"); } finally { lock.unlock(); } } ่พๅบ 17:59:11.862 [main] c.TestReentrant - execute method1 17:59:11.865 [main] c.TestReentrant - execute method2 17:59:11.865 [main] c.TestReentrant - execute method3 ๅฏๆๆญ ็คบไพ ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅฏๅจ...\"); try { lock.lockInterruptibly(); } catch (InterruptedException e) { e.printStackTrace(); log.debug(\"็ญ้็่ฟ็จไธญ่ขซๆๆญ\"); return; } try { log.debug(\"่ทๅพไบ้\"); } finally { lock.unlock(); } }, \"t1\"); lock.lock(); log.debug(\"่ทๅพไบ้\"); t1.start(); try { sleep(1); t1.interrupt(); log.debug(\"ๆง่กๆๆญ\"); } finally { lock.unlock(); } ่พๅบ 18:02:40.520 [main] c.TestInterrupt - ่ทๅพไบ้ 18:02:40.524 [t1] c.TestInterrupt - ๅฏๅจ... 18:02:41.530 [main] c.TestInterrupt - ๆง่กๆๆญ java.lang.InterruptedException at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchr onizer.java:898) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchron izer.java:1222) at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335) at cn.itcast.n4.reentrant.TestInterrupt.lambda$main$0(TestInterrupt.java:17) at java.lang.Thread.run(Thread.java:748) 18:02:41.532 [t1] c.TestInterrupt - ็ญ้็่ฟ็จไธญ่ขซๆๆญ ๆณจๆๅฆๆๆฏไธๅฏไธญๆญๆจกๅผ๏ผ้ฃไนๅณไฝฟไฝฟ็จไบinterruptไนไธไผ่ฎฉ็ญๅพ
ไธญๆญ ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅฏๅจ...\"); lock.lock(); try { log.debug(\"่ทๅพไบ้\"); } finally { lock.unlock(); } }, \"t1\"); lock.lock(); log.debug(\"่ทๅพไบ้\"); t1.start(); try { sleep(1); t1.interrupt(); log.debug(\"ๆง่กๆๆญ\"); sleep(1); } finally { log.debug(\"้ๆพไบ้\"); lock.unlock(); } ่พๅบ 18:06:56.261 [main] c.TestInterrupt - ่ทๅพไบ้ 18:06:56.265 [t1] c.TestInterrupt - ๅฏๅจ... 18:06:57.266 [main] c.TestInterrupt - ๆง่กๆๆญ // ่ฟๆถ t1 ๅนถๆฒกๆ่ขซ็ๆญฃๆๆญ, ่ๆฏไป็ปง็ปญ็ญๅพ
้ 18:06:58.267 [main] c.TestInterrupt - ้ๆพไบ้ 18:06:58.267 [t1] c.TestInterrupt - ่ทๅพไบ้ ้่ถ
ๆถ ็ซๅปๅคฑ่ดฅ ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅฏๅจ...\"); if (!lock.tryLock()) { log.debug(\"่ทๅ็ซๅปๅคฑ่ดฅ๏ผ่ฟๅ\"); return; } try { log.debug(\"่ทๅพไบ้\"); } finally { lock.unlock(); } }, \"t1\"); lock.lock(); log.debug(\"่ทๅพไบ้\"); t1.start(); try { sleep(2); } finally { lock.unlock(); } ่พๅบ 18:15:02.918 [main] c.TestTimeout - ่ทๅพไบ้ 18:15:02.921 [t1] c.TestTimeout - ๅฏๅจ.. 18:15:02.921 [t1] c.TestTimeout - ่ทๅ็ซๅปๅคฑ่ดฅ๏ผ่ฟๅ ่ถ
ๆถๅคฑ่ดฅ ReentrantLock lock = new ReentrantLock(); Thread t1 = new Thread(() -\u003e { log.debug(\"ๅฏๅจ...\"); try { if (!lock.tryLock(1, TimeUnit.SECONDS)) { log.debug(\"่ทๅ็ญๅพ
1s ๅๅคฑ่ดฅ๏ผ่ฟๅ\"); return; } } catch (InterruptedException e) { e.printStackTrace(); } try { log.debug(\"่ทๅพไบ้\"); } finally { lock.unlock(); } }, \"t1\"); lock.lock(); log.debug(\"่ทๅพไบ้\"); t1.start(); try { sleep(2); } finally { lock.unlock(); } ่พๅบ 18:19:40.537 [main] c.TestTimeout - ่ทๅพไบ้ 18:19:40.544 [t1] c.TestTimeout - ๅฏๅจ... 18:19:41.547 [t1] c.TestTimeout - ่ทๅ็ญๅพ
1s ๅๅคฑ่ดฅ๏ผ่ฟๅ ไฝฟ็จ tryLock ่งฃๅณๅฒๅญฆๅฎถๅฐฑ้ค้ฎ้ข class Chopstick extends ReentrantLock { String name; public Chopstick(String name) { this.name = name; } @Override public String toString() { return \"็ญทๅญ{\" + name + '}'; } } class Philosopher extends Thread { Chopstick left; Chopstick right; public Philosopher(String name, Chopstick left, Chopstick right) { super(name); this.left = left; this.right = right; } @Override public void run() { while (true) { // ๅฐ่ฏ่ทๅพๅทฆๆ็ญทๅญ if (left.tryLock()) { try { // ๅฐ่ฏ่ทๅพๅณๆ็ญทๅญ if ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:11","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅฐ็ป ๅๆๅค็บฟ็จ่ฎฟ้ฎๅ
ฑไบซ่ตๆบๆถ๏ผๅชไบไปฃ็ ็ๆฎตๅฑไบไธด็ๅบ ไฝฟ็จ synchronized ไบๆฅ่งฃๅณไธด็ๅบ็็บฟ็จๅฎๅ
จ ๆๆก synchronized ้ๅฏน่ฑก่ฏญๆณ ๆๆก synchronized ๅ ่ฝฝๆๅๆนๆณๅ้ๆๆนๆณ่ฏญๆณ ๆๆก wait/notify ๅๆญฅๆนๆณ ไฝฟ็จ lock ไบๆฅ่งฃๅณไธด็ๅบ็็บฟ็จๅฎๅ
จ้ฎ้ข ๆๆก lock ็ไฝฟ็จ็ป่๏ผๅฏๆๆญใ้่ถ
ๆถใๅ
ฌๅนณ้ใๆกไปถๅ้ ๅญฆไผๅๆๅ้็็บฟ็จๅฎๅ
จใๆๆกๅธธ่ง็บฟ็จๅฎๅ
จ็ฑป็ไฝฟ็จ ไบ่งฃ็บฟ็จๆดป่ทๆง้ฎ้ข๏ผๆญป้ใๆดป้ใ้ฅฅ้ฅฟ ๅบ็จๆน้ข ไบๆฅ๏ผไฝฟ็จ synchronized ๆ Lock ่พพๅฐๅ
ฑไบซ่ตๆบไบๆฅๆๆ ๅๆญฅ๏ผไฝฟ็จ wait/notify ๆ Lock ็ๆกไปถๅ้ๆฅ่พพๅฐ็บฟ็จ้ด้ไฟกๆๆ ๅ็ๆน้ข monitorใsynchronizedใwait/notifyๅ็ synchronized่ฟ้ถๅ็ park \u0026 unparkๅ็ ๆจกๅผๆน้ข ๅๆญฅๆจกๅผไนไฟๆคๆงๆๅ ๅผๆญฅๆจกๅผไน็ไบง่
ๆถ่ดน่
ๅๆญฅๆจกๅผไน้กบๅบๆงๅถ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:4:12","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅ
ฑไบซๆจกๅๅ
ๅญ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:5:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"Javaๅ
ๅญๆจกๅผ JMM ๅณ Java Memory Model๏ผๅฎๅฎไนไบไธปๅญใๅทฅไฝๅ
ๅญๆฝ่ฑกๆฆๅฟต๏ผๅบๅฑๅฏนๅบ็ CPU ๅฏๅญๅจใ็ผๅญใ็กฌไปถๅ
ๅญใCPUๆไปคไผๅ็ญใ JMM ไฝ็ฐๅจไปฅไธๅ ไธชๆน้ข ๅๅญๆง๏ผไฟ่ฏๆไปคไธไผๆถๅฐ็บฟ็จไธไธๆๅๆข็ๅฝฑๅ ๅฏ่ง่ก๏ผไฟ่ฏๆไปคไธไผๆถๅฐ CPU ็ผๅญ็ๅฝฑๅ ๆๅบๆง๏ผไฟ่ฏๆไปคไธไผๅ CPU ๆไปคๅนถ่กไผๅ็ๅฝฑๅ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:5:1","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅฏ่ง่ก ้ไธๅบ็ๅพช็ฏ ๅ
ๆฅ็ไธไธช็ฐ่ฑก๏ผmain ็บฟ็จๅฏน run ๅ้็ไฟฎๆนๅฏนไบ t ็บฟ็จไธๅฏ่ง๏ผๅฏผ่ดไบ t ็บฟ็จๆ ๆณๅๆญข๏ผ static boolean run = true; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()-\u003e{ while(run){ // .... } }); t.start(); sleep(1); run = false; // ็บฟ็จtไธไผๅฆ้ขๆณ็ๅไธๆฅ } ๅๅ ๅๆ๏ผ ๅๅง็ถๆ๏ผt ็บฟ็จๅๅผๅงไปไธปๅ
ๅญ่ฏปๅไบ run ็ๅผๅฐๅทฅไฝๅ
ๅญ ๆญฅ้ชคไธ ๅ ไธบ t ็บฟ็จ่ฆ้ข็นไปไธปๅ
ๅญไธญ่ฏปๅ run ็ๅผ๏ผJIT็ผ่ฏๅจไผๅฐ run ็ๅผ็ผๅญ่ณ่ชๅทฑๅทฅไฝๅ
ๅญไธญ็้ซ้็ผๅญไธญ๏ผๅๅฐๅฏนไธปๅ
ๅญไธญ run ็่ฎฟ้ฎ๏ผๆ้ซๆ็ ๆญฅ้ชคไบ 1็งไนๅ๏ผmain ็บฟ็จไฟฎๆนไบ run ็ๅผ๏ผๅนถๅๆญฅ่ณไธปๅญ๏ผ่ t ๆฏไป่ชๅทฑๅทฅไฝๅ
ๅญไธญ็้ซ้็ผๅญไธญ่ฏปๅ่ฟไธชๅ้็ๅผ๏ผ็ปๆๆฐธ่ฟๆฏๆงๅผ ๆญฅ้ชคไธ ่งฃๅณๆนๆณ volatile๏ผๆๅๅ
ณ้ฎๅญ๏ผ ๅฎๅฏไปฅ็จๆฅไฟฎ้ฅฐๆๅๅ้ๅ้ๆๆๅๅ้๏ผๅฎๅฏไปฅ้ฟๅ
็บฟ็จไป่ชๅทฑ็ๅทฅไฝ็ผๅญไธญๆฅๆพๅ้็ๅผ๏ผๅฟ
้กปๅฐไธปๅญไธญ่ทๅๅฎ็ๅผ๏ผ็บฟ็จๆไฝ volatile ๅ้้ฝๆฏ็ดๆฅๆไฝไธปๅญ ๅฏ่งๆง VS ๅๅญๆง ๅ้ขไพๅญไฝ็ฐ็ๅฎ้
ๅฐฑๆฏๅฏ่งๆง๏ผๅฎไฟ่ฏ็ๆฏๅจๅคไธช็บฟ็จไน้ด๏ผไธไธช็บฟ็จๅฏน volatile ๅ้็ไฟฎๆนๅฏนๅฆไธไธช็บฟ็จๅฏ่ง๏ผไธ่ฝไฟ่ฏๅๅญๆง๏ผไป
็จๅจไธไธชๅ็บฟ็จ๏ผๅคไธช่ฏป็บฟ็จ็ๆ
ๅต๏ผไธไพไปๅญ่็ ็่งฃๆฏ่ฟๆ ท็๏ผ getstatic run // ็บฟ็จ t ่ทๅ run true getstatic run // ็บฟ็จ t ่ทๅ run true getstatic run // ็บฟ็จ t ่ทๅ run true getstatic run // ็บฟ็จ t ่ทๅ run true putstatic run // ็บฟ็จ main ไฟฎๆน run ไธบ false๏ผ ไป
ๆญคไธๆฌก getstatic run // ็บฟ็จ main ไฟฎๆน run ไธบ false ๆฏ่พไธไธไนๅๆไปฌๅฐ็บฟ็จๅฎๅ
จๆถไธพ็ไพๅญ๏ผไธคไธช็บฟ็จไธไธช i++ ไธไธช i- -๏ผๅช่ฝไฟ่ฏ็ๅฐๆๆฐๅผ๏ผไธ่ฝ่งฃๅณๆไปคไบค้ // ๅ่ฎพi็ๅๅงๅผไธบ0 getstatic i // ็บฟ็จ2-่ทๅ้ๆๅ้i็ๅผ ็บฟ็จๅ
i=0 getstatic i // ็บฟ็จ1-่ทๅ้ๆๅ้i็ๅผ ็บฟ็จๅ
i=0 iconst_1 // ็บฟ็จ1-ๅๅคๅธธ้1 iadd // ็บฟ็จ1-่ชๅข ็บฟ็จๅ
i=1 putstatic i // ็บฟ็จ1-ๅฐไฟฎๆนๅ็ๅผๅญๅ
ฅ้ๆๅ้i ้ๆๅ้i=1 iconst_1 // ็บฟ็จ2-ๅๅคๅธธ้1 isub // ็บฟ็จ2-่ชๅ ็บฟ็จๅ
i=-1 putstatic i // ็บฟ็จ2-ๅฐไฟฎๆนๅ็ๅผๅญๅ
ฅ้ๆๅ้i ้ๆๅ้i=-1 Synchronized ่ฏญๅฅๅๆขๅฏไปฅไฟ่ฏไปฃ็ ๅ็ๅๅญๆง๏ผไนๅๆถไฟ่ฏไปฃ็ ๅๅ
ๅ้็ๅฏ่งๆงใไฝ็ผบ็นๆฏ Synchronized ๆฏๅฑไบ้้็บงๆไฝ๏ผๆง่ฝ็ธๅฏนๆดไฝ ๅฆๆๅจๅ้ข็คบไพ็ๆญปๅพช็ฏไธญๅ ๅ
ฅ System.out.println() ไผๅ็ฐๅณไฝฟไธๅ volatile ไฟฎ้ฅฐ็ฌฆ๏ผ็บฟ็จtไน่ฝๆญฃ็กฎ็ๅฐๅฏน run ๅ้็ไฟฎๆนไบ๏ผ่ฏทๆ่ไธไธไธบไปไน๏ผ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:5:2","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๆๅบๆง JVMไผๅจไธๅฝฑๅๆญฃ็กฎๆง็ๅๆไธ๏ผๅฏไปฅ่ฐๆด่ฏญๅฅ็ๆง่ก้กบๅบ๏ผๆ่ไธไธไธ้ขไธๆฎตไปฃ็ static int i; static int j; // ๅจๆไธช็บฟ็จๅ
ๆง่กๅฆไธ่ตๅผๆไฝ i = ...; j = ...; ๅฏไปฅ็ๅฐ๏ผ่ณไบๆฏๅ
ๆง่ก i ่ฟๆฏๅ
ๆง่ก j๏ผๅฏนๆ็ป็ปๆไธไผไบง็ๅฝฑๅใๆไปฅ๏ผไธ้ขไปฃ็ ็ๆญฃๆง่กๆถ๏ผๆขๅฏไปฅๆฏ i = ...; j = ...; ไนๅฏไปฅๆฏ j = ...; i = ...; ่ฟ็ง็นๆง็งฐไนไธบใๆไปค้ๆใ๏ผๅค็บฟ็จไธใๆไปค้ๆใไผๅฝฑๅๆญฃ็กฎๆง๏ผไธบไปไน่ฆๆ้ๆๆไปค่ฟ้กนไผๅๅข๏ผ **ๆ็คบ๏ผ**ไปCPUๆง่กๆไปค็ๅ็่งๅบฆๆ่ ๆไปค็บงๅนถ่ก ่ฏกๅผ็็ปๆ int num = 0; boolean ready = false; // ็บฟ็จ1 ๆง่กๆญคๆนๆณ public void actor1(I_Result r) { if(ready) { r.r1 = num + num; } else { r.r1 = 1; } } // ็บฟ็จ2 ๆง่กๆญคๆนๆณ public void actor2(I_Result r) { num = 2; ready = true; } I_Result ๆฏไธไธชๅฏน่ฑก๏ผๆไธไธชๅฑๆง r1 ็จๆฅไฟๅญ็ปๆ๏ผ้ฎ๏ผๅฏ่ฝ็ปๆๆๅ ็ง๏ผ ๆไบๅๅญฆๅฏ่ฝไผ่ฟไนๅๆ๏ผ **ๆ
ๅต1๏ผ**็บฟ็จ1ๅ
ๆง่ก๏ผ่ฟๆถ ready=false๏ผๆไปฅ่ฟๅ
ฅ else ๅๆฏ็ปๆไธบ1 **ๆ
ๅต2๏ผ**็บฟ็จ2ๅ
ๆง่ก num=2๏ผไฝๆฒกๆฅๅพๅๆง่ก ready=true๏ผ็บฟ็จ1ๆง่ก๏ผ่ฟๆฏ่ฟๅ
ฅelseๅๆฏ๏ผ็ปๆไธบ1 **ๆ
ๅต3๏ผ**็บฟ็จ2ๆง่กๅฐ ready=true๏ผ็บฟ็จ1ๆง่ก๏ผ่ฟๅ่ฟๅ
ฅ if ๅๆฏ๏ผ็ปๆไธบ4๏ผๅ ไธบ num ๅทฒ็ปๆง่ก่ฟไบ๏ผ ็นๆฎๆ
ๅต๏ผๆไผๅ่ฏไฝ ็ปๆๅฏ่ฝไธบ0 ่ฟ็งๆ
ๅตๆฏ๏ผ็บฟ็จ3ๆง่ก ready=true๏ผๅๆข็บฟ็จ1๏ผ่ฟๅ
ฅ if ๅๆฏ๏ผ็ธๅ ไธบ0๏ผๅๅๅ็บฟ็จ2ๆง่ก num=2ใ็ธไฟกๅพๅคๅๅญฆๅทฒ็ปๆไบ ่ฟ็ง็ฐ่ฑกๅซๅๆไปค้ๆ๏ผๆฏJIT็ผ่ฏๅจๅจ่ฟ่กๆถ่ฟ่ก็ไธไบไผๅ๏ผ่ฟไธช็ฐ่ฑก้่ฆ้่ฟๅคง้ๆต่ฏๆ่ฝๅค็ฐ๏ผ ๅๅฉJavaๅนถๅๅๆตๅทฅๅ
ท jcstress mvn archetype:generate -DinteractiveMode=false -DarchetypeGroupId=org.openjdk.jcstress -DarchetypeArtifactId=jcstress-java-test-archetype -DarchetypeVersion=0.5 -DgroupId=cn.itcast -DartifactId=ordering -Dversion=1.0 ๅๅปบ maven ้กน็ฎ๏ผๆไพไปฅไธๆต่ฏ็ฑป @JCStressTest @Outcome(id = {\"1\", \"4\"}, expect = Expect.ACCEPTABLE, desc = \"ok\") @Outcome(id = \"0\", expect = Expect.ACCEPTABLE_INTERESTING, desc = \"!!!!\") @State public class ConcurrencyTest { int num = 0; boolean ready = false; @Actor public void actor1(I_Result r) { if(ready) { r.r1 = num + num; } else { r.r1 = 1; } } @Actor public void actor2(I_Result r) { num = 2; ready = true; } } ๆง่กๆนๅผ mvn clean install java -jar target/jcstress.jar ไผ่พๅบๆไปฌๆๅ
ด่ถฃ็็ปๆ๏ผๆๅฝๅ
ถไธญไธๆฌก็ปๆ๏ผ jcstressๆง่ก็ปๆ ๅฏไปฅ็ๅฐ๏ผๅบ็ฐ็ปๆไธบ0็ๆ
ๅตๆ638ๆฌก๏ผ่ฝ็ถๆฌกๆฐ็ธๅฏน่พๅฐ๏ผไฝๆฏ็ซๆฏๅบ็ฐไบ ่งฃๅณๆนๆณ volatile ไฟฎ้ฅฐ็ๅ้๏ผๅฏไปฅ็ฆ็จๆไปค้ๆ @JCStressTest @Outcome(id = {\"1\", \"4\"}, expect = Expect.ACCEPTABLE, desc = \"ok\") @Outcome(id = \"0\", expect = Expect.ACCEPTABLE_INTERESTING, desc = \"!!!!\") @State public class ConcurrencyTest { int num = 0; volatile boolean ready = false; @Actor public void actor1(I_Result r) { if(ready) { r.r1 = num + num; } else { r.r1 = 1; } } @Actor public void actor2(I_Result r) { num = 2; ready = true; } } ่พๅบ็ปๆ *** INTERESTING tests Some interesting behaviors observed. This is for the plain curiosity. 0 matching test results. Happens-before Happens-befor ่งๅฎไบๅฏนๅ
ฑไบซๅ้็ๅๆไฝๅฏนๅ
ถๅฎ็บฟ็จ็่ฏปๆไฝๅฏ่ง๏ผๅฎๆฏๅฏ่งๆงไธๆๅบๆง็ไธๅฅ่งๅๆป็ป๏ผๆๅผไธไธhappens-before่งๅ๏ผJMMๅนถไธ่ฝไฟ่ฏไธไธช็บฟ็จๅฏนๅ
ฑไบซๅ้็ๅ๏ผๅฏนไบๅ
ถไป็บฟ็จๅฏน่ฏฅๅ
ฑไบซๅ้็่ฏปๅฏ่ง ็บฟ็จ่งฃ้mไนๅๅฏนๅ้็ๅ๏ผๅฏนไบๆฅไธๆฅๅฏนmๅ ้็ๅ
ถไป็บฟ็จๅฏน่ฏฅๅ้็่ฏปๅฏ่ง static int x; static Object m = new Object(); new Thread(()-\u003e{ synchronized(m) { x = 10; } },\"t1\").start(); new Thread(()-\u003e{ synchronized(m) { System.out.println(x); } },\"t2\").start(); ็บฟ็จๅฏน volatile ๅ้็ๅ๏ผๅฏนๆฅไธๆฅๅ
ถๅฎ็บฟ็จๅฏน่ฏฅๅ้็่ฏปๅฏ่ง volatile static int x; new Thread(()-\u003e{ x = 10; },\"t1\").start(); new Thread(()-\u003e{ System.out.println(x); },\"t2\").start(); ็บฟ็จ start ๅๅฏนๅ้็ๅ๏ผๅฏน่ฏฅ็บฟ็จๅผๅงๅๅฏน่ฏฅๅ้็่ฏปๅฏ่ง static int x; x = 10; new Thread(()-\u003e{ System.out.println(x); },\"t2\").start(); ็บฟ็จ็ปๆๅๅฏนๅ้็ๅ๏ผๅฏนๅ
ถไป็บฟ็จๅพ็ฅๅฎ็ปๆๅ็่ฏปๅฏ่ง๏ผๆฏๅฆๅ
ถๅฎ็บฟ็จ่ฐ็จ t1.isAlive() ๆ t1.join() ็ญๅพ
ๅฎ็ปๆ๏ผ static int x; Thread t1 = new Thread(()-\u003e{ x = 10; },\"t1\"); t1.start(); t1.join(); System.out.println(x); ็บฟ็จ t1 ๆๆญ t2๏ผinterrupt๏ผๅๅฏนๅ้็ๅ๏ผๅฏนไบๅ
ถไป็บฟ็จๅพ็ฅ t2 ่ขซๆๆญๅๅฏนๅ้็่ฏปๅฏ่ง๏ผ้่ฟt2.interrupted ๆ t2.isInterruped๏ผ static int x; public static void main(String[] args) { Thread t2 = new Thread(()-\u003e{ while(true) { if(Thread.currentThread().isInterrupted()) { System.out.println(x); break; } } },\"t2\"); t2.start(); new Thread(()-\u003e{ sleep(1); x = 10; t2.interrupt(); },\"t1\").start(); while(!t2.isInterrupted()) { Thread.yield(); } System.out.println(x); } ๅฏนๅ้้ป่ฎคๅผ๏ผ0๏ผfalse๏ผnull๏ผ็ๅ๏ผๅฏนๅ
ถๅฎ็บฟ็จๅฏน่ฏฅๅ้็่ฏปๅฏ่ง ๅ
ทๆไผ ้ๆง๏ผๅฆๆx hb -\u003e yๅนถไธx hb -\u003e z๏ผ้
ๅ volatile ็้ฒๆไปค้ๆ๏ผๆไธ้ข็ไพๅญ volatile static int x; static int y; new Thread(()-\u003e{ y = 10; x = 20; },\"t1\").start(); new Thread(()-\u003e{ // x=20 ๅฏน t2 ๅฏ่ง, ๅๆถ y=10 ไนๅฏน t2 ๅฏ่ง System.out.println(x); },\"t2\").start(); ๅ้้ฝๆฏๆๆๅๅ้ๆ้ๆๆๅๅ้ ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:5:3","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅฐ็ป ้็น่ฎฒ่งฃไบJMMไธญ็ ๅฏ่งๆง - ็ฑ JVM ็ผๅญไผๅๅผ่ตท ๆๅบๆง - ็ฑ JVM ๆไปค้ๆๅบไผๅๅผ่ตท happen-before ่งๅ ๅ็ๆน้ข CPU ๆไปคๅนถ่ก volatile ๆจกๅผๆน้ข ไธค้ถๆฎต็ปๆญขๆจกๅผ็ volatile ๆน่ฟ ๅๆญฅๆจกๅผ - balking ","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:5:4","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Technology"],"content":"ๅ
ฑไบซๆจกๅๆ ้","date":"2023-10-07","objectID":"/blog/20231007_concurrent/:6:0","tags":["Java","ๅค็บฟ็จ","้ซๅนถ่ก","้ซๅนถๅ","่ฎพ่ฎกๆจกๅผ","study"],"title":"ๅนถๅ็ผ็จ","uri":"/blog/20231007_concurrent/"},{"categories":["Go"],"content":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","date":"2023-08-05","objectID":"/blog/go/","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ Go ่ฏญ่จๅ
ฅ้จๆๅ๏ผๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ Go ่ฏญ่จๆฏ็ฑ Google ๅจ 2007 ๅนดๅผๅ็ไธ็งๆฐ็็ผ็จ่ฏญ่จ๏ผๅฎๅ
ทๆ็ฎๅใๅฟซ้ใๅฏ้ ๅๅฎๅ
จ็ญไผ็น๏ผๅทฒ็ปๆไธบไบ่ฝฏไปถๅผๅ้ขๅ็ไธ็ง้่ฆๅทฅๅ
ทใๆฌๆๅฐไป็ป Go ่ฏญ่จ็ๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง๏ผๅนถๆไพไธไบไฝฟ็จ็คบไพ๏ผๅธฎๅฉไฝ ๅฟซ้ๅ
ฅ้จ Go ่ฏญ่จใ ","date":"2023-08-05","objectID":"/blog/go/:0:0","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"ไธใๅบ็ก่ฏญๆณ ","date":"2023-08-05","objectID":"/blog/go/:1:0","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"1. ๅ้ๅ็ฑปๅ ๅจ Go ่ฏญ่จไธญ๏ผๅ้ๅฟ
้กปๅ
ๅฃฐๆๅๆ่ฝไฝฟ็จใๅฃฐๆๅ้ๆถ้่ฆๆๅฎๅ้็ฑปๅๅๅ้ๅใ // ๅฃฐๆๆดๅๅ้ var num int = 10 // ๅฃฐๆๆตฎ็นๅๅ้ var decimal float64 = 3.14 ้คไบๆดๅๅๆตฎ็นๅ๏ผGo ่ฏญ่จ่ฟๆฏๆๅ
ถไป็ฑปๅ๏ผๅฆๅญ็ฌฆไธฒใๅธๅฐๅใๆฐ็ปใๅ็ใ็ปๆไฝ็ญใ ","date":"2023-08-05","objectID":"/blog/go/:1:1","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"2. ่ตๅผๅ่ฟ็ฎ็ฌฆ Go ่ฏญ่จๆฏๆๅธธ็จ็็ฎๆฏ่ฟ็ฎ็ฌฆใๆฏ่พ่ฟ็ฎ็ฌฆใ้ป่พ่ฟ็ฎ็ฌฆๅไฝ่ฟ็ฎ็ฌฆใๅฏไปฅไฝฟ็จ็ญๅท๏ผ=๏ผ็ปๅ้่ตๅผใ Copy code // ่ฎก็ฎ 1+1 ็็ปๆ var sum int = 1 + 1 // ๆฏ่พไธคไธชๆฐๆฏๅฆ็ธ็ญ if num == 10 { fmt.Println(\"num is equal to 10\") } // ้ป่พๆ่ฟ็ฎ็ฌฆ if num == 1 || num == 2 { fmt.Println(\"num is either 1 or 2\") } ","date":"2023-08-05","objectID":"/blog/go/:1:2","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"3. ๆงๅถๆตๅๅฝๆฐ Go ่ฏญ่จๆฏๆ ifใelseใelse if ๅ for ็ญๆงๅถๆต่ฏญๅฅใ่ฟๅฏไปฅๅฎไนๅฝๆฐๆฅๅฐ่ฃ
ๅธธ็จ็ไปฃ็ ๅใ // ๅคๆญไธไธชๆฐๆฏๅฆๆฏๅถๆฐ func isEven(num int) bool { return num%2 == 0 } // ๅพช็ฏๆๅฐๅ n ไธชๆๆณข้ฃๅฅๆฐๅ func fibonacci(n int) { if n \u003c= 1 { return } fibonacci(n-1) + fibonacci(n-2) } // ๅฝๆฐ่ฟๅๅผ็ฑปๅ func max(x, y int) int { if x \u003e y { return x } return y } ","date":"2023-08-05","objectID":"/blog/go/:1:3","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"ๅธธ็จ่ฏญๆณๅ่ฝ ๅญ็ฌฆไธฒๅฃฐๆๅไฝฟ็จ ๅญ็ฌฆไธฒๅฃฐๆ่ฏญๆณไธบ๏ผconst( ๅญ็ฌฆไธฒๅ = \"ๅญ็ฌฆไธฒๅผ\")๏ผไพๅฆ๏ผconst hello = \"Hello, world!\"ใ ๅญ็ฌฆไธฒไฝฟ็จ่ฏญๆณไธบ๏ผๅญ็ฌฆไธฒๅ๏ผไพๅฆ๏ผhelloใ ๅฝๆฐๅฃฐๆๅ่ฐ็จ ๅฝๆฐๅฃฐๆ่ฏญๆณไธบ๏ผfunc ๅฝๆฐๅ(ๅๆฐๅ่กจ) ่ฟๅๅผ็ฑปๅ๏ผไพๅฆ๏ผfunc add(x, y int) int { return x + y }ใ ๅฝๆฐ่ฐ็จ่ฏญๆณไธบ๏ผๅฝๆฐๅ(ๅๆฐๅ่กจ)๏ผไพๅฆ๏ผresult = add(1, 2)ใ ๆงๅถๆต็จ go่ฏญ่จๆฏๆๅค็งๆงๅถๆต็จ็ปๆ๏ผๅ
ๆฌif่ฏญๅฅใforๅพช็ฏใrangeๅพช็ฏใๅฝๆฐๅswitch่ฏญๅฅ็ญใ if่ฏญๅฅ่ฏญๆณไธบ๏ผif ๆกไปถ่ฏญๅฅ { ๆกไปถไธบ็ๆถ็่ฏญๅฅ } else { ๆกไปถไธบๅๆถ็่ฏญๅฅ }๏ผ ไพๅฆ๏ผif x \u003e 0 { // xๆฏๆญฃๆฐ } else { // xๆฏ่ดๆฐๆ้ถ }ใ forๅพช็ฏ่ฏญๆณไธบ๏ผfor ๅๅงๅ่ฏญๅฅ; ๆกไปถ่ฏญๅฅ; ๆดๆฐ่ฏญๅฅ { ๅพช็ฏไฝ }๏ผ ไพๅฆ๏ผfor i := 0; i \u003c 10; i++ { // ๆๅฐi }ใ rangeๅพช็ฏ่ฏญๆณไธบ๏ผfor ๅ้ๅ := ๅๅงๅ่กจ่พพๅผ; ๆกไปถ่ฏญๅฅ; ๅ้ๅ++ { ๅพช็ฏไฝ }๏ผ ไพๅฆ๏ผfor i := 0; i \u003c 10; i++ { // ๆๅฐi }ใ ๅฝๆฐ่ฏญๆณไธบ๏ผfunc ๅฝๆฐๅ(ๅๆฐๅ่กจ) ่ฟๅๅผ็ฑปๅ { ๅฝๆฐไฝ }๏ผ ไพๅฆ๏ผfunc max(x, y int) int { if x \u003e y { return x } else { return y } }ใ switch่ฏญๅฅ่ฏญๆณไธบ๏ผswitch ่กจ่พพๅผ { case ๅธธ้1: ่ฏญๅฅ1; case ๅธธ้2: ่ฏญๅฅ2; ... default: ่ฏญๅฅ default }๏ผ ไพๅฆ๏ผswitch x := 5; x { case 1: fmt.Println(\"xๆฏ1\") case 2: fmt.Println(\"xๆฏ2\") default: fmt.Println(\"xไธๆฏ1ไนไธๆฏ2\") }ใ ","date":"2023-08-05","objectID":"/blog/go/:1:4","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"ไบใๅธธ็จ็นๆง ","date":"2023-08-05","objectID":"/blog/go/:2:0","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"1. ๅ็ๅๅ็ๆไฝ ๅ็ๆฏไธ็งๆฐๆฎ็ปๆ๏ผๅฎๅฏไปฅๅจๆๅฐๅ้
ๅ
ๅญ๏ผๅนถไธๅฏไปฅๅฟซ้ๅฐ่ฟ่ก็ดขๅผๅๆไฝใๅ็ๆไฝๅ
ๆฌ๏ผๅๅงๅใๅ็ๅคงๅฐ็ๆนๅใๅ็ๅ
็ด ็ๆทปๅ ๅๅ ้คใๅ็ๅ
็ด ็ๆฅๆพๅๆฟๆข็ญใ ","date":"2023-08-05","objectID":"/blog/go/:2:1","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"2. ๅญๅ
ธๅๅญๅ
ธๆไฝ ๅญๅ
ธๆฏไธ็ง้ฎๅผๅฏน็ๆฐๆฎ็ปๆ๏ผๅฎๅฏไปฅๅฟซ้ๅฐ่ฟ่กๆฅๆพๅๅ ้คๆไฝใๅญๅ
ธๆไฝๅ
ๆฌ๏ผๅๅงๅใๅญๅ
ธๅคงๅฐ็ๆนๅใๅญๅ
ธๅ
็ด ็ๆทปๅ ๅๅ ้คใๅญๅ
ธๅ
็ด ็ๆฅๆพๅๆฟๆข็ญใ ","date":"2023-08-05","objectID":"/blog/go/:2:2","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"3. ๅฝๆฐๅๅฝๆฐ่ฐ็จ go่ฏญ่จๆฏๆๅฝๆฐๅผ็ผ็จ้ฃๆ ผ๏ผๅฝๆฐๅฏไปฅไฝไธบๅๆฐไผ ้๏ผไนๅฏไปฅไฝไธบ่ฟๅๅผ่ฟๅใๅฝๆฐ่ฐ็จๅฏไปฅไฝฟ็จ็นๅทๆ่
ๆฌๅท๏ผ็นๅท็จไบ่ฐ็จๅ
ๅ
็ๅฝๆฐ๏ผๆฌๅท็จไบ่ฐ็จๅ
ๅค็ๅฝๆฐใ ","date":"2023-08-05","objectID":"/blog/go/:2:3","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"4. ๆฅๅฃๅๆฅๅฃ่ฐ็จ go่ฏญ่จๆฏๆๆฅๅฃ็ผ็จ๏ผๆฅๅฃๅฏไปฅ่ขซๅคไธช็ฑปๅๅฎ็ฐ๏ผๆฅๅฃ่ฐ็จๅฏไปฅไฝฟ็จ็นๅทๆ่
ๆฌๅท๏ผ็นๅท็จไบ่ฐ็จๅ
ๅ
็ๆฅๅฃๆนๆณ๏ผๆฌๅท็จไบ่ฐ็จๅ
ๅค็ๆฅๅฃๆนๆณใ ","date":"2023-08-05","objectID":"/blog/go/:2:4","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"5. ๅนถๅๅๅ็จ Go ่ฏญ่จๆฏๆๅนถๅๅๅ็จ๏ผๅฏไปฅไฝฟ็จ Goroutine ๅ Channel ๅฎ็ฐๅนถๅ็ผ็จใ // ๅๅปบไธไธช Goroutine go func() { fmt.Println(\"Hello, world!\") }() // ้้ไผ ้ๆฐๆฎ var ch = make(chan int) go func() { ch \u003c- 1 }() // ๆฅๆถ้้ๆฐๆฎ fmt.Println(\u003c-ch) ","date":"2023-08-05","objectID":"/blog/go/:2:5","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"6. ้่ฏฏๅค็ Go ่ฏญ่จๆฏๆ้่ฏฏๅค็๏ผๅฏไปฅไฝฟ็จ error ็ฑปๅๆฅ่กจ็คบ้่ฏฏ๏ผๅนถไฝฟ็จ panic ๅ recover ๅฝๆฐๆฅๅค็้่ฏฏใ // ๅ้ๆฐๆฎๅฐ็ฝ็ป้้ func sendToChannel(conn net.Conn) error { _, err := conn.Write([]byte(\"Hello, world!\")) return err } // recover ๅฝๆฐๆๆ panic ็ๆ็้่ฏฏ func main() { defer func() { recover() fmt.Println(\"Recovered from panic\") }() // panic ็ๆ้่ฏฏ panic(\"This is a panic\") } ","date":"2023-08-05","objectID":"/blog/go/:2:6","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Go"],"content":"7. ๅ
ๅๆจกๅ Go ่ฏญ่จๆฏๆๅ
ๅๆจกๅ๏ผๅฏไปฅไฝฟ็จ import ่ฏญๅฅๅฏผๅ
ฅ้่ฆไฝฟ็จ็ๅ
ๅๆจกๅ๏ผๅนถไฝฟ็จ Exported ๅฝๆฐ่ทๅๅ
ๅ
็ๅฏๅฏผๅบๅ้ๅๅฝๆฐใ // ๅฏผๅ
ฅๆ ๅๅบ import ( \"fmt\" \"math\" ) // ๅฏผๅ
ฅ่ชๅฎไนๅ
import \"path/filepath\" // ่ทๅๅฏผๅ
ฅๅ
ๅ
็ๅฏๅฏผๅบๅ้ๅๅฝๆฐ func max(x, y int) int { if x \u003e y { return x } return y } // ๆๅฐ็ปๆ func main() { fmt.Println(max(1, 2)) fmt.Println(math.Sqrt(4)) filepath.Println(\"hello\") } ","date":"2023-08-05","objectID":"/blog/go/:2:7","tags":["Go","study"],"title":"Goๅบ็ก่ฏญๆณๅๅธธ็จ็นๆง่งฃๆ","uri":"/blog/go/"},{"categories":["Java"],"content":"Streamๆต","date":"2023-05-22","objectID":"/blog/20230522_stream/","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"๐ไป็ป ไธ็ฏๆ็ซ Lambdaๅธธ่งๅบๆฏ็จๆณไธญๅทฒ็ป้ดๆฅไฝฟ็จๅฐไบStreamๆไฝ๏ผไฝ ๅฏ่ฝๅฝๆถไผๆไบ็้ฎ๏ผ้ฎไปไนไผไฝฟ็จStreamๆตๅข๏ผๅฎๅฐๅบๆฏ็จๆฅๅนฒไปไน็ๅข๏ผ Java 8 ๅผๅ
ฅไบๅ
จๆฐ็Stream APIใ่ฟ้็StreamๅI/Oๆตไธๅ๏ผๅฎๆดๅๅ
ทๆIterable็้ๅ็ฑป๏ผไฝ่กไธบๅ้ๅ็ฑปๅๆๆไธๅใ Stream APIๅผๅ
ฅ็็ฎ็ๅจไบๅผฅ่กฅJavaๅฝๆฐๅผ็ผ็จ็็ผบ้ทใๅฏนไบๅพๅคๆฏๆๅฝๆฐๅผ็ผ็จ็่ฏญ่จ๏ผmap()ใreduce()ๅบๆฌไธ้ฝๅ
็ฝฎๅฐ่ฏญ่จ็ๆ ๅๅบไธญไบ๏ผไธ่ฟ๏ผJava 8็Stream APIๆปไฝๆฅ่ฎฒไป็ถๆฏ้ๅธธๅฎๅๅๅผบๅคง๏ผ่ถณไปฅ็จๅพๅฐ็ไปฃ็ ๅฎๆ่ฎธๅคๅคๆ็ๅ่ฝใ ","date":"2023-05-22","objectID":"/blog/20230522_stream/:1:0","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"ไฝ้ชStreamๆต ๆกไพ้ๆฑ ๆ็
งไธ้ข็่ฆๆฑๅฎๆ้ๅ็ๅๅปบๅ้ๅ ๅๅปบไธไธช้ๅ๏ผๅญๅจๅคไธชๅญ็ฌฆไธฒๅ
็ด ๆ้ๅไธญๆๆไปฅ\"ๅผ \"ๅผๅคด็ๅ
็ด ๅญๅจๅฐไธไธชๆฐ็้ๅ ๆ\"ๅผ \"ๅผๅคด็้ๅไธญ็้ฟๅบฆไธบ3็ๅ
็ด ๅญๅจๅฐไธไธชๆฐ็้ๅ ้ๅไธไธๆญฅๅพๅฐ็้ๅ โ ๅๅงๆนๅผ็คบไพไปฃ็ public class MyStream { public static void main(String[] args) { //้ๅ็ๆน้ๆทปๅ ArrayList\u003cString\u003e list1 = new ArrayList\u003c\u003e(List.of(\"ๅผ ไธไธฐ\",\"ๅผ ๆ ๅฟ\",\"ๅผ ็ฟ ๅฑฑ\",\"็ไบ้บปๅญ\",\"ๅผ ่ฏ\",\"่ฐขๅนฟๅค\")); //list.add() //้ๅlist1ๆไปฅๅผ ๅผๅคด็ๅ
็ด ๆทปๅ ๅฐlist2ไธญใ ArrayList\u003cString\u003e list2 = new ArrayList\u003c\u003e(); for (String s : list1) { if(s.startsWith(\"ๅผ \")){ list2.add(s); } } //้ๅlist2้ๅ๏ผๆๅ
ถไธญ้ฟๅบฆไธบ3็ๅ
็ด ๏ผๅๆทปๅ ๅฐlist3ไธญใ ArrayList\u003cString\u003e list3 = new ArrayList\u003c\u003e(); for (String s : list2) { if(s.length() == 3){ list3.add(s); } } for (String s : list3) { System.out.println(s); } } } โ
ไฝฟ็จStreamๆต็คบไพไปฃ็ public class StreamDemo { public static void main(String[] args) { //้ๅ็ๆน้ๆทปๅ ArrayList\u003cString\u003e list1 = new ArrayList\u003c\u003e(List.of(\"ๅผ ไธไธฐ\",\"ๅผ ๆ ๅฟ\",\"ๅผ ็ฟ ๅฑฑ\",\"็ไบ้บปๅญ\",\"ๅผ ่ฏ\",\"่ฐขๅนฟๅค\")); //Streamๆต list1.stream().filter(s-\u003es.startsWith(\"ๅผ \")) .filter(s-\u003es.length() == 3) .forEach(s-\u003e System.out.println(s)); } } Stream็ๅฅฝๅค ็ดๆฅ้
่ฏปไปฃ็ ็ๅญ้ขๆๆๅณๅฏๅฎ็พๅฑ็คบๆ ๅ
ณ้ป่พๆนๅผ็่ฏญไน๏ผ่ทๅๆต๏ผ่ฟๆปคๅงๅผ ๏ผ่ฟๆปค้ฟๅบฆไธบ3๏ผ้ไธๆๅฐ Streamๆตๆ็ๆญฃ็ๅฝๆฐๅผ็ผ็จ้ฃๆ ผๅผๅ
ฅๅฐไบJavaไธญ ไปฃ็ ็ฎๆด ","date":"2023-05-22","objectID":"/blog/20230522_stream/:2:0","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"โ ๏ธStreamๆต็ๆๆณ Streamๆตๆๆณ Streamๆต็ไธ็ฑปๆนๆณ ่ทๅStreamๆต ๅๅปบไธๆกๆตๆฐด็บฟ๏ผๅนถๆๆฐๆฎๆพๅฐๆตๆฐด็บฟไธๅๅค่ฟ่กๆไฝ ไธญ้ดๆนๆณ ๆตๆฐด็บฟไธ็ๆไฝ ไธๆฌกๆไฝๅฎๆไนๅ๏ผ่ฟๅฏไปฅ็ปง็ปญ่ฟ่กๅ
ถไปๆไฝ ็ป็ปๆนๆณ ไธไธชStreamๆตๅช่ฝๆไธไธช็ป็ปๆนๆณ ๆฏๆตๆฐด็บฟไธ็ๆๅไธไธชๆไฝ ","date":"2023-05-22","objectID":"/blog/20230522_stream/:2:1","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"โฅ๏ธStreamๆต่ทๅๆนๅผ ่ทๅๆนๅผ ๆนๆณๅ ่ฏดๆ ๅๅ้ๅ default Stream \u003cE\u003e stream Collectionไธญ็้ป่ฎคๆนๆณ ๅๅ้ๅ ๆ ๆ ๆณ็ดๆฅไฝฟ็จStream ๆฐ็ป public static \u003cT\u003e Stream \u003cT\u003e stream(T[] array) Arraysๅทฅๅ
ท็ฑปไธญ็้ๆๆนๆณ ้ถๆฃๆฐๆฎ public static \u003cT\u003e Stream \u003cT\u003e of(Tโฆvalues) Streamๆฅๅฃไธญ็้ๆๆนๆณ Collectionไฝ็ณป้ๅ ไฝฟ็จ้ป่ฎคๆนๆณstream()็ๆๆต Mapไฝ็ณป้ๅ ๆMap่ฝฌๆSet็ปๅ๏ผ้ดๆฅ็็ๆๆต ๆฐ็ป โ ้่ฟArraysไธญ็้ๆๆนๆณstrean็ๆๆต ๅ็งๆฐๆฎ็ฑปๅ็ๅคไธชๆฐๆฎ ้่ฟStreamๆฅๅฃ็้ๆๆนๆณof(Tโฆvalues)็ๆๆต ไปฃ็ ๆผ็คบ public class StreamDemo { public static void main(String[] args) { //Collectionไฝ็ณป็้ๅๅฏไปฅไฝฟ็จ้ป่ฎคๆนๆณstream()็ๆๆต List\u003cString\u003e list = new ArrayList\u003cString\u003e(); Stream\u003cString\u003e listStream = list.stream(); Set\u003cString\u003e set = new HashSet\u003cString\u003e(); Stream\u003cString\u003e setStream = set.stream(); //Mapไฝ็ณป็้ๅ้ดๆฅ็็ๆๆต Map\u003cString,Integer\u003e map = new HashMap\u003cString, Integer\u003e(); Stream\u003cString\u003e keyStream = map.keySet().stream(); Stream\u003cInteger\u003e valueStream = map.values().stream(); Stream\u003cMap.Entry\u003cString, Integer\u003e\u003e entryStream = map.entrySet().stream(); //ๆฐ็ปๅฏไปฅ้่ฟArraysไธญ็้ๆๆนๆณstream็ๆๆต String[] strArray = {\"hello\",\"world\",\"java\"}; Stream\u003cString\u003e strArrayStream = Arrays.stream(strArray); //ๅ็งๆฐๆฎ็ฑปๅ็ๅคไธชๆฐๆฎๅฏไปฅ้่ฟStreamๆฅๅฃ็้ๆๆนๆณof(T... values)็ๆๆต Stream\u003cString\u003e strArrayStream2 = Stream.of(\"hello\", \"world\", \"java\"); Stream\u003cInteger\u003e intStream = Stream.of(10, 20, 30); } } ","date":"2023-05-22","objectID":"/blog/20230522_stream/:2:2","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"โฆ๏ธStreamไธญ้ดๆนๆณ ไธญ้ดๆไฝ็ๆๆๆฏ๏ผๆง่กๅฎๆญคๆนๆณๅ๏ผStreamๆตไพ็ถๅฏไปฅ็ปง็ปญๆง่กๅ
ถไปๆไฝ ๆนๆณๅ ่ฏดๆ Stream \u003cT\u003e filter(Predicate predicate) ็จไบๅฏนๆตไธญ็ๆฐๆฎ่ฟ่ก่ฟๆปค Stream \u003cT\u003e limit(long maxSize) ่ฟๅๆญคๆตไธญ็ๅ
็ด ็ปๆ็ๆต๏ผๆชๅๅๆๅฎๅๆฐไธชๆฐ็ๆฐๆฎ Stream \u003cT\u003e skip(long n) ่ทณ่ฟๆๅฎๅๆฐไธชๆฐ็ๆฐๆฎ๏ผ่ฟๅ็ฑ่ฏฅๆต็ๅฉไฝๅ
็ด ็ปๆ็ๆต static \u003cT\u003e Stream \u003cT\u003e concat(Stream a, Stream b) ๅๅนถaๅbไธคไธชๆตไธบไธไธชๆต Stream \u003cT\u003e distinct() ่ฟๅ็ฑ่ฏฅๆต็ไธๅๅ
็ด ๏ผๆ นๆฎObject.equals(Object) ๏ผ็ปๆ็ๆต ๐ฎfilterๆไฝ public class MyStream { public static void main(String[] args) { // Stream\u003cT\u003e filter(Predicate predicate)๏ผ่ฟๆปค // Predicateๆฅๅฃไธญ็ๆนๆณ boolean test(T t)๏ผๅฏน็ปๅฎ็ๅๆฐ่ฟ่กๅคๆญ๏ผ่ฟๅไธไธชๅธๅฐๅผ ArrayList\u003cString\u003e list = new ArrayList\u003c\u003e(); list.add(\"ๆ้้\"); list.add(\"ๅผ ๆผ็\"); list.add(\"็็ฅ่ดค\"); list.add(\"ๆณๅฒฉ\"); list.add(\"ๅผ ๆ\"); list.add(\"ๅผ ๆ ๅฟ\"); //filterๆนๆณ่ทๅๆตไธญ็ ๆฏไธไธชๆฐๆฎ. //่testๆนๆณไธญ็s,ๅฐฑไพๆฌก่กจ็คบๆตไธญ็ๆฏไธไธชๆฐๆฎ. //ๆไปฌๅช่ฆๅจtestๆนๆณไธญๅฏนs่ฟ่กๅคๆญๅฐฑๅฏไปฅไบ. //ๅฆๆๅคๆญ็็ปๆไธบtrue,ๅๅฝๅ็ๆฐๆฎ็ไธ //ๅฆๆๅคๆญ็็ปๆไธบfalse,ๅๅฝๅๆฐๆฎๅฐฑไธ่ฆ. // list.stream().filter( // new Predicate\u003cString\u003e() { // @Override // public boolean test(String s) { // boolean result = s.startsWith(\"ๅผ \"); // return result; // } // } // ).forEach(s-\u003e System.out.println(s)); //ๅ ไธบPredicateๆฅๅฃไธญๅชๆไธไธชๆฝ่ฑกๆนๆณtest //ๆไปฅๆไปฌๅฏไปฅไฝฟ็จlambda่กจ่พพๅผๆฅ็ฎๅ // list.stream().filter( // (String s)-\u003e{ // boolean result = s.startsWith(\"ๅผ \"); // return result; // } // ).forEach(s-\u003e System.out.println(s)); list.stream().filter(s -\u003es.startsWith(\"ๅผ \")).forEach(s-\u003e System.out.println(s)); } } ๐ฎlimit\u0026skipๆไฝ public class StreamDemo { public static void main(String[] args) { //ๅๅปบไธไธช้ๅ๏ผๅญๅจๅคไธชๅญ็ฌฆไธฒๅ
็ด ArrayList\u003cString\u003e list = new ArrayList\u003cString\u003e(); list.add(\"ๆ้้\"); list.add(\"ๅผ ๆผ็\"); list.add(\"็็ฅ่ดค\"); list.add(\"ๆณๅฒฉ\"); list.add(\"ๅผ ๆ\"); list.add(\"ๅผ ๆ ๅฟ\"); //้ๆฑ1๏ผๅๅ3ไธชๆฐๆฎๅจๆงๅถๅฐ่พๅบ list.stream().limit(3).forEach(s-\u003e System.out.println(s)); System.out.println(\"--------\"); //้ๆฑ2๏ผ่ทณ่ฟ3ไธชๅ
็ด ๏ผๆๅฉไธ็ๅ
็ด ๅจๆงๅถๅฐ่พๅบ list.stream().skip(3).forEach(s-\u003e System.out.println(s)); System.out.println(\"--------\"); //้ๆฑ3๏ผ่ทณ่ฟ2ไธชๅ
็ด ๏ผๆๅฉไธ็ๅ
็ด ไธญๅ2ไธชๅจๆงๅถๅฐ่พๅบ list.stream().skip(2).limit(2).forEach(s-\u003e System.out.println(s)); } } ๐ฎconcat\u0026distinctๆไฝ public class StreamDemo { public static void main(String[] args) { //ๅๅปบไธไธช้ๅ๏ผๅญๅจๅคไธชๅญ็ฌฆไธฒๅ
็ด ArrayList\u003cString\u003e list = new ArrayList\u003cString\u003e(); list.add(\"ๆ้้\"); list.add(\"ๅผ ๆผ็\"); list.add(\"็็ฅ่ดค\"); list.add(\"ๆณๅฒฉ\"); list.add(\"ๅผ ๆ\"); list.add(\"ๅผ ๆ ๅฟ\"); //้ๆฑ1๏ผๅๅ4ไธชๆฐๆฎ็ปๆไธไธชๆต Stream\u003cString\u003e s1 = list.stream().limit(4); //้ๆฑ2๏ผ่ทณ่ฟ2ไธชๆฐๆฎ็ปๆไธไธชๆต Stream\u003cString\u003e s2 = list.stream().skip(2); //้ๆฑ3๏ผๅๅนถ้ๆฑ1ๅ้ๆฑ2ๅพๅฐ็ๆต๏ผๅนถๆ็ปๆๅจๆงๅถๅฐ่พๅบ // Stream.concat(s1,s2).forEach(s-\u003e System.out.println(s)); //้ๆฑ4๏ผๅๅนถ้ๆฑ1ๅ้ๆฑ2ๅพๅฐ็ๆต๏ผๅนถๆ็ปๆๅจๆงๅถๅฐ่พๅบ๏ผ่ฆๆฑๅญ็ฌฆไธฒๅ
็ด ไธ่ฝ้ๅค Stream.concat(s1,s2).distinct().forEach(s-\u003e System.out.println(s)); } } ","date":"2023-05-22","objectID":"/blog/20230522_stream/:2:3","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"โฃ๏ธStream็ป็ปๆนๆณ ็ป็ปๆไฝ็ๆๆๆฏ,ๆง่กๅฎๆญคๆนๆณไนๅ,Streamๆตๅฐไธ่ฝๅๆง่กๅ
ถไปๆไฝ ๆนๆณๅ ่ฏดๆ void forEach(Consumer action) ๅฏนๆญคๆต็ๆฏไธชๅ
็ด ๆง่กๆไฝ long count() ่ฟๅๆญคๆตไธญ็ๅ
็ด ๆฐ public class MyStream { public static void main(String[] args) { ArrayList\u003cString\u003e list = new ArrayList\u003c\u003e(); list.add(\"ๆ้้\"); list.add(\"ๅผ ๆผ็\"); list.add(\"็็ฅ่ดค\"); list.add(\"ๆณๅฒฉ\"); list.add(\"ๅผ ๆ\"); list.add(\"ๅผ ๆ ๅฟ\"); //method1(list); // long count()๏ผ่ฟๅๆญคๆตไธญ็ๅ
็ด ๆฐ long count = list.stream().count(); System.out.println(count); } private static void method1(ArrayList\u003cString\u003e list) { // void forEach(Consumer action)๏ผๅฏนๆญคๆต็ๆฏไธชๅ
็ด ๆง่กๆไฝ // Consumerๆฅๅฃไธญ็ๆนๆณvoid accept(T t)๏ผๅฏน็ปๅฎ็ๅๆฐๆง่กๆญคๆไฝ //ๅจforEachๆนๆณ็ๅบๅฑ,ไผๅพช็ฏ่ทๅๅฐๆตไธญ็ๆฏไธไธชๆฐๆฎ. //ๅนถๅพช็ฏ่ฐ็จacceptๆนๆณ,ๅนถๆๆฏไธไธชๆฐๆฎไผ ้็ปacceptๆนๆณ //sๅฐฑไพๆฌก่กจ็คบไบๆตไธญ็ๆฏไธไธชๆฐๆฎ. //ๆไปฅ,ๆไปฌๅช่ฆๅจacceptๆนๆณไธญ,ๅไธๅค็็ไธๅก้ป่พๅฐฑๅฏไปฅไบ. list.stream().forEach( new Consumer\u003cString\u003e() { @Override public void accept(String s) { System.out.println(s); } } ); System.out.println(\"====================\"); //lambda่กจ่พพๅผ็็ฎๅๆ ผๅผ //ๆฏๅ ไธบConsumerๆฅๅฃไธญ,ๅชๆไธไธชacceptๆนๆณ list.stream().forEach( (String s)-\u003e{ System.out.println(s); } ); System.out.println(\"====================\"); //lambda่กจ่พพๅผ่ฟๆฏๅฏไปฅ่ฟไธๆญฅ็ฎๅ็. list.stream().forEach(s-\u003eSystem.out.println(s)); } } ","date":"2023-05-22","objectID":"/blog/20230522_stream/:2:4","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"๐ฏStreamๆตๆถ้ๆไฝ ๅฏนๆฐๆฎไฝฟ็จStreamๆต็ๆนๅผๆไฝๅฎๆฏๅ,ๅฏไปฅๆๆตไธญ็ๆฐๆฎๆถ้ๅฐ้ๅไธญ ๆนๆณๅ ่ฏดๆ R collect(Collector collector) ๆ็ปๆๆถ้ๅฐ้ๅไธญ public static \u003cT\u003e Collector toList() ๆๅ
็ด ๆถ้ๅฐList้ๅไธญ public static \u003cT\u003e Collector toSet() ๆๅ
็ด ๆถ้ๅฐSet้ๅไธญ public static Collector toMap(Function keyMapper,Function valueMapper) ๆๅ
็ด ๆถ้ๅฐMap้ๅไธญ // toListๅtoSetๆนๆณๆผ็คบ public class MyStream { public static void main(String[] args) { ArrayList\u003cInteger\u003e list1 = new ArrayList\u003c\u003e(); for (int i = 1; i \u003c= 10; i++) { list1.add(i); } list1.add(10); list1.add(10); list1.add(10); list1.add(10); list1.add(10); //filter่ด่ดฃ่ฟๆปคๆฐๆฎ็. //collect่ด่ดฃๆถ้ๆฐๆฎ. //่ทๅๆตไธญๅฉไฝ็ๆฐๆฎ,ไฝๆฏไปไธ่ด่ดฃๅๅปบๅฎนๅจ,ไนไธ่ด่ดฃๆๆฐๆฎๆทปๅ ๅฐๅฎนๅจไธญ. //Collectors.toList() : ๅจๅบๅฑไผๅๅปบไธไธชList้ๅ.ๅนถๆๆๆ็ๆฐๆฎๆทปๅ ๅฐList้ๅไธญ. List\u003cInteger\u003e list = list1.stream().filter(number -\u003e number % 2 == 0) .collect(Collectors.toList()); System.out.println(list); Set\u003cInteger\u003e set = list1.stream().filter(number -\u003e number % 2 == 0) .collect(Collectors.toSet()); System.out.println(set); } } /** Streamๆต็ๆถ้ๆนๆณ toMapๆนๆณๆผ็คบ ๅๅปบไธไธชArrayList้ๅ๏ผๅนถๆทปๅ ไปฅไธๅญ็ฌฆไธฒใๅญ็ฌฆไธฒไธญๅ้ขๆฏๅงๅ๏ผๅ้ขๆฏๅนด้พ \"zhangsan,23\" \"lisi,24\" \"wangwu,25\" ไฟ็ๅนด้พๅคงไบ็ญไบ24ๅฒ็ไบบ๏ผๅนถๅฐ็ปๆๆถ้ๅฐMap้ๅไธญ๏ผๅงๅไธบ้ฎ๏ผๅนด้พไธบๅผ */ public class MyStream { public static void main(String[] args) { ArrayList\u003cString\u003e list = new ArrayList\u003c\u003e(); list.add(\"zhangsan,23\"); list.add(\"lisi,24\"); list.add(\"wangwu,25\"); Map\u003cString, Integer\u003e map = list.stream().filter( s -\u003e { String[] split = s.split(\",\"); int age = Integer.parseInt(split[1]); return age \u003e= 24; } // collectๆนๆณๅช่ฝ่ทๅๅฐๆตไธญๅฉไฝ็ๆฏไธไธชๆฐๆฎ. //ๅจๅบๅฑไธ่ฝๅๅปบๅฎนๅจ,ไนไธ่ฝๆๆฐๆฎๆทปๅ ๅฐๅฎนๅจๅฝไธญ //Collectors.toMap ๅๅปบไธไธชmap้ๅๅนถๅฐๆฐๆฎๆทปๅ ๅฐ้ๅๅฝไธญ // s ไพๆฌก่กจ็คบๆตไธญ็ๆฏไธไธชๆฐๆฎ //็ฌฌไธไธชlambda่กจ่พพๅผๅฐฑๆฏๅฆไฝ่ทๅๅฐMapไธญ็้ฎ //็ฌฌไบไธชlambda่กจ่พพๅผๅฐฑๆฏๅฆไฝ่ทๅMapไธญ็ๅผ ).collect(Collectors.toMap( s -\u003e s.split(\",\")[0], s -\u003e Integer.parseInt(s.split(\",\")[1]) )); System.out.println(map); } } ","date":"2023-05-22","objectID":"/blog/20230522_stream/:3:0","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"๐ๆป็ป ๅจ Java 8 ไนๅ๏ผๆไปฌ้ๅธธๆฏ้่ฟ for ๅพช็ฏๆ่
Iterator ่ฟญไปฃๆฅ้ๆฐๆๅบๅๅนถๆฐๆฎ๏ผๅๆ่
้่ฟ้ๆฐๅฎไน Collections.sorts ็ Comparator ๆนๆณๆฅๅฎ็ฐ๏ผ่ฟไธค็งๆนๅผๅฏนไบๅคงๆฐๆฎ้็ณป็ปๆฅ่ฏด๏ผๆ็ๅนถไธๆฏๅพ็ๆณใStream ็่ๅๆไฝไธๆฐๆฎๅบ SQL ็่ๅๆไฝ sortedใfilterใmap ็ญ็ฑปไผผใๅฏ่ง็จ Stream API ๅฏไปฅๅๅบๅคไน็ฎๆด็ไปฃ็ ๏ผ็จๅ
ถไป็ๆจกๅไนๅฏไปฅๅๅบๆฅ๏ผไฝๆฏไปฃ็ ไผ้ๅธธๅคๆใ ","date":"2023-05-22","objectID":"/blog/20230522_stream/:4:0","tags":["java","stream","collect","ๅฝๆฐๅผ็ผ็จ"],"title":"้ๅStreamๆต็จๆณ","uri":"/blog/20230522_stream/"},{"categories":["Java"],"content":"Lambda่กจ่พพๅผ","date":"2023-05-19","objectID":"/blog/20230519_lambda/","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"๐ไป็ป Lambda ่กจ่พพๅผ๏ผไนๅฏ็งฐไธบ้ญๅ
๏ผๅฎๆฏๆจๅจ Java 8 ๅๅธ็ๆ้่ฆๆฐ็นๆงใ Lambda ๅ
่ฎธๆๅฝๆฐไฝไธบไธไธชๆนๆณ็ๅๆฐ๏ผๅฝๆฐไฝไธบๅๆฐไผ ้่ฟๆนๆณไธญ๏ผใ ไฝฟ็จ Lambda ่กจ่พพๅผๅฏไปฅไฝฟไปฃ็ ๅ็ๆดๅ ็ฎๆด็ดงๅใ Lambda่กจ่พพๅผ็นๆง ๅฏ้็ฑปๅๅฃฐๆ๏ผไธ้่ฆๅฃฐๆๅๆฐ็ฑปๅ๏ผ็ผ่ฏๅจๅฏไปฅ็ปไธ่ฏๅซๅๆฐๅผใ ๅฏ้็ๅๆฐๅๆฌๅท๏ผไธไธชๅๆฐๆ ้ๅฎไนๅๆฌๅท๏ผไฝๅคไธชๅๆฐ้่ฆๅฎไนๅๆฌๅทใ ๅฏ้็ๅคงๆฌๅท๏ผๅฆๆไธปไฝๅ
ๅซไบไธไธช่ฏญๅฅ๏ผๅฐฑไธ้่ฆไฝฟ็จๅคงๆฌๅทใ ๅฏ้็่ฟๅๅ
ณ้ฎๅญ๏ผๅฆๆไธปไฝๅชๆไธไธช่กจ่พพๅผ่ฟๅๅผๅ็ผ่ฏๅจไผ่ชๅจ่ฟๅๅผ๏ผๅคงๆฌๅท้่ฆๆๅฎ่กจ่พพๅผ่ฟๅไบไธไธชๆฐๅผใ ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:1:0","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"๐ไฝฟ็จๅบๆฏ ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:0","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"้ๅ โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); for (String fruit : list) { System.out.println(fruit); } โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); list.forEach(fruit -\u003e System.out.println(fruit)); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:1","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"ๆๅบ โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); Collections.sort(list, new Comparator() { public int compare(String s1, String s2) { return s1.compareTo(s2); } }); โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); Collections.sort(list, (s1, s2) -\u003e s1.compareTo(s2)); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:2","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"่ฟๆปค โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List filteredList = new ArrayList(); for (String fruit : list) { if (fruit.startsWith(\"a\")) { filteredList.add(fruit); } } โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List filter = list.stream() .filter(fruit -\u003e fruit.startsWith(\"a\")) .collect(Collectors.toList()); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:3","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"ๆ ๅฐ โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List lengths = new ArrayList(); for (String fruit : list) { lengths.add(fruit.length()); } โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list1 = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List\u003cInteger\u003elengths=list1.stream() .map(String::length) .collect(Collectors.toList()); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:4","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"่ง็บฆ โ ๅธธ่งๆนๆณ List\u003cInteger\u003e list = Arrays.asList(1, 2, 3, 4, 5); int sum = 0; for (int i : list) { sum += i; } โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cInteger\u003e list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, Integer::sum); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:5","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"ๅ็ป โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); Map\u003cInteger, List\u003cString\u003e\u003e grouped = new HashMap\u003cInteger, List\u003cString\u003e\u003e(); for (String fruit : list) { int length = fruit.length(); if (!grouped.containsKey(length)) { grouped.put(length, new ArrayList()); } grouped.get(length).add(fruit); } โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); Map\u003cInteger, List\u003cString\u003e\u003e grouped = list.stream() .collect(Collectors.groupingBy(String::length)); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:6","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"ๅฝๆฐๅผๆฅๅฃๅฎ็ฐ โ ๅธธ่งๆนๆณ public interface MyInterface { public void doSomething(String input); } MyInterface myObject = new MyInterface() { public void doSomething(String input) { System.out.println(input); } }; myObject.doSomething(\"Hello World\"); โ
ไฝฟ็จLambda่กจ่พพๅผ public interface MyInterface { public void doSomething(String input); } MyInterface myObject = input -\u003e System.out.println(input); myObject.doSomething(\"Hello World\"); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:7","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"็บฟ็จๅๅปบ โ ๅธธ่งๆนๆณ Thread thread = new Thread(new Runnable() { public void run() { System.out.println(\"Thread is running.\"); } }); thread.start(); โ
ไฝฟ็จLambda่กจ่พพๅผ Thread thread = new Thread(() -\u003e System.out.println(\"Thread is running.\")); thread.start(); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:8","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"Optionalๆไฝ โ ๅธธ่งๆนๆณ String str = \"Hello World\"; if (str != null) { System.out.println(str.toUpperCase()); } โ
ไฝฟ็จLambda่กจ่พพๅผ Optional.of(\"hello\") .map(String::toUpperCase) .ifPresent(System.out::println); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:9","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"Streamๆตๆฐด็บฟๆไฝ โ ๅธธ่งๆนๆณ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List\u003cString\u003e filteredList = new ArrayList(); for (String fruit : list) { if (fruit.startsWith(\"a\")) { filteredList.add(fruit.toUpperCase()); } } Collections.sort(filteredList); โ
ไฝฟ็จLambda่กจ่พพๅผ List\u003cString\u003e list = Arrays.asList(\"apple\", \"banana\", \"cherry\"); List\u003cString\u003e filteredList = list.stream() .filter(fruit -\u003e fruit.startsWith(\"a\")) .map(String::toUpperCase) .sorted() .collect(Collectors.toList()); ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:2:10","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"๐ๆป็ป ๅฝไฝ ้่ฆไธไธชไป
ๅจไธไธชๅฐๆนๆๆ็ๅฝๆฐ, ๅนถไธๅชๅไธไปถไบๆ
๏ผ้ฃไนๅฐฑ็จ lambdaใๆฏๅฆ๏ผlambda็ปๅธธ็จๅจ sorted ๅฝๆฐ็ key ๅๆฐไธญใๆไปฅ๏ผๅฏไปฅ่ฎคไธบ๏ผlambda็ไธป่ฆ็ฎ็ๆฏไธบไบๅๅฐๅ่กๅฝๆฐ็ๅฎไนใ lambdaไธไผๆ้ซไปฃ็ ๆง่กๆ็๏ผๅฎๅชๆฏๅฎไนไบไธไธชๅฟๅๅฝๆฐ๏ผไฝฟๆไปฌ็ไปฃ็ ๆดๅ ็ฎๆด๏ผ่ไธๅจๆ็ง็จๅบฆไธๅฏ่ฏปๆงๆด้ซใ ๆณจๆ ๅฆๆๅฏไปฅไฝฟ็จforโฆifๆฅๅฎๆ็๏ผๅๅณไธ็จlambdaใ ๅฆๆไฝฟ็จlambda๏ผlambdaๅ
ไธ่ฆๅ
ๅซๅพช็ฏ๏ผๅฆๅ๏ผๆๅฅฝๅฎไนๅฝๆฐๆฅๅฎๆ๏ผไฝฟไปฃ็ ่ทๅพๅฏ้็จๆงๅๆดๅฅฝ็ๅฏ่ฏปๆงใ ","date":"2023-05-19","objectID":"/blog/20230519_lambda/:3:0","tags":["java","lambda","ๅฝๆฐๅผ็ผ็จ"],"title":"Lambdaๅธธ่งๅบๆฏ็จๆณ","uri":"/blog/20230519_lambda/"},{"categories":["Java"],"content":"ๅๆOffer","date":"2023-05-15","objectID":"/blog/20230515_code/","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅๆOffer ","date":"2023-05-15","objectID":"/blog/20230515_code/:0:0","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"็ฎๅ ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:0","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆๆณข้ฃๅฅๆฐๅ ๆ่ฟฐ ๆๆณข้ฃๅฅๆฐๅ ่พๅ
ฅๆ่ฟฐ๏ผ ไธไธชๆญฃๆดๆฐn ่ฟๅๅผๆ่ฟฐ๏ผ ่พๅบไธไธชๆญฃๆดๆฐใ ็คบไพ1 ่พๅ
ฅ๏ผ4 ่ฟๅๅผ๏ผ3 ่ฏดๆ๏ผๆ นๆฎๆๆณข้ฃๅฅๆฐๅ็ๅฎไนๅฏ็ฅ fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3๏ผๆไปฅ็ญๆกไธบ3ใ ็คบไพ2 ่พๅ
ฅ๏ผ1 ่ฟๅๅผ๏ผ1 ็คบไพ3 ่พๅ
ฅ๏ผ2 ่ฟๅๅผ๏ผ1 ไปฃ็ ๅฎ็ฐ public class Solution { public int Fibonacci(int n) { if(n==1||n==2)return 1; int[] a=new int[n+1]; a[1]=a[2]=1; for(int i=3;i\u003c=n;i++){ a[i]=a[i-1]+a[i-2]; } return a[n]; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:1","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆฐ็ปไธญ้ๅค็ๆฐๅญ ๆ่ฟฐ ๆฐ็ปไธญ้ๅค็ๆฐๅญ ็คบไพ1 ่พๅ
ฅ๏ผ[2,3,1,0,2,5,3] ่ฟๅๅผ๏ผ2 ่ฏดๆ๏ผ2ๆ3้ฝๆฏๅฏน็ ไปฃ็ ๅฎ็ฐ import java.util.*; public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param numbers intๆดๅไธ็ปดๆฐ็ป * @return intๆดๅ */ public int duplicate (int[] numbers) { // write code here int tep = 0; for(int i = 0;i \u003c numbers.length;i++){ tep = numbers[i]; int count = 0; for(int j = 0; j\u003c numbers.length;j++){ if(tep==numbers[j]){ count++; if(count\u003e1){ return tep; } } } } return -1; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:2","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆฟๆข็ฉบๆ ผ ๆ่ฟฐ ๆฟๆข็ฉบๆ ผ ็คบไพ1 ่พๅ
ฅ๏ผ\"We Are Happy\" ่ฟๅๅผ๏ผ\"We%20Are%20Happy\" ็คบไพ2 ่พๅ
ฅ๏ผ\" \" ่ฟๅๅผ๏ผ\"%20\" ไปฃ็ ๅฎ็ฐ import java.util.*; public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param s stringๅญ็ฌฆไธฒ * @return stringๅญ็ฌฆไธฒ */ public String replaceSpace (String s) { // write code here return s.replace(\" \", \"%20\"); } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:3","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ไปๅฐพๅฐๅคดๆๅฐ้พ่กจ ๆ่ฟฐ ไปๅฐพๅฐๅคดๆๅฐ้พ่กจ ็คบไพ1 ่พๅ
ฅ๏ผ{1,2,3} ่ฟๅๅผ๏ผ[3,2,1] ็คบไพ2 ่พๅ
ฅ๏ผ{67,0,24,58} ่ฟๅๅผ๏ผ[58,24,0,67] ไปฃ็ ๅฎ็ฐ /** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.ArrayList; public class Solution { public ArrayList\u003cInteger\u003e printListFromTailToHead(ListNode listNode) { ArrayList\u003cInteger\u003e list = new ArrayList\u003c\u003e(); ListNode tmp = listNode; while(tmp!=null){ list.add(0,tmp.val); tmp = tmp.next; } return list; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:4","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"็จไธคไธชๆ ๅฎ็ฐ้ๅ ๆ่ฟฐ ็จไธคไธชๆ ๅฎ็ฐ้ๅ ็คบไพ1 ่พๅ
ฅ๏ผ[\"PSH1\",\"PSH2\",\"POP\",\"POP\"] ่ฟๅๅผ๏ผ1,2 ่ฏดๆ๏ผ \"PSH1\":ไปฃ่กจๅฐ1ๆๅ
ฅ้ๅๅฐพ้จ \"PSH2\":ไปฃ่กจๅฐ2ๆๅ
ฅ้ๅๅฐพ้จ \"POPโ:ไปฃ่กจๅ ้คไธไธชๅ
็ด ๏ผๅ
่ฟๅ
ๅบ=\u003e่ฟๅ1 \"POPโ:ไปฃ่กจๅ ้คไธไธชๅ
็ด ๏ผๅ
่ฟๅ
ๅบ=\u003e่ฟๅ2 ไปฃ็ ๅฎ็ฐ import java.util.Stack; public class Solution { Stack\u003cInteger\u003e stack1 = new Stack\u003cInteger\u003e(); Stack\u003cInteger\u003e stack2 = new Stack\u003cInteger\u003e(); public void push(int node) { stack1.push(node); } public int pop() { if (stack2.size() \u003c= 0){ while (stack1.size() != 0){ stack2.push(stack1.pop()); } } return stack2.pop(); } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:5","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆ่ฝฌๆฐ็ป็ๆๅฐๆฐๅญ ๆ่ฟฐ ๆ่ฝฌๆฐ็ป็ๆๅฐๆฐๅญ ็คบไพ1 ่พๅ
ฅ๏ผ[3,4,5,1,2] ่ฟๅๅผ๏ผ1 ็คบไพ2 ่พๅ
ฅ๏ผ[3,100,200,3] ่ฟๅๅผ๏ผ3 ไปฃ็ ๅฎ็ฐ import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int[] array) { if (array.length == 0) { return 0; } int min = array[0]; for (int e : array) { if (e \u003c min) { min = e; } } return min; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:6","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ไบ่ฟๅถไธญ1็ไธชๆฐ ๆ่ฟฐ ไบ่ฟๅถไธญ1็ไธชๆฐ ็คบไพ1 ่พๅ
ฅ๏ผ10 ่ฟๅๅผ๏ผ2 ่ฏดๆ๏ผ ๅ่ฟๅถไธญ10็32ไฝไบ่ฟๅถ่กจ็คบไธบ0000 0000 0000 0000 0000 0000 0000 1010๏ผๅ
ถไธญๆไธคไธช1ใ ็คบไพ2 ่พๅ
ฅ๏ผ-1 ่ฟๅๅผ๏ผ32 ่ฏดๆ๏ผ ่ดๆฐไฝฟ็จ่กฅ็ ่กจ็คบ ๏ผ-1็32ไฝไบ่ฟๅถ่กจ็คบไธบ1111 1111 1111 1111 1111 1111 1111 1111๏ผๅ
ถไธญ32ไธช1 ไปฃ็ ๅฎ็ฐ import java.util.*; public class Solution { public int NumberOf1(int n) { Scanner in = new Scanner(System.in); int count = 0; for (int i = 0; i \u003c 32; i++) { if ((n \u0026 (1 \u003c\u003c i)) != 0) { count++; } } return count; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:7","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆๅฐไป1ๅฐๆๅคง็nไฝๆฐ ๆ่ฟฐ ๆๅฐไป1ๅฐๆๅคง็nไฝๆฐ ็คบไพ1 ่พๅ
ฅ๏ผ1 ่ฟๅๅผ๏ผ[1,2,3,4,5,6,7,8,9] ไปฃ็ ๅฎ็ฐ import java.util.*; public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param n intๆดๅ ๆๅคงไฝๆฐ * @return intๆดๅไธ็ปดๆฐ็ป */ public int[] printNumbers (int n) { // write code here int length = (int)Math.pow(10, n); int []nums = new int[length-1]; for(int i=1;i\u003clength;i++){ nums[i-1]=i; } return nums; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:8","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅ ้ค้พ่กจ็่็น ๆ่ฟฐ ๅ ้ค้พ่กจ็่็น ็คบไพ1 ่พๅ
ฅ๏ผ{2,5,1,9},5 ่ฟๅๅผ๏ผ{2,1,9} ่ฏดๆ๏ผ ็ปๅฎไฝ ้พ่กจไธญๅผไธบ 5 ็็ฌฌไบไธช่็น๏ผ้ฃไนๅจ่ฐ็จไบไฝ ็ๅฝๆฐไนๅ๏ผ่ฏฅ้พ่กจๅบๅไธบ 2 -\u003e 1 -\u003e 9 ็คบไพ2 ่พๅ
ฅ๏ผ{2,5,1,9},1 ่ฟๅๅผ๏ผ{2,5,9} ่ฏดๆ๏ผ ็ปๅฎไฝ ้พ่กจไธญๅผไธบ 1 ็็ฌฌไธไธช่็น๏ผ้ฃไนๅจ่ฐ็จไบไฝ ็ๅฝๆฐไนๅ๏ผ่ฏฅ้พ่กจๅบๅไธบ 2 -\u003e 5 -\u003e 9 ไปฃ็ ๅฎ็ฐ import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param head ListNode็ฑป * @param val intๆดๅ * @return ListNode็ฑป */ public ListNode deleteNode (ListNode head, int val) { // write code here if(head.val == val) { return head.next; } ListNode newHead = head; while(newHead.next != null) { if(newHead.next.val == val) { newHead.next = newHead.next.next; } newHead = newHead.next; } return head; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:9","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"้พ่กจไธญๅๆฐๆๅkไธช็ป็น ๆ่ฟฐ ้พ่กจไธญๅๆฐๆๅkไธช็ป็น ็คบไพ1 ่พๅ
ฅ๏ผ{1,2,3,4,5},2 ่ฟๅๅผ๏ผ{4,5} ่ฏดๆ๏ผ่ฟๅๅๆฐ็ฌฌ2ไธช่็น4๏ผ็ณป็ปไผๆๅฐๅ้ขๆๆ็่็นๆฅๆฏ่พใ ็คบไพ2 ่พๅ
ฅ๏ผ{2},8 ่ฟๅๅผ๏ผ{} ไปฃ็ ๅฎ็ฐ import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param pHead ListNode็ฑป * @param k intๆดๅ * @return ListNode็ฑป */ public ListNode FindKthToTail (ListNode pHead, int k) { // write code here // ๅฟซๆ
ขๆ้ๆๆณ ListNode fast = pHead; ListNode slow = pHead; int step=0; if (pHead == null) { return null; } // ๅฟซๆ้ๅ
่ตฐkๆญฅ while (fast != null \u0026\u0026 step != k) { fast = fast.next; step++; } if (step \u003c k) { return null; } // ๆ
ขๆ้ไธๅฟซๆ้ๅๆญฅ while (fast != null) { fast = fast.next; slow = slow.next; } return slow; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:10","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅ่ฝฌ้พ่กจ ๆ่ฟฐ ๅ่ฝฌ้พ่กจ ็คบไพ1 ่พๅ
ฅ๏ผ{1,2,3} ่ฟๅๅผ๏ผ{3,2,1} ็คบไพ2 ่พๅ
ฅ๏ผ{} ่ฟๅๅผ๏ผ{} ่ฏดๆ๏ผ็ฉบ้พ่กจๅ่พๅบ็ฉบ ไปฃ็ ๅฎ็ฐ /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode pre = null; ListNode nextOne = null; while (head != null) { nextOne = head.next; head.next = pre; pre = head; head = nextOne; } return pre; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:11","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅๅนถไธคไธชๆๅบ็้พ่กจ ๆ่ฟฐ ๅๅนถไธคไธชๆๅบ็้พ่กจ ็คบไพ1 ่พๅ
ฅ๏ผ{1,3,5},{2,4,6} ่ฟๅๅผ๏ผ{1,2,3,4,5,6} ็คบไพ2 ่พๅ
ฅ๏ผ{},{} ่ฟๅๅผ๏ผ{} ็คบไพ3 ่พๅ
ฅ๏ผ{-1,2,4},{1,3,4} ่ฟๅๅผ๏ผ{-1,1,2,3,4,4} ไปฃ็ ๅฎ็ฐ /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null \u0026\u0026 list2 == null) { return null; } ListNode head = new ListNode(-1); ListNode pre = head; while (list1 != null \u0026\u0026 list2 != null) { if (list1.val \u003c list2.val) { pre.next = list1; list1 = list1.next; } else if (list1.val \u003e list2.val) { pre.next = list2; list2 = list2.next; } else { pre.next = list1; list1 = list1.next; pre=pre.next; pre.next = list2; list2 = list2.next; } pre=pre.next; } pre.next = list1 == null ? list2 : list1; return head.next; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:12","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ไบๅๆ ็้ๅ ๆ่ฟฐ ไบๅๆ ็้ๅ ็คบไพ1 ่พๅ
ฅ๏ผ{8,6,10,5,7,9,11} ่ฟๅๅผ๏ผ{8,10,6,11,9,7,5} ่ฏดๆ๏ผๅฆ้ข้ขๆ็คบ ็คบไพ2 ่พๅ
ฅ๏ผ{} ่ฟๅๅผ๏ผ{} ไปฃ็ ๅฎ็ฐ import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * public TreeNode(int val) { * this.val = val; * } * } */ public class Solution { /** * ไปฃ็ ไธญ็็ฑปๅใๆนๆณๅใๅๆฐๅๅทฒ็ปๆๅฎ๏ผ่ฏทๅฟไฟฎๆน๏ผ็ดๆฅ่ฟๅๆนๆณ่งๅฎ็ๅผๅณๅฏ * * * @param pRoot TreeNode็ฑป * @return TreeNode็ฑป */ public TreeNode Mirror (TreeNode pRoot) { // write code here if (pRoot == null) { return null; } TreeNode tmp = pRoot.left; pRoot.left = pRoot.right ; pRoot.right = tmp; Mirror(pRoot.left); Mirror(pRoot.right); return pRoot; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:13","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅฏน็งฐ็ไบๅๆ ๆ่ฟฐ ๅฏน็งฐ็ไบๅๆ ็คบไพ1 ่พๅ
ฅ๏ผ{1,2,2,3,4,4,3} ่ฟๅๅผ๏ผtrue ็คบไพ2 ่พๅ
ฅ๏ผ{8,6,9,5,7,7,5} ่ฟๅๅผ๏ผfalse ไปฃ็ ๅฎ็ฐ /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.*; public class Solution { boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) { return true; } Queue\u003cTreeNode\u003e left = new LinkedList(); Queue\u003cTreeNode\u003e right = new LinkedList(); left.offer(pRoot.left); right.offer(pRoot.right); while (!left.isEmpty() \u0026\u0026 !right.isEmpty()) { TreeNode tn_left = left.poll(); TreeNode tn_right = right.poll(); if (tn_left == null \u0026\u0026 tn_right == null) { continue; } if (tn_left == null || tn_right == null || tn_left.val != tn_right.val) { return false; } left.offer(tn_left.left); left.offer(tn_left.right); right.offer(tn_right.right); right.offer(tn_right.left); } return true ; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:14","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"้กบๆถ้ๆๅฐ็ฉ้ต ๆ่ฟฐ ้กบๆถ้ๆๅฐ็ฉ้ต ็คบไพ1 ่พๅ
ฅ๏ผ[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] ่ฟๅๅผ๏ผ[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10] ็คบไพ2 ่พๅ
ฅ๏ผ[[1,2,3,1],[4,5,6,1],[4,5,6,1]] ่ฟๅๅผ๏ผ[1,2,3,1,1,1,6,5,4,4,5,6] ไปฃ็ ๅฎ็ฐ import java.util.*; public class Solution { public ArrayList\u003cInteger\u003e printMatrix(int [][] matrix) { ArrayList\u003cInteger\u003e nums = new ArrayList(); if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return nums; } int up = 0, down = matrix.length - 1, left = 0, right = matrix[0].length - 1; while (true) { // ๅพๅณ่ตฐ for (int index = left; index \u003c= right; index++) { nums.add(matrix[up][index]); } up++; if (up \u003e down) { break; } // ๅพไธ่ตฐ for (int index = up; index \u003c= down; index++) { nums.add(matrix[index][right]); } right--; if (left \u003e right) { break; } // ๅพๅทฆ่ตฐ for (int index = right; index \u003e= left; index--) { nums.add(matrix[down][index]); } down--; if (up \u003e down) { break; } // ๅพไธ่ตฐ for (int index = down; index \u003e= up; index--) { nums.add(matrix[index][left]); } left++; if (left \u003e right) { break; } } return nums; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:15","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๅ
ๅซminๅฝๆฐ็ๆ ๆ่ฟฐ ๅ
ๅซminๅฝๆฐ็ๆ ็คบไพ1 ่พๅ
ฅ๏ผ[\"PSH-1\",\"PSH2\",\"MIN\",\"TOP\",\"POP\",\"PSH1\",\"TOP\",\"MIN\"] ่ฟๅๅผ๏ผ-1,2,1,-1 ็คบไพ2 ่พๅ
ฅ๏ผ\" \" ่ฟๅๅผ๏ผ\"%20\" ไปฃ็ ๅฎ็ฐ import java.util.Stack; public class Solution { Stack\u003cInteger\u003enum = new Stack\u003c\u003e(); Stack\u003cInteger\u003emin = new Stack\u003c\u003e(); public void push(int node) { num.push(node); if (min.isEmpty() || min.peek() \u003e node) { min.push(node); } else { min.push(min.peek()); } } public void pop() { num.pop(); min.pop(); } public int top() { int top_val = num.peek(); return top_val; } public int min() { return min.peek(); } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:16","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ไปไธๅพไธๆๅฐไบๅๆ ๆ่ฟฐ ไปไธๅพไธๆๅฐไบๅๆ ็คบไพ1 ่พๅ
ฅ๏ผ{8,6,10,#,#,2,1} ่ฟๅๅผ๏ผ[8,6,10,2,1] ็คบไพ2 ่พๅ
ฅ๏ผ{5,4,#,3,#,2,#,1} ่ฟๅๅผ๏ผ[5,4,3,2,1] ไปฃ็ ๅฎ็ฐ import java.util.*; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { ArrayList\u003cInteger\u003e num = new ArrayList(); Queue\u003cTreeNode\u003enode = new LinkedList(); public ArrayList\u003cInteger\u003e PrintFromTopToBottom(TreeNode root) { node.add(root); while (!node.isEmpty()) { TreeNode tmp = node.poll(); if (tmp != null) { num.add(tmp.val); node.add(tmp.left); node.add(tmp.right); } } return num; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:17","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"ๆฐ็ปไธญๅบ็ฐๆฌกๆฐ่ถ
่ฟไธๅ็ๆฐๅญ ๆ่ฟฐ ๆฐ็ปไธญๅบ็ฐๆฌกๆฐ่ถ
่ฟไธๅ็ๆฐๅญ ็คบไพ1 ่พๅ
ฅ๏ผ [1,2,3,2,2,2,5,4,2] ่ฟๅๅผ๏ผ2 ็คบไพ2 ่พๅ
ฅ๏ผ[3,3,3,3,2,2,2] ่ฟๅๅผ๏ผ3 ็คบไพ3 ่พๅ
ฅ๏ผ[1] ่ฟๅๅผ๏ผ1 ไปฃ็ ๅฎ็ฐ public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int []count = new int[10000]; if(array.length==1){ return array[0]; } for (int i = 0; i \u003c array.length; i++) { count[array[i]]++; } int mid = array.length \u003e\u003e 1; int target = 0; for (int i = 0; i \u003c count.length; i++) { if (count[i] \u003e mid) { target = i; break; } } return target; } } ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:18","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Java"],"content":"่ฟ็ปญๅญๆฐ็ป็ๆๅคงๅ ๆ่ฟฐ ่ฟ็ปญๅญๆฐ็ป็ๆๅคงๅ ็คบไพ1 ่พๅ
ฅ๏ผ[1,-2,3,10,-4,7,2,-5] ่ฟๅๅผ๏ผ18 ่ฏดๆ๏ผ็ปๅๆๅฏ็ฅ๏ผ่พๅ
ฅๆฐ็ป็ๅญๆฐ็ป[3,10,-4,7,2]ๅฏไปฅๆฑๅพๆๅคงๅไธบ18 ็คบไพ2 ่พๅ
ฅ๏ผ[2] ่ฟๅๅผ๏ผ2 ็คบไพ3 ่พๅ
ฅ๏ผ[-10] ่ฟๅๅผ๏ผ-10 ไปฃ็ ๅฎ็ฐ public class Solution { public int FindGreatestSumOfSubArray(int[] array) { // ๆชไผๅ // int []dp = new int[array.length]; // int max = array[0]; // dp[0] = array[0]; // for (int i = 1; i \u003c array.length; i++) { // dp[i] = Math.max(array[i], dp[i - 1] + array[i]); // max = Math.max(max, dp[i]); // } // return max; // ไผๅ็ฉบ้ดๅคๆๅบฆ int sum=array[0]; int max=array[0]; for(int i=1;i\u003carray.length;i++){ sum=Math.max(sum+array[i],array[i]); max=Math.max(max,sum); } return max; } } ๆชๅฎๅพ
็ปญยทยทยท ","date":"2023-05-15","objectID":"/blog/20230515_code/:1:19","tags":["็ฎๆณ","Java"],"title":"ๅๆOffer-ไธชไบบ้ข่งฃ","uri":"/blog/20230515_code/"},{"categories":["Redis"],"content":"Redis้็พค","date":"2023-05-03","objectID":"/blog/20230503_colony/","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"Redis้็พคๆญๅปบ Redis ๆฏไธไธช้ซๆง่ฝ็ๅผๆบ้ฎๅผๅญๅจๆฐๆฎๅบ๏ผๅฎๆฏๆๅค็งๆฐๆฎ็ปๆ๏ผๅฆๅญ็ฌฆไธฒใๅๅธใๅ่กจใ้ๅๅๆๅบ้ๅใๅฎ็ๅบ่ฒๆง่ฝๅๆไบไฝฟ็จ็็นๆง๏ผไฝฟๅพ Redis ๆไธบไบ่ฎธๅคๅบ็จ็จๅบ็้ฆ้ๆฐๆฎๅญๅจๆนๆกใ็ถ่๏ผ้็ไธๅก็ๅข้ฟ๏ผๅ่็น Redis ๅฏ่ฝไผ้ขไธด่ฏธๅฆๅญๅจๅฎน้ใ่ฏปๅๆง่ฝ็ญๆน้ข็้ๅถใไธบไบ่งฃๅณ่ฟไบ้ฎ้ข๏ผRedis ๆไพไบ้็พคๆจกๅผ๏ผไฝฟๅพ็จๆทๅฏไปฅ้่ฟๆฐดๅนณๆฉๅฑ็ๆนๅผๆฅๆจชๅๆฉๅฑ Redis ็ๆง่ฝๅๅญๅจ่ฝๅใๅจๆฌๆญคๅ
ๅฎนไธญ๏ผๆ ๅฐไป็ปRedis ้็พค็ๅ ็ง้จ็ฝฒๆนๆณ๏ผๅธฎๅฉ่ฏป่
ไบ่งฃๅฆไฝไฝฟ็จ Redis ้็พคๆฅๆปก่ถณไธๅก้ๆฑ๏ผๆ้ซๅบ็จ็จๅบ็ๆง่ฝๅๅฏๆฉๅฑๆงใ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:0:0","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"Redisไธปไป้็พค ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:0","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"้็พค็ปๆ ๆไปฌๆญๅปบ็ไธปไป้็พค็ปๆๅฆๅพ๏ผ ไธปไป้็พค็ปๆ ๅ
ฑๅ
ๅซไธไธช่็น๏ผไธไธชไธป่็น๏ผไธคไธชไป่็นใ ่ฟ้ๆไปฌไผๅจๅไธๅฐ่ๆๆบไธญๅผๅฏ3ไธชredisๅฎไพ๏ผๆจกๆไธปไป้็พค๏ผไฟกๆฏๅฆไธ๏ผ IP PORT ่ง่ฒ 192.168.150.101 7001 master 192.168.150.101 7002 slave 192.168.150.101 7003 slave ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:1","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅๅคๅฎไพๅ้
็ฝฎ ่ฆๅจๅไธๅฐ่ๆๆบๅผๅฏ3ไธชๅฎไพ๏ผๅฟ
้กปๅๅคไธไปฝไธๅ็้
็ฝฎๆไปถๅ็ฎๅฝ๏ผ้
็ฝฎๆไปถๆๅจ็ฎๅฝไนๅฐฑๆฏๅทฅไฝ็ฎๅฝใ 1๏ผๅๅปบ็ฎๅฝ ๆไปฌๅๅปบไธไธชๆไปถๅคน๏ผๅๅญๅๅซๅซ7001ใ7002ใ7003๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ๅๅปบ็ฎๅฝ mkdir 7001 7002 7003 ๅฆๅพ๏ผ 2๏ผๆขๅคๅๅง้
็ฝฎ ไฟฎๆนredis-6.2.4/redis.confๆไปถ๏ผๅฐๅ
ถไธญ็ๆไน
ๅๆจกๅผๆนไธบ้ป่ฎค็RDBๆจกๅผ๏ผAOFไฟๆๅ
ณ้ญ็ถๆใ # ๅผๅฏRDB # save \"\" save 3600 1 save 300 100 save 60 10000 # ๅ
ณ้ญAOF appendonly no 3๏ผๆท่ด้
็ฝฎๆไปถๅฐๆฏไธชๅฎไพ็ฎๅฝ ็ถๅๅฐredis-6.2.4/redis.confๆไปถๆท่ดๅฐไธไธช็ฎๅฝไธญ๏ผๅจ/tmp็ฎๅฝๆง่กไธๅๅฝไปค๏ผ๏ผ # ๆนๅผไธ๏ผ้ไธชๆท่ด cp redis-6.2.4/redis.conf 7001 cp redis-6.2.4/redis.conf 7002 cp redis-6.2.4/redis.conf 7003 # ๆนๅผไบ๏ผ็ฎก้็ปๅๅฝไปค๏ผไธ้ฎๆท่ด echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf 4๏ผไฟฎๆนๆฏไธชๅฎไพ็็ซฏๅฃใๅทฅไฝ็ฎๅฝ ไฟฎๆนๆฏไธชๆไปถๅคนๅ
็้
็ฝฎๆไปถ๏ผๅฐ็ซฏๅฃๅๅซไฟฎๆนไธบ7001ใ7002ใ7003๏ผๅฐrdbๆไปถไฟๅญไฝ็ฝฎ้ฝไฟฎๆนไธบ่ชๅทฑๆๅจ็ฎๅฝ๏ผๅจ/tmp็ฎๅฝๆง่กไธๅๅฝไปค๏ผ๏ผ sed -i -e 's/6379/7001/g' -e 's/dir .\\//dir \\/tmp\\/7001\\//g' 7001/redis.conf sed -i -e 's/6379/7002/g' -e 's/dir .\\//dir \\/tmp\\/7002\\//g' 7002/redis.conf sed -i -e 's/6379/7003/g' -e 's/dir .\\//dir \\/tmp\\/7003\\//g' 7003/redis.conf 5๏ผไฟฎๆนๆฏไธชๅฎไพ็ๅฃฐๆIP ่ๆๆบๆฌ่บซๆๅคไธชIP๏ผไธบไบ้ฟๅ
ๅฐๆฅๆททไนฑ๏ผๆไปฌ้่ฆๅจredis.confๆไปถไธญๆๅฎๆฏไธไธชๅฎไพ็็ปๅฎipไฟกๆฏ๏ผๆ ผๅผๅฆไธ๏ผ # redisๅฎไพ็ๅฃฐๆ IP replica-announce-ip 192.168.150.101 ๆฏไธช็ฎๅฝ้ฝ่ฆๆน๏ผๆไปฌไธ้ฎๅฎๆไฟฎๆน๏ผๅจ/tmp็ฎๅฝๆง่กไธๅๅฝไปค๏ผ๏ผ # ้ไธๆง่ก sed -i '1a replica-announce-ip 192.168.150.101' 7001/redis.conf sed -i '1a replica-announce-ip 192.168.150.101' 7002/redis.conf sed -i '1a replica-announce-ip 192.168.150.101' 7003/redis.conf # ๆ่
ไธ้ฎไฟฎๆน printf '%s\\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.150.101' {}/redis.conf ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:2","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅฏๅจ ไธบไบๆนไพฟๆฅ็ๆฅๅฟ๏ผๆไปฌๆๅผ3ไธชssh็ชๅฃ๏ผๅๅซๅฏๅจ3ไธชredisๅฎไพ๏ผๅฏๅจๅฝไปค๏ผ # ็ฌฌ1ไธช redis-server 7001/redis.conf # ็ฌฌ2ไธช redis-server 7002/redis.conf # ็ฌฌ3ไธช redis-server 7003/redis.conf ๅฏๅจๅ๏ผ redis้็พคๅฏๅจ ๅฆๆ่ฆไธ้ฎๅๆญข๏ผๅฏไปฅ่ฟ่กไธ้ขๅฝไปค๏ผ printf '%s\\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:3","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅผๅฏไธปไปๅ
ณ็ณป ็ฐๅจไธไธชๅฎไพ่ฟๆฒกๆไปปไฝๅ
ณ็ณป๏ผ่ฆ้
็ฝฎไธปไปๅฏไปฅไฝฟ็จreplicaof ๆ่
slaveof๏ผ5.0ไปฅๅ๏ผๅฝไปคใ ๆไธดๆถๅๆฐธไน
ไธค็งๆจกๅผ๏ผ ไฟฎๆน้
็ฝฎๆไปถ๏ผๆฐธไน
็ๆ๏ผ ๅจredis.confไธญๆทปๅ ไธ่ก้
็ฝฎ๏ผslaveof \u003cmasterip\u003e \u003cmasterport\u003e ไฝฟ็จredis-cliๅฎขๆท็ซฏ่ฟๆฅๅฐredisๆๅก๏ผๆง่กslaveofๅฝไปค๏ผ้ๅฏๅๅคฑๆ๏ผ๏ผ slaveof \u003cmasterip\u003e \u003cmasterport\u003e ๆณจๆ๏ผๅจ5.0ไปฅๅๆฐๅขๅฝไปคreplicaof๏ผไธsalveofๆๆไธ่ดใ ่ฟ้ๆไปฌไธบไบๆผ็คบๆนไพฟ๏ผไฝฟ็จๆนๅผไบใ ้่ฟredis-cliๅฝไปค่ฟๆฅ7002๏ผๆง่กไธ้ขๅฝไปค๏ผ # ่ฟๆฅ 7002 redis-cli -p 7002 # ๆง่กslaveof slaveof 192.168.150.101 7001 ้่ฟredis-cliๅฝไปค่ฟๆฅ7003๏ผๆง่กไธ้ขๅฝไปค๏ผ # ่ฟๆฅ 7003 redis-cli -p 7003 # ๆง่กslaveof slaveof 192.168.150.101 7001 ็ถๅ่ฟๆฅ 7001่็น๏ผๆฅ็้็พค็ถๆ๏ผ # ่ฟๆฅ 7001 redis-cli -p 7001 # ๆฅ็็ถๆ info replication ็ปๆ๏ผ ๆฅ็redis้็พค็ถๆ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:4","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๆต่ฏ ๆง่กไธๅๆไฝไปฅๆต่ฏ๏ผ ๅฉ็จredis-cli่ฟๆฅ7001๏ผๆง่กset num 123 ๅฉ็จredis-cli่ฟๆฅ7002๏ผๆง่กget num๏ผๅๆง่กset num 666 ๅฉ็จredis-cli่ฟๆฅ7003๏ผๆง่กget num๏ผๅๆง่กset num 888 ๅฏไปฅๅ็ฐ๏ผๅชๆๅจ7001่ฟไธชmaster่็นไธๅฏไปฅๆง่กๅๆไฝ๏ผ7002ๅ7003่ฟไธคไธชslave่็นๅช่ฝๆง่ก่ฏปๆไฝใ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:1:5","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๆญๅปบๅจๅ
ต้็พค ","date":"2023-05-03","objectID":"/blog/20230503_colony/:2:0","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"้็พค็ปๆ ่ฟ้ๆไปฌๆญๅปบไธไธชไธ่็นๅฝขๆ็Sentinel้็พค๏ผๆฅ็็ฎกไนๅ็Redisไธปไป้็พคใๅฆๅพ๏ผ redisๅจๅ
ต้็พค็ปๆ ไธไธชsentinelๅฎไพไฟกๆฏๅฆไธ๏ผ ่็น IP PORT s1 192.168.150.101 27001 s2 192.168.150.101 27002 s3 192.168.150.101 27003 ","date":"2023-05-03","objectID":"/blog/20230503_colony/:2:1","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅๅคๅฎไพๅ้
็ฝฎ ่ฆๅจๅไธๅฐ่ๆๆบๅผๅฏ3ไธชๅฎไพ๏ผๅฟ
้กปๅๅคไธไปฝไธๅ็้
็ฝฎๆไปถๅ็ฎๅฝ๏ผ้
็ฝฎๆไปถๆๅจ็ฎๅฝไนๅฐฑๆฏๅทฅไฝ็ฎๅฝใ ๆไปฌๅๅปบไธไธชๆไปถๅคน๏ผๅๅญๅๅซๅซs1ใs2ใs3๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ๅๅปบ็ฎๅฝ mkdir s1 s2 s3 ๅฆๅพ๏ผ ๅๅคๅฎไพ ็ถๅๆไปฌๅจs1็ฎๅฝๅๅปบไธไธชsentinel.confๆไปถ๏ผๆทปๅ ไธ้ข็ๅ
ๅฎน๏ผ port 27001 sentinel announce-ip 192.168.150.101 sentinel monitor mymaster 192.168.150.101 7001 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 dir \"/tmp/s1\" ่งฃ่ฏป๏ผ port 27001๏ผๆฏๅฝๅsentinelๅฎไพ็็ซฏๅฃ sentinel monitor mymaster 192.168.150.101 7001 2๏ผๆๅฎไธป่็นไฟกๆฏ mymaster๏ผไธป่็นๅ็งฐ๏ผ่ชๅฎไน๏ผไปปๆๅ 192.168.150.101 7001๏ผไธป่็น็ipๅ็ซฏๅฃ 2๏ผ้ไธพmasterๆถ็quorumๅผ ็ถๅๅฐs1/sentinel.confๆไปถๆท่ดๅฐs2ใs3ไธคไธช็ฎๅฝไธญ๏ผๅจ/tmp็ฎๅฝๆง่กไธๅๅฝไปค๏ผ๏ผ # ๆนๅผไธ๏ผ้ไธชๆท่ด cp s1/sentinel.conf s2 cp s1/sentinel.conf s3 # ๆนๅผไบ๏ผ็ฎก้็ปๅๅฝไปค๏ผไธ้ฎๆท่ด echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf ไฟฎๆนs2ใs3ไธคไธชๆไปถๅคนๅ
็้
็ฝฎๆไปถ๏ผๅฐ็ซฏๅฃๅๅซไฟฎๆนไธบ27002ใ27003๏ผ sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf ","date":"2023-05-03","objectID":"/blog/20230503_colony/:2:2","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅฏๅจ ไธบไบๆนไพฟๆฅ็ๆฅๅฟ๏ผๆไปฌๆๅผ3ไธชssh็ชๅฃ๏ผๅๅซๅฏๅจ3ไธชredisๅฎไพ๏ผๅฏๅจๅฝไปค๏ผ # ็ฌฌ1ไธช redis-sentinel s1/sentinel.conf # ็ฌฌ2ไธช redis-sentinel s2/sentinel.conf # ็ฌฌ3ไธช redis-sentinel s3/sentinel.conf ๅฏๅจๅ๏ผ ๅจๅ
ต้็พคๅฏๅจ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:2:3","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๆต่ฏ ๅฐ่ฏ่ฎฉmaster่็น7001ๅฎๆบ๏ผๆฅ็sentinelๆฅๅฟ๏ผ sentinelๆฅๅฟ ๆฅ็7003็ๆฅๅฟ๏ผ 7003็ๆฅๅฟ ๆฅ็7002็ๆฅๅฟ๏ผ 7002็ๆฅๅฟ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:2:4","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๆญๅปบๅ็้็พค ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:0","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"้็พค็ปๆ ๅ็้็พค้่ฆ็่็นๆฐ้่พๅค๏ผ่ฟ้ๆไปฌๆญๅปบไธไธชๆๅฐ็ๅ็้็พค๏ผๅ
ๅซ3ไธชmaster่็น๏ผๆฏไธชmasterๅ
ๅซไธไธชslave่็น๏ผ็ปๆๅฆไธ๏ผ redisๅ็้็พค็ปๆ ่ฟ้ๆไปฌไผๅจๅไธๅฐ่ๆๆบไธญๅผๅฏ6ไธชredisๅฎไพ๏ผๆจกๆๅ็้็พค๏ผไฟกๆฏๅฆไธ๏ผ IP PORT ่ง่ฒ 192.168.150.101 7001 master 192.168.150.101 7002 master 192.168.150.101 7003 master 192.168.150.101 8001 slave 192.168.150.101 8002 slave 192.168.150.101 8003 slave ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:1","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅๅคๅฎไพๅ้
็ฝฎ ๅ ้คไนๅ็7001ใ7002ใ7003่ฟๅ ไธช็ฎๅฝ๏ผ้ๆฐๅๅปบๅบ7001ใ7002ใ7003ใ8001ใ8002ใ8003็ฎๅฝ๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ๅ ้คๆง็๏ผ้ฟๅ
้
็ฝฎๅนฒๆฐ rm -rf 7001 7002 7003 # ๅๅปบ็ฎๅฝ mkdir 7001 7002 7003 8001 8002 8003 ๅจ/tmpไธๅๅคไธไธชๆฐ็redis.confๆไปถ๏ผๅ
ๅฎนๅฆไธ๏ผ port 6379 # ๅผๅฏ้็พคๅ่ฝ cluster-enabled yes # ้็พค็้
็ฝฎๆไปถๅ็งฐ๏ผไธ้่ฆๆไปฌๅๅปบ๏ผ็ฑredis่ชๅทฑ็ปดๆค cluster-config-file /tmp/6379/nodes.conf # ่็นๅฟ่ทณๅคฑ่ดฅ็่ถ
ๆถๆถ้ด cluster-node-timeout 5000 # ๆไน
ๅๆไปถๅญๆพ็ฎๅฝ dir /tmp/6379 # ็ปๅฎๅฐๅ bind 0.0.0.0 # ่ฎฉredisๅๅฐ่ฟ่ก daemonize yes # ๆณจๅ็ๅฎไพip replica-announce-ip 192.168.150.101 # ไฟๆคๆจกๅผ protected-mode no # ๆฐๆฎๅบๆฐ้ databases 1 # ๆฅๅฟ logfile /tmp/6379/run.log ๅฐ่ฟไธชๆไปถๆท่ดๅฐๆฏไธช็ฎๅฝไธ๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ๆง่กๆท่ด echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf ไฟฎๆนๆฏไธช็ฎๅฝไธ็redis.conf๏ผๅฐๅ
ถไธญ็6379ไฟฎๆนไธบไธๆๅจ็ฎๅฝไธ่ด๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ไฟฎๆน้
็ฝฎๆไปถ printf '%s\\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:2","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅฏๅจ ๅ ไธบๅทฒ็ป้
็ฝฎไบๅๅฐๅฏๅจๆจกๅผ๏ผๆไปฅๅฏไปฅ็ดๆฅๅฏๅจๆๅก๏ผ # ่ฟๅ
ฅ/tmp็ฎๅฝ cd /tmp # ไธ้ฎๅฏๅจๆๆๆๅก printf '%s\\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf ้่ฟpsๆฅ็็ถๆ๏ผ ps -ef | grep redis ๅ็ฐๆๅก้ฝๅทฒ็ปๆญฃๅธธๅฏๅจ๏ผ redisๆๅก็ถๆ ๅฆๆ่ฆๅ
ณ้ญๆๆ่ฟ็จ๏ผๅฏไปฅๆง่กๅฝไปค๏ผ ps -ef | grep redis | awk '{print $2}' | xargs kill ๆ่
๏ผๆจ่่ฟ็งๆนๅผ๏ผ๏ผ printf '%s\\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:3","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๅๅปบ้็พค ่ฝ็ถๆๅกๅฏๅจไบ๏ผไฝๆฏ็ฎๅๆฏไธชๆๅกไน้ด้ฝๆฏ็ฌ็ซ็๏ผๆฒกๆไปปไฝๅ
ณ่ใ ๆไปฌ้่ฆๆง่กๅฝไปคๆฅๅๅปบ้็พค๏ผๅจRedis5.0ไนๅๅๅปบ้็พคๆฏ่พ้บป็ฆ๏ผ5.0ไนๅ้็พค็ฎก็ๅฝไปค้ฝ้ๆๅฐไบredis-cliไธญใ 1๏ผRedis5.0ไนๅ Redis5.0ไนๅ้็พคๅฝไปค้ฝๆฏ็จredisๅฎ่ฃ
ๅ
ไธ็src/redis-trib.rbๆฅๅฎ็ฐ็ใๅ ไธบredis-trib.rbๆฏๆruby่ฏญ่จ็ผๅ็ๆไปฅ้่ฆๅฎ่ฃ
ruby็ฏๅขใ # ๅฎ่ฃ
ไพ่ต yum -y install zlib ruby rubygems gem install redis ็ถๅ้่ฟๅฝไปคๆฅ็ฎก็้็พค๏ผ # ่ฟๅ
ฅredis็src็ฎๅฝ cd /tmp/redis-6.2.4/src # ๅๅปบ้็พค ./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003 2๏ผRedis5.0ไปฅๅ ๆไปฌไฝฟ็จ็ๆฏRedis6.2.4็ๆฌ๏ผ้็พค็ฎก็ไปฅๅ้ๆๅฐไบredis-cliไธญ๏ผๆ ผๅผๅฆไธ๏ผ redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003 ๅฝไปค่ฏดๆ๏ผ redis-cli --clusterๆ่
./redis-trib.rb๏ผไปฃ่กจ้็พคๆไฝๅฝไปค create๏ผไปฃ่กจๆฏๅๅปบ้็พค --replicas 1ๆ่
--cluster-replicas 1 ๏ผๆๅฎ้็พคไธญๆฏไธชmaster็ๅฏๆฌไธชๆฐไธบ1๏ผๆญคๆถ่็นๆปๆฐ รท (replicas + 1) ๅพๅฐ็ๅฐฑๆฏmaster็ๆฐ้ใๅ ๆญค่็นๅ่กจไธญ็ๅnไธชๅฐฑๆฏmaster๏ผๅ
ถๅฎ่็น้ฝๆฏslave่็น๏ผ้ๆบๅ้
ๅฐไธๅmaster ่ฟ่กๅ็ๆ ทๅญ๏ผ ๆๅก่ฟ่ก่ฏฆๆ
่ฟ้่พๅ
ฅyes๏ผๅ้็พคๅผๅงๅๅปบ๏ผ ๆๅปบ็ถๆ ้่ฟๅฝไปคๅฏไปฅๆฅ็้็พค็ถๆ๏ผ redis-cli -p 7001 cluster nodes ้็พค็ถๆ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:4","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Redis"],"content":"ๆต่ฏ ๅฐ่ฏ่ฟๆฅ7001่็น๏ผๅญๅจไธไธชๆฐๆฎ๏ผ # ่ฟๆฅ redis-cli -p 7001 # ๅญๅจๆฐๆฎ set num 123 # ่ฏปๅๆฐๆฎ get num # ๅๆฌกๅญๅจ set a 1 ็ปๆๆฒๅงไบ๏ผ ่ฟๆฅ7001่็น ้็พคๆไฝๆถ๏ผ้่ฆ็ปredis-cliๅ ไธ-cๅๆฐๆๅฏไปฅ๏ผ redis-cli -c -p 7001 ่ฟๆฌกๅฏไปฅไบ๏ผ ่ฟๆฅ้่ฏ ","date":"2023-05-03","objectID":"/blog/20230503_colony/:3:5","tags":["Redis","Java","NoSQL"],"title":"Redis้็พค","uri":"/blog/20230503_colony/"},{"categories":["Technology"],"content":"่ฎพ่ฎกๆจกๅผ่ฎฒ่งฃ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๆต
่ฐ่ฎพ่ฎกๆจกๅผ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:0:0","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅ่จ ็ผๅ่ฝฏไปถ่ฟ็จไธญ๏ผ็จๅบๅ้ขไธด็ๆฅ่ช่ฆๅๆง๏ผๅ
่ๆงไปฅๅๅฏ็ปดๆคๆง๏ผๅฏๆฉๅฑๆง๏ผ้็จๆง๏ผ็ตๆดปๆง ็ญๅคๆน้ข็ๆๆ๏ผ่ฎพ่ฎกๆจกๅผๆฏไธบไบ่ฎฉ็จๅบ(่ฝฏไปถ)๏ผๅ
ทๆๆดๅฅฝ๏ผ ไปฃ็ ้็จๆง๏ผๅณ๏ผ็ธๅ็ไปฃ็ ๏ผไธ็จๅคๆฌก็ผๅ๏ผ ๅฏ่ฏปๆง๏ผๅณ๏ผ็ผ็จ่ง่ๆง๏ผไพฟไบๅ
ถไป็จๅบๅ็้
่ฏปไธ็่งฃ๏ผ ๅฏๆฉๅฑๆง๏ผๅณ๏ผๅฝ้่ฆๅขๅ ๆฐ็ๅ่ฝๆถ๏ผ้ๅธธๆนไพฟ๏ผ็งฐไธบๅฏ็ปดๆคๆง๏ผ ๅฏ้ ๆง๏ผๅณ๏ผๅฝๆไปฌๅขๅ ๆฐ็ๅ่ฝๅ๏ผๅฏนๅๆฅ็ๅ่ฝๆฒกๆๅฝฑๅ๏ผ ไฝฟ็จๅบๅ็ฐ้ซๅ
่๏ผไฝ่ฆๅ็็นๆง ่ฎพ่ฎกๆจกๅผๅ
ๅซไบ้ขๅๅฏน่ฑก็็ฒพ้ซ๏ผโๆไบ่ฎพ่ฎกๆจกๅผ๏ผไฝ ๅฐฑๆไบ้ขๅๅฏน่ฑกๅๆๅ่ฎพ่ฎก๏ผOOA/D๏ผ็็ฒพ่ฆโใ Scott Mayers ๅจๅ
ถๅทจ่ใEffective C++ใๅฐฑๆพ็ป่ฏด่ฟ๏ผC++่ๆๅ C++ๆฐๆ็ๅบๅซๅฐฑๆฏๅ่
ๆ่ไธๆๅพๅคไผค็คใ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:1:0","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฎพ่ฎกๆจกๅผไธๅคงๅๅ ่ฎพ่ฎกๆจกๅผๅๅ๏ผๅ
ถๅฎๅฐฑๆฏ็จๅบๅๅจ็ผ็จๆถ๏ผๅบๅฝ้ตๅฎ็ๅๅ๏ผไนๆฏๅ็ง่ฎพ่ฎกๆจกๅผ็ๅบ็ก๏ผๅณ๏ผ่ฎพ่ฎกๆจกๅผไธบไปไน่ฟๆ ท่ฎพ่ฎก็ไพๆฎ๏ผ ่ฎพ่ฎกๆจกๅผๅธธ็จ็ไธๅคงๅๅ ๅไธ่่ดฃๅๅ ๆฅๅฃ้็ฆปๅๅ ไพ่ตๅ่ฝฌ๏ผๅ็ฝฎ๏ผๅๅ ้ๆฐๆฟๆขๅๅ ๅผ้ญๅๅ ่ฟช็ฑณ็นๆณๅ ๅๆๆ็จๅๅ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:0","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅไธ่่ดฃๅๅ ไป็ป ๅฏน็ฑปๆฅ่ฏด๏ผไธไธช็ฑปๅบ่ฏฅๅช่ด่ดฃไธ้กน่่ดฃใๅฆ็ฑปA่ด่ดฃไธคไธชไธๅ็่่ดฃ๏ผ่่ดฃ1๏ผ่่ดฃ2ใๅฝ่่ดฃ1้ๆฑๅๆด่ๆนๅAๆถ๏ผๅฏ่ฝ้ ๆ่่ดฃ2ๆง่ก้่ฏฏ๏ผๆไปฅ้่ฆๅฐ็ฑปA็็ฒๅบฆๅ่งฃไธบA1๏ผA2ใ็ฑปๅพๅฆไธๆ็คบ ๅไธ่่ดฃๅๅ ๅไธ่่ดฃๅๅๆณจๆไบ้กนๅ็ป่ ๅไธ่่ดฃๅๅ ้ไฝ็ฑป็ๅคๆๅบฆ๏ผไธไธช็ฑปๅช่ด่ดฃไธ้กน่่ดฃใ ๆ้ซ็ฑป็ๅฏ่ฏปๆง๏ผๅฏ็ปดๆคๆงใ ้ไฝๅๆดๅผ่ตท็้ฃ้ฉใ ้ๅธธๆ
ๅตไธ๏ผๆไปฌๅบๅฝ้ตๅฎๅไธ่่ดฃๅๅ๏ผๅชๆ้ป่พ่ถณๅค็ฎๅ๏ผๆๅฏไปฅๅจไปฃ็ ็บง่ฟๅๅไธ่่ดฃๅๅ๏ผๅชๆ็ฑปไธญ็ๆนๆณๆฐ้่ถณๅคๅฐ๏ผๅฏไปฅๅจๆนๆณ็บงๅซไฟๆๅไธ่่ดฃๅๅใ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:1","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๆฅๅฃ้็ฆปๅๅ ไป็ป ๅฎขๆท็ซฏไธๅบ่ฏฅไพ่ตไปไธ้่ฆ็ๆฅๅฃ๏ผๅณๅฏน็ฑปๅฏนๅฆไธไธช็ฑป็ไพ่ตๅบ่ฏฅๅปบ็ซๅจๆๅฐ็ๆฅๅฃไธใ ๆฅๅฃ้็ฆปๅๅ-ๆชๆๅ ็ฑปA้่ฟๆฅๅฃInterface1ไพ่ต็ฑปB๏ผ็ฑปC้่ฟInterface1ไพ่ต็ฑปD๏ผๅฆๆๆฅๅฃInterface1ๅฏนไบ็ฑปAๅ็ฑปCๆฅ่ฏดไธๆฏๆๅฐๆฅๅฃ๏ผ้ฃไน็ฑปBๅ็ฑปDๅฟ
้กปๅปๅฎ็ฐไปไปฌไธ้่ฆ็ๆนๆณใ ้็ฆปๅๅๅบๅฝๅฆไธๅค็๏ผ ๅฐๆฅๅฃInterface1ๆๅๆไธบๅ ไธช็ฌ็ซ็ๆฅๅฃ๏ผ่ฟ้ๆไปฌๆๅๆไธบ3ไธชๆฅๅฃ๏ผ๏ผ็ฑปAๅ็ฑปCๅๅซไธไปไปฌ้่ฆ็ๆฅๅฃๅปบ็ซไพ่ตๅ
ณ็ณปใไนๅฐฑๆฏ้็จๆฅๅฃ้็ฆปๅๅใ ไฝฟ็จๆฅๅฃ้็ฆปๅๅๆน่ฟ ๆญฅ้ชค ็ฑปA้่ฟๆฅๅฃInterface1ไพ่ต็ฑปB๏ผ็ฑปC้่ฟๆฅๅฃInterface1ไพ่ต็ฑปD๏ผๅฆๆๆฅๅฃInterface1ๅฏนไบ็ฑปAๅ็ฑปCๆฅ่ฏดไธๆฏๆๅฐๆฅๅฃ๏ผ้ฃไน็ฑปBๅ็ฑปDๅฟ
้กปๅปๅฎ็ฐไปไปฌไธ้่ฆ็ๆนๆณ ๅฐๆฅๅฃInterface1ๆๅไธบ็ฌ็ซ็ๅ ไธชๆฅๅฃ๏ผ็ฑปAๅ็ฑปCๅๅซไธไปไปฌ้่ฆ็ๆฅๅฃๅปบ็ซไพ่ตๅ
ณ็ณปใไนๅฐฑๆฏ้็จๆฅๅฃ้็ฆปๅๅ ๆฅๅฃInterface1ไธญๅบ็ฐ็ๆนๆณ๏ผๆ นๆฎๅฎ้
ๆ
ๅตๆๅไธบไธไธชๆฅๅฃ ๆๅๅฎ็ฐๅฆไธ๏ผ ๆฅๅฃ้็ฆปๅๅ-ๆๅ public class Segregation { public static void main(String[] args) { A a = new A(); a.depend1(new B()); // A็ฑป้่ฟๆฅๅฃๅปไพ่ตB็ฑป a.depend2(new B()); a.depend3(new B()); C c = new C(); c.depend1(new D()); // C็ฑป้่ฟๆฅๅฃๅปไพ่ตD็ฑป c.depend4(new D()); c.depend5(new D()); } } interface Interface1 { void operation1(); } interface Interface2 { void operation2(); void operation3(); } interface Interface3 { void operation4(); void operation5(); } class D implements Interface1, Interface3 { @Override public void operation1() { System.out.println(\"D ๅฎ็ฐไบ operation1\"); } @Override public void operation4() { System.out.println(\"D ๅฎ็ฐไบ operation4\"); } @Override public void operation5() { System.out.println(\"D ๅฎ็ฐไบ operation5\"); } } class B implements Interface1, Interface2 { @Override public void operation1() { System.out.println(\"B ๅฎ็ฐไบ operation1\"); } @Override public void operation2() { System.out.println(\"B ๅฎ็ฐไบ operation2\"); } @Override public void operation3() { System.out.println(\"B ๅฎ็ฐไบ operation3\"); } } // A็ฑป้่ฟๆฅๅฃInterfaceไพ่ตไฝฟ็จB็ฑป๏ผ็จๅฐไบ1๏ผ2๏ผ3ๆนๆณ class A { public void depend1(Interface1 interface1) { interface1.operation1(); } public void depend2(Interface2 interface2) { interface2.operation2(); } public void depend3(Interface2 interface2) { interface2.operation3(); } } // C็ฑป้่ฟๆฅๅฃInterfaceไพ่ตD็ฑป๏ผ็จๅฐไบ1๏ผ4๏ผ5ๆนๆณ class C { public void depend1(Interface1 interface1) { interface1.operation1(); } public void depend4(Interface3 interface3) { interface3.operation4(); } public void depend5(Interface3 interface3) { interface3.operation5(); } } ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:2","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไพ่ตๅ่ฝฌๅๅ ไป็ป ไพ่ตๅ่ฝฌๅๅ(Dependence Inversion Principle)ๆฏๆ๏ผ ้ซๅฑๆจกๅไธๅบ่ฏฅไพ่ตๅบๅฑๆจกๅ๏ผไบ่
้ฝๅบ่ฏฅไพ่ตๅ
ถๆฝ่ฑก ๆฝ่ฑกไธๅบ่ฏฅไพ่ต็ป่๏ผ็ป่ๅบ่ฏฅไพ่ตๆฝ่ฑก ไพ่ตๅ่ฝฌ(ๅ็ฝฎ)็ไธญๅฟๆๆณๆฏ้ขๅๆฅๅฃ็ผ็จ ไพ่ตๅ่ฝฌๅๅๆฏๅบไบ่ฟๆ ท็่ฎพ่ฎกๅ็๏ผ็ธ่พไบ็ป่็ๅคๅๆง๏ผๆฝ่ฑก็ไธ่ฅฟ่ฆ็จณๅฎ็ๅคใไปฅๆฝ่ฑกไธบๅบ็กๆญๅปบ็ๆกๆถๆฏไปฅ็ป่ไธบๅบ็ก็ๆกๆถ่ฆ็จณๅฎ็ๅคใๅจJavaไธญ๏ผๆฝ่ฑกๆ็ๆฏๅๅฃๆๆฝ่ฑก็ฑป๏ผ็ป่ๅฐฑๆฏๅ
ทไฝ็ๅฎ็ฐ็ฑป ไฝฟ็จๆฅๅฃๆๆฝ่ฑก็ฑป็็ฎ็ๆฏๅถๅฎๅฅฝ่ง่๏ผ่ไธๆถๅไปปไฝๅ
ทไฝ็ๆไฝ๏ผๆๅฑ็ฐ็ป่็ไปปๅกไบค็ปไปไปฌ็ๅฎ็ฐ็ฑปๅปๅฎๆ ไพ่ตๅ่ฝฌ ไพ่ตๅ
ณ็ณปไผ ้็ไธ็งๆนๅผ ๆฅๅฃไผ ้ ๆ้ ๆนๆณไผ ้ setterๆนๅผไผ ้ public class DependencyPass { public static void main(String[] args) { // TODO Auto-generated method stub } } // ๆนๅผ1๏ผ ้่ฟๆฅๅฃไผ ้ๅฎ็ฐไพ่ต // ๅผๅ
ณ็ๆฅๅฃ interface IOpenAndClose { public void open(ITV tv); //ๆฝ่ฑกๆนๆณ,ๆฅๆถๆฅๅฃ } interface ITV { //ITVๆฅๅฃ public void play(); } // ๅฎ็ฐๆฅๅฃ class OpenAndClose implements IOpenAndClose { public void open(ITV tv) { tv.play(); } } // ๆนๅผ2: ้่ฟๆ้ ๆนๆณไพ่ตไผ ้ interface IOpenAndClose { public void open(); //ๆฝ่ฑกๆนๆณ } interface ITV { //ITVๆฅๅฃ public void play(); } class OpenAndClose implements IOpenAndClose { public ITV tv; public OpenAndClose(ITV tv) { this.tv = tv; } public void open() { this.tv.play(); } } // ๆนๅผ3 , ้่ฟsetterๆนๆณไผ ้ interface IOpenAndClose { public void open(); // ๆฝ่ฑกๆนๆณ public void setTv(ITV tv); } interface ITV { // ITVๆฅๅฃ public void play(); } class OpenAndClose implements IOpenAndClose { private ITV tv; public void setTv(ITV tv) { this.tv = tv; } public void open() { this.tv.play(); } } ไพ่ตๅ่ฝฌๅๅ็ๆณจๆไบ้กนๅ็ป่ ไพ่ตๅ่ฝฌๅๅ ๅบๅฑๆจกๅๅฐฝ้้ฝ่ฆๆๆฝ่ฑก็ฑปๆๆฅๅฃ๏ผๆ่
ไธค่
้ฝๆ๏ผ็จๅบ็จณๅฎๆงๆดๅฅฝ ๅ้็ๅฃฐๆ็ฑปๅๅฐฝ้ๆฏๆฝ่ฑก็ฑปๆๆฅๅฃ๏ผ่ฟๆ ทๆไปฌ็ๅ้ๅผ็จๅๅฎ้
ๅฏน่ฑก้ด๏ผๅฐฑๅญๅจไธไธช็ผๅฒๅฑ๏ผๅฉไบ็จๅบๆฉๅฑๅไผๅ ็ปงๆฟๆถ้ตๅพช้ๆฐๆฟๆขๅๅ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:3","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"้ๆฐๆฟๆขๅๅ OOไธญ็็ปงๆฟๆง็ๆ่ๅ่ฏดๆ ็ปงๆฟๅ
ๅซ่ฟๆ ทไธๅฑๅซไน๏ผ็ถ็ฑปไธญๅกๆฏๅทฒ็ปๅฎ็ฐๅฅฝ็ๆนๆณ๏ผๅฎ้
ไธๆฏๅจ่ฎพๅฎ่ง่ๅๅฅ็บฆ๏ผ่ฝ็ถไปไธๅผบๅถ่ฆๆฑๆๆ็ๅญ็ฑปๅฟ
้กป้ตๅพช่ฟไบๅฅ็บฆ๏ผไฝๆฏๅฆๆ่ช็ฑปๅฏน่ฟไบๅทฒ็ปๅฎ็ฐ็ๆนๆณ้ๆไฟฎๆน๏ผๅฐฑไผๅฏนๆดไธช็ปงๆฟไฝ็ณป้ ๆ็ ดๅ ็ปงๆฟๅจ็ป็จๅบ่ฎพ่ฎกๅธฆๆฅไพฟๅฉ็ๅๆถ๏ผไนๅธฆๆฅไบๅผ็ซฏใๆฏๅฆไฝฟ็จ็ปงๆฟไผ็ป็จๅบๅธฆๆฅไพตๅ
ฅๆง๏ผ็จๅบ็ๅฏ็งปๆคๆง้ไฝ๏ผๅขๅ ๅฏน่ฑก็่ฆๅๆง๏ผๅฆๆไธไธช็ฑป่ขซๅ
ถไป็็ฑปๆ็ปงๆฟ๏ผๅๅฝ่ฟไธช็ฑป้่ฆไฟฎๆนๆถ๏ผๅฟ
้กป่่ๅฐๆๆ็ๅญ็ฑป๏ผๅนถไธ็ถ็ฑปไฟฎๆนๅ๏ผๆๆๆถๅๅฐๅญ็ฑป็ๅ่ฝ้ฝๆๅฏ่ฝไบง็ๆ
้ ไป็ป ้ๆฐๆฟๆขๅๅ(Liskov Substitution Principle)ๅจ1988ๅนด๏ผ็ฑ้บป็็ๅทฅๅญฆ้ข้ไธไฝๅง้็ๅฅณๅฃซๆๅบ็ ๅฆๆๅฏนๆฏไธช็ฑปๅไธบT1็ๅฏน่ฑกo1๏ผ้ฝๆ็ฑปๅไธบT2็ๅฏน่ฑกo2๏ผไฝฟๅพไปฅT1ๅฎไน็ๆๆ็จๅบPๅจๆๆ็ๅฏน่ฑกo1้ฝๆฟๆขๆo2ๆถ๏ผ็จๅบP็่กไธบๆฒกๆๅ็ๅๅ๏ผ้ฃไน็ฑปๅT2ๆฏ็ฑปๅT1็ๅญ็ฑปๅใๆขๅฅ่ฏ่ฏด๏ผๆๆ็ๅผ็จๅบ็ฑป็ๅฐๆนๅฟ
้กป่ฝ้ๆๅฐไฝฟ็จๅ
ถๅญ็ฑป็ๅฏน่ฑก ๅจไฝฟ็จ็ปงๆฟ๏ผ้ตๅพช้ๆฐๆฟๆขๅๅ๏ผๅจๅญ็ฑปไธญๅฐฝ้ไธ่ฆ้ๅ็ถ็ฑป็ๆนๆณ ้ๆฐๆฟๆขๅๅๅ่ฏๆไปฌ๏ผ็ปงๆฟๅฎ้
ไธ่ฎฉไธคไธช็ฑป่ฆๅๆงๅขๅผบไบ๏ผๅจ้ๅฝ็ๆ
ๅตไธ๏ผๅฏไปฅ้่ฟ่ฆๅใ็ปๅใไพ่ตๆฅ่งฃๅณ้ฎ้ข ้ๆฐๆฟๆข ้ๆฐๆฟๆขๅๅ้็จๅๆณ๏ผๅๆฅ็็ถ็ฑปๅๅญ็ฑป้ฝ็ปงๆฟไธไธชๆด้ไฟ็ๅบ็ฑป๏ผๅๆ็็ปงๆฟๅ
ณ็ณปๅปๆ๏ผ้็จไพ่ตใ่ๅใ็ปๅ็ญๅ
ณ็ณปๆฟไปฃใ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:4","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅผ้ญๅๅ ไป็ป ๅผ้ญๅๅ(Open Closed Principle)ๆฏ็ผ็จไธญๆๅบ็กใๆ้่ฆ็่ฎพ่ฎกๅๅ ไธไธช่ฝฏไปถๅฎไฝๅฆ็ฑป๏ผๆจกๅๅๅฝๆฐๅบ่ฏฅๅฏนๆฉๅฑๅผๆพ(ๅฏนๆไพๆน)๏ผๅฏนไฟฎๆนๅ
ณ้ญ(ๅฏนไฝฟ็จๆน)ใ็จๆฝ่ฑกๆๅปบๆกๆถ๏ผ็จๅฎ็ฐๆฉๅฑ็ป่ ๅฝ่ฝฏไปถ้่ฆๅๅๆถ๏ผๅฐฝ้้่ฟๆฉๅฑ่ฝฏไปถๅฎไฝ็่กไธบๆฅๅฎ็ฐๅๅ๏ผ่ไธๆฏ้่ฟไฟฎๆนๅทฒๆ็ไปฃ็ ๆฅๅฎ็ฐๅๅ ็ผ็จไธญ้ตๅพชๅ
ถไปๅๅ๏ผไปฅๅไฝฟ็จ่ฎพ่ฎกๆจกๅผ็็ฎ็ๅฐฑๆฏ้ตๅพชๅผ้ญๅๅ ็ฑปๅพๆผ็คบ public class Ocp { public static void main(String[] args) { //ไฝฟ็จ็็ๅญๅจ็้ฎ้ข GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); graphicEditor.drawShape(new Triangle()); } } //่ฟๆฏไธไธช็จไบ็ปๅพ็็ฑป [ไฝฟ็จๆน] class GraphicEditor { //ๆฅๆถShapeๅฏน่ฑก๏ผ็ถๅๆ นๆฎtype๏ผๆฅ็ปๅถไธๅ็ๅพๅฝข public void drawShape(Shape s) { if (s.m_type == 1) drawRectangle(s); else if (s.m_type == 2) drawCircle(s); else if (s.m_type == 3) drawTriangle(s); } //็ปๅถ็ฉๅฝข public void drawRectangle(Shape r) { System.out.println(\" ็ปๅถ็ฉๅฝข \"); } //็ปๅถๅๅฝข public void drawCircle(Shape r) { System.out.println(\" ็ปๅถๅๅฝข \"); } //็ปๅถไธ่งๅฝข public void drawTriangle(Shape r) { System.out.println(\" ็ปๅถไธ่งๅฝข \"); } } //Shape็ฑป๏ผๅบ็ฑป class Shape { int m_type; } class Rectangle extends Shape { Rectangle() { super.m_type = 1; } } class Circle extends Shape { Circle() { super.m_type = 2; } } //ๆฐๅข็ปไธ่งๅฝข class Triangle extends Shape { Triangle() { super.m_type = 3; } } ๆผ็คบๆนๅผไผ็ผบ็น ไปฃ็ ๆไบ็่งฃ๏ผๆไฝ็ฎๅ ็ผบ็นๆฏ่ฟๅไบ่ฎพ่ฎกๆจกๅผ็OCPๅๅ๏ผๅณๅฏนๆฉๅฑๅผๆพ๏ผๆไพๆน๏ผ๏ผๅฏนไฟฎๆนๅ
ณ้ญ๏ผ้็จๆน๏ผใๅณๅฝๆไปฌ็ป็ฑปๅขๅ ๆฐๅ่ฝ็ๆถๅ๏ผๅฐฝ้ไธไฟฎๆนไปฃ็ ๏ผๆ่
ๅฐฝๅฏ่ฝๅฐไฟฎๆนไปฃ็ ๆฏๅฆๆไปฌ่ฟๆถ่ฆๆฐๅขๅ ไธไธชๅพๅฝข็ง็ฑปไธ่งๅฝข๏ผๆไปฌ้่ฆไฟฎๆน่พๅคๅฐๆน ไผๅๅๆ ๆๅๅปบShape็ฑปๅๆๆฝ่ฑก็ฑป๏ผๅนถๆไพไธไธชๆฝ่ฑก็drawๆนๆณ๏ผ่ฎฉๅญ็ฑปๅปๅฎ็ฐๅณๅฏ๏ผ่ฟๆ ทๆไปฌๆๆฐ็ๅพๅฝข็ง็ฑปๆถ๏ผๅช้่ฆ่ฎฉๆฐ็ๅพๅฝข็ฑป็ปงๆฟShape๏ผๅนถๅฎ็ฐdrawๆนๆณๅณๅฏใ๏ผไฝฟ็จๆน็ไปฃ็ ๅฐฑไธ้่ฆไฟฎๆน๏ผๅณๅฏๆปก่ถณๅผ้ญๅๅ๏ผ public class Ocp { public static void main(String[] args) { //ไฝฟ็จ็็ๅญๅจ็้ฎ้ข GraphicEditor graphicEditor = new GraphicEditor(); graphicEditor.drawShape(new Rectangle()); graphicEditor.drawShape(new Circle()); graphicEditor.drawShape(new Triangle()); graphicEditor.drawShape(new OtherGraphic()); } } //่ฟๆฏไธไธช็จไบ็ปๅพ็็ฑป [ไฝฟ็จๆน] class GraphicEditor { //ๆฅๆถShapeๅฏน่ฑก๏ผ่ฐ็จdrawๆนๆณ public void drawShape(Shape s) { s.draw(); } } //Shape็ฑป๏ผๅบ็ฑป abstract class Shape { int m_type; public abstract void draw();//ๆฝ่ฑกๆนๆณ } class Rectangle extends Shape { Rectangle() { super.m_type = 1; } @Override public void draw() { // TODO Auto-generated method stub System.out.println(\" ็ปๅถ็ฉๅฝข \"); } } class Circle extends Shape { Circle() { super.m_type = 2; } @Override public void draw() { // TODO Auto-generated method stub System.out.println(\" ็ปๅถๅๅฝข \"); } } //ๆฐๅข็ปไธ่งๅฝข class Triangle extends Shape { Triangle() { super.m_type = 3; } @Override public void draw() { // TODO Auto-generated method stub System.out.println(\" ็ปๅถไธ่งๅฝข \"); } } //ๆฐๅขไธไธชๅพๅฝข class OtherGraphic extends Shape { OtherGraphic() { super.m_type = 4; } @Override public void draw() { // TODO Auto-generated method stub System.out.println(\" ็ปๅถๅ
ถๅฎๅพๅฝข \"); } } ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:5","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฟช็ฑณ็นๆณๅ ไป็ป ไธไธชๅฏน่ฑกๅบ่ฏฅๅฏนๅ
ถไปๅฏน่ฑกไฟๆๆๅฐ็ไบ่งฃ ็ฑปๅ็ฑปๅ
ณไบ่ถๅฏๅ๏ผ่ฆๅๅบฆๅฐฑ่ถๅคง ่ฟช็ฑณ็นๆณๅ(Demeter Principle)ๅๅซๆๅฐ็ฅ้ๅๅ๏ผๅณไธไธช็ฑปๅฏน่ชๅทฑไพ่ต็็ฑป็ฅ้็่ถๅฐ่ถๅฅฝใไนๅฐฑๆฏ่ฏด๏ผๅฏนไบ่ขซไพ่ต็็ฑปไธ็ฎกๅคไนๅคๆ๏ผ้ฝๅฐฝ้ๅฐ้ป่พๅฐ่ฃ
ๅจ็ฑป็ๅ
้จใๅฏนๅค้คไบๆไพ็publicๆนๆณ๏ผไธๅฏนๅคๆณ้ฒไปปไฝไฟกๆฏ ่ฟช็ฑณ็นๆณๅ่ฟๆไธชๆด็ฎๅ็ๅฎไน๏ผๅชไธ็ดๆฅ็ๆๅ้ไฟก ็ดๆฅ็ๆๅ๏ผๆฏไธชๅฏน่ฑก้ฝไผไธๅ
ถไปๅฏน่ฑกๆ่ฆๅๅ
ณ็ณป๏ผๅช่ฆไธคไธชๅฏน่ฑกไน้ดๆ่ฆๅๅ
ณ็ณป๏ผๆไปฌๅฐฑ่ฏด่ฟไธคไธชๅฏน่ฑกไน้ดๆฏๆๅๅ
ณ็ณปใ่ฆๅ็ๆนๅผๆๅพๅค๏ผไพ่ตใๅ
ณ่ใ็ปๅใ่ๅ็ญใๅ
ถไธญ๏ผๆไปฌๆๅบ็ฐ็ๆๅๅ้๏ผๆนๆณๅๆฐ๏ผๆนๆณ่ฟๅๅผไธญ็็ฑปไธบ็ดๆฅ็ๆๅ๏ผ่ๅบ็ฐๅจๅฑ้จๅ้ไธญ็็ฑปไธๆฏ็ดๆฅ็ๆๅใไนๅฐฑๆฏ่ฏด๏ผ้็็็ฑปๆๅฅฝไธ่ฆไปฅๅฑ้จๅ้็ๅฝขๅผๅบ็ฐๅจ็ฑป็ๅ
้จ ๅฎไพๅบ็จ ๆ่ฟฐ๏ผๆไธไธชๅญฆๆ ก๏ผไธๅฑๆๅไธชๅญฆ้ขๅๆป้จ๏ผ็ฐ่ฆๆฑๆๅฐๅบๅญฆๆ กๆป้จๅๅทฅIDๅๅญฆ้ขๅๅทฅ็ID import java.util.ArrayList; import java.util.List; //ๅฎขๆท็ซฏ public class Demeter { public static void main(String[] args) { //ๅๅปบไบไธไธช SchoolManager ๅฏน่ฑก SchoolManager schoolManager = new SchoolManager(); //่พๅบๅญฆ้ข็ๅๅทฅid ๅ ๅญฆๆ กๆป้จ็ๅๅทฅไฟกๆฏ schoolManager.printAllEmployee(new CollegeManager()); } } //ๅญฆๆ กๆป้จๅๅทฅ็ฑป class Employee { private String id; public void setId(String id) { this.id = id; } public String getId() { return id; } } //ๅญฆ้ข็ๅๅทฅ็ฑป class CollegeEmployee { private String id; public void setId(String id) { this.id = id; } public String getId() { return id; } } //็ฎก็ๅญฆ้ขๅๅทฅ็็ฎก็็ฑป class CollegeManager { //่ฟๅๅญฆ้ข็ๆๆๅๅทฅ public List\u003cCollegeEmployee\u003e getAllEmployee() { List\u003cCollegeEmployee\u003e list = new ArrayList\u003cCollegeEmployee\u003e(); for (int i = 0; i \u003c 10; i++) { //่ฟ้ๆไปฌๅขๅ ไบ10ไธชๅๅทฅๅฐ list CollegeEmployee emp = new CollegeEmployee(); emp.setId(\"ๅญฆ้ขๅๅทฅid= \" + i); list.add(emp); } return list; } } //ๅญฆๆ ก็ฎก็็ฑป //ๅๆ SchoolManager ็ฑป็็ดๆฅๆๅ็ฑปๆๅชไบ EmployeeใCollegeManager //CollegeEmployee ไธๆฏ ็ดๆฅๆๅ ่ๆฏไธไธช้็็ฑป๏ผ่ฟๆ ท่ฟ่ไบ ่ฟช็ฑณ็นๆณๅ class SchoolManager { //่ฟๅๅญฆๆ กๆป้จ็ๅๅทฅ public List\u003cEmployee\u003e getAllEmployee() { List\u003cEmployee\u003e list = new ArrayList\u003cEmployee\u003e(); for (int i = 0; i \u003c 5; i++) { //่ฟ้ๆไปฌๅขๅ ไบ5ไธชๅๅทฅๅฐ list Employee emp = new Employee(); emp.setId(\"ๅญฆๆ กๆป้จๅๅทฅid= \" + i); list.add(emp); } return list; } //่ฏฅๆนๆณๅฎๆ่พๅบๅญฆๆ กๆป้จๅๅญฆ้ขๅๅทฅไฟกๆฏ(id) void printAllEmployee(CollegeManager sub) { //ๅๆ้ฎ้ข //1. ่ฟ้็ CollegeEmployee ไธๆฏ SchoolManager็็ดๆฅๆๅ //2. CollegeEmployee ๆฏไปฅๅฑ้จๅ้ๆนๅผๅบ็ฐๅจ SchoolManager //3. ่ฟๅไบ ่ฟช็ฑณ็นๆณๅ //่ทๅๅฐๅญฆ้ขๅๅทฅ List\u003cCollegeEmployee\u003e list1 = sub.getAllEmployee(); System.out.println(\"------------ๅญฆ้ขๅๅทฅ------------\"); for (CollegeEmployee e : list1) { System.out.println(e.getId()); } //่ทๅๅฐๅญฆๆ กๆป้จๅๅทฅ List\u003cEmployee\u003e list2 = this.getAllEmployee(); System.out.println(\"------------ๅญฆๆ กๆป้จๅๅทฅ------------\"); for (Employee e : list2) { System.out.println(e.getId()); } } } ๅบ็จๅฎไพๆน่ฟ ๅ้ข่ฎพ่ฎก็้ฎ้ขๅจไบSchoolManagerไธญ๏ผCollegeEmployee็ฑปๅนถไธๆฏSchoolManager็ฑป็็ดๆฅๆๅ ๆ็
ง่ฟช็ฑณ็นๆณๅ๏ผๅบ่ฏฅ้ฟๅ
็ฑปไธญๅบ็ฐ่ฟๆ ท้็ดๆฅๆๅๅ
ณ็ณป็่ฆๅ import java.util.ArrayList; import java.util.List; //ๅฎขๆท็ซฏ public class Demeter { public static void main(String[] args) { System.out.println(\"~~~ไฝฟ็จ่ฟช็ฑณ็นๆณๅ็ๆน่ฟ~~~\"); //ๅๅปบไบไธไธช SchoolManager ๅฏน่ฑก SchoolManager schoolManager = new SchoolManager(); //่พๅบๅญฆ้ข็ๅๅทฅid ๅ ๅญฆๆ กๆป้จ็ๅๅทฅไฟกๆฏ schoolManager.printAllEmployee(new CollegeManager()); } } //ๅญฆๆ กๆป้จๅๅทฅ็ฑป class Employee { private String id; public void setId(String id) { this.id = id; } public String getId() { return id; } } //ๅญฆ้ข็ๅๅทฅ็ฑป class CollegeEmployee { private String id; public void setId(String id) { this.id = id; } public String getId() { return id; } } //็ฎก็ๅญฆ้ขๅๅทฅ็็ฎก็็ฑป class CollegeManager { //่ฟๅๅญฆ้ข็ๆๆๅๅทฅ public List\u003cCollegeEmployee\u003e getAllEmployee() { List\u003cCollegeEmployee\u003e list = new ArrayList\u003cCollegeEmployee\u003e(); for (int i = 0; i \u003c 10; i++) { //่ฟ้ๆไปฌๅขๅ ไบ10ไธชๅๅทฅๅฐ list CollegeEmployee emp = new CollegeEmployee(); emp.setId(\"ๅญฆ้ขๅๅทฅid= \" + i); list.add(emp); } return list; } //่พๅบๅญฆ้ขๅๅทฅ็ไฟกๆฏ public void printEmployee() { //่ทๅๅฐๅญฆ้ขๅๅทฅ List\u003cCollegeEmployee\u003e list1 = getAllEmployee(); System.out.println(\"------------ๅญฆ้ขๅๅทฅ------------\"); for (CollegeEmployee e : list1) { System.out.println(e.getId()); } } } //ๅญฆๆ ก็ฎก็็ฑป //ๅๆ SchoolManager ็ฑป็็ดๆฅๆๅ็ฑปๆๅชไบ EmployeeใCollegeManager //CollegeEmployee ไธๆฏ ็ดๆฅๆๅ ่ๆฏไธไธช้็็ฑป๏ผ่ฟๆ ท่ฟ่ไบ ่ฟช็ฑณ็นๆณๅ class SchoolManager { //่ฟๅๅญฆๆ กๆป้จ็ๅๅทฅ public List\u003cEmployee\u003e getAllEmployee() { List\u003cEmployee\u003e list = new ArrayList\u003cEmployee\u003e(); for (int i = 0; i \u003c 5; i++) { //่ฟ้ๆไปฌๅขๅ ไบ5ไธชๅๅทฅๅฐ list Employee emp = new Employee(); emp.setId(\"ๅญฆๆ กๆป้จๅๅทฅid= \" + i); list.add(emp); } return list; } //่ฏฅๆนๆณๅฎๆ่พๅบๅญฆๆ กๆป้จๅๅญฆ้ขๅๅทฅไฟกๆฏ(id) void printAllEmployee(CollegeManager sub) { //ๅๆ้ฎ้ข //1. ๅฐ่พๅบๅญฆ้ข็ๅๅทฅๆนๆณ๏ผๅฐ่ฃ
ๅฐCollegeManager sub.printEmployee(); //่ทๅๅฐๅญฆๆ กๆป้จๅๅทฅ List\u003cEmployee\u003e list2 = this.getAllEmployee(); System.out.println(\"------------ๅญฆๆ กๆป้จๅๅทฅ-----","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:6","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅๆๅค็จๅๅ ไป็ป ๅๅๆฏๅฐฝ้ไฝฟ็จๅๆ/่ๅ็ๆนๅผ๏ผ่ไธๆฏไฝฟ็จ็ปงๆฟ ๅๆๅค็จๅๅ ่ฎพ่ฎกๅๅๆ ธๅฟๆๆณ ๆพๅบๅบ็จไธญๅฏ่ฝ้่ฆๅๅไนๅค๏ผๆๅฎไปฌ็ฌ็ซๅบๆฅ๏ผไธ่ฆๅ้ฃไบไธ้่ฆๅๅ็ไปฃ็ ๆททๅจไธ่ตท ้ๅฏนๆฅๅฃ็ผ็จ๏ผ่ไธๆฏ้ๅฏนๅฎ็ฐ็ผ็จ ไธบไบไบคไบๅฏน่ฑกไน้ด็ๆพ่ฆๅ่ฎพ่ฎก่ๅชๅ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:2:7","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"UML็ฑปๅพ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:0","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไป็ป UMLโUnified modeling language UML๏ผ็ปไธๅปบๆจก่ฏญ่จ๏ผ๏ผๆฏไธ็ง็จไบ่ฝฏไปถ็ณป็ปๅๆๅ่ฎพ่ฎก็่ฏญ่จๅทฅๅ
ท๏ผๅฎ็จไบๅธฎๅฉ่ฝฏไปถๅผๅไบบๅ่ฟ่กๆ่ๅ่ฎฐๅฝๆ่ทฏ็็ปๆ UMLๆฌ่บซๆฏไธๅฅ็ฌฆๅท็่งๅฎ๏ผๅฐฑๅๆฐๅญฆ็ฌฆๅทๅๅๅญฆ็ฌฆๅทไธๆ ท๏ผ่ฟไบ็ฌฆๅท็จไบๆ่ฟฐ่ฝฏไปถๆจกๅไธญ็ๅไธชๅ
็ด ๅไปไปฌไน้ด็ๅ
ณ็ณป๏ผๆฏๅฆ็ฑปใๆฅๅฃใๅฎ็ฐใๆณๅใไพ่ตใ็ปๅใ่ๅ็ญ ็ฑปๅ
ณ็ณป UMLๅพไพๅ็ฑป ็จไพๅพ๏ผuse case๏ผ ้ๆ็ปๆๅพ๏ผ็ฑปๅพใๅฏน่ฑกๅพใๅ
ๅพใ็ปไปถๅพใ้จ็ฝฒๅพ ๅจๆ่กไธบๅพ๏ผไบคไบๅพ๏ผๆถๅบๅพไธๅไฝๅพ๏ผใ็ถๆๅพใๆดปๅจๅพ ่ฏดๆ๏ผ ็ฑปๅพ็จไบๆ่ฟฐ็ณป็ปไธญ็ฑป๏ผๅฏน่ฑก๏ผๆฌ่บซ็็ปๆๅ็ฑป๏ผๅฏน่ฑก๏ผไน้ด็ๅ็ง้ๆๅ
ณ็ณป๏ผๆฏUMLๅพไธญๆๆ ธๅฟ็ๅพไพ ่ฎพ่ฎกๆจกๅผไธญไฝฟ็จ็ฑปๅพๆ่ฟฐๆจกๅผ่ฎพ่ฎก่ฟ็จ ็ฑปไน้ดๅ
ณ็ณป๏ผไพ่ตใๆณๅ๏ผ็ปงๆฟ๏ผใๅฎ็ฐใๅ
ณ่ใ่ๅไธ็ปๅ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:1","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไพ่ตๅ
ณ็ณป๏ผDependence๏ผ ๅช่ฆๅจ็ฑปไธญไฝฟ็จๅฐไบๅฏนๆน๏ผ้ฃไนไปไปฌไน้ดๅฐฑๅญๅจไพ่ตๅ
ณ็ณปใๅฆๆๆฒกๆๅฏนๆน๏ผ่ฟ็ผ่ฏ้ฝ้่ฟไธไบใ ไพ่ตๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:2","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๆณๅๅ
ณ็ณป๏ผGeneralization๏ผ ๅฆๆไธไธชๆจกๅๅ
็ด ๏ผๅญไปฃ๏ผๅบไบๅฆไธไธชๆจกๅๅ
็ด ๏ผ็ถไปฃ๏ผ๏ผ้ฃไน่ฟไธคไธชๅ
็ด ไน้ดๅฐฑๅญๅจๆณๅๅ
ณ็ณป๏ผ็ปงๆฟๅ
ณ็ณป๏ผ ๆณๅๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:3","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅฎ็ฐๅ
ณ็ณป๏ผImplementation๏ผ ๅฎ็ฐๅ
ณ็ณปๅฎ้
ไธๆฏA็ฑปๅฎ็ฐBๆฅๅฃ๏ผๅฎๆฏไพ่ตๅ
ณ็ณป็็นไพ ๅฎ็ฐๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:4","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅ
ณ่ๅ
ณ็ณป๏ผAssociation๏ผ ๅ
ณ่ๅ
ณ็ณปๅฎ้
ไธๆฏ็ฑปไธ็ฑปไน้ด็่็ณป๏ผๅฎๆฏไพ่ตๅ
ณ็ณป็็นไพ ๅ
ณ่ๅ
ทๆๅฏผ่ชๆง๏ผๅณๅๅๅ
ณ็ณปๆๅๅๅ
ณ็ณป ๅ
ณ็ณปๅ
ทๆๅค้ๆง๏ผๅฆโ1โ๏ผ่กจ็คบๆไธไป
ๆไธไธช๏ผ๏ผโ0โฆโ๏ผ่กจ็คบ0ไธชๆ่
ๅคไธช๏ผ๏ผโ0๏ผ1โ๏ผ่กจ็คบ0ไธชๆ่
ไธไธช๏ผ๏ผโnโฆmโ๏ผ่กจ็คบnๅฐmไธช้ฝๅฏไปฅ๏ผ๏ผโmโฆ*โ๏ผ่กจ็คบ่ณๅฐmไธช๏ผ ๅ
ณ่ๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:5","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ๅๅ
ณ็ณป๏ผAggregation๏ผ ๆฏๆดไฝไธ้จๅ็ๅ
ณ็ณป, ไธ้จๅๅฏไปฅ็ฆปๅผๆดไฝ่ๅ็ฌๅญๅจใ ่ๅๅ
ณ็ณปๆฏๅ
ณ่ๅ
ณ็ณป็ไธ็ง๏ผๆฏๅผบ็ๅ
ณ่ๅ
ณ็ณป ๅ
ณ่ๅ่ๅๅจ่ฏญๆณไธๆ ๆณๅบๅ๏ผๅฟ
้กป่ๅฏๅ
ทไฝ็้ป่พๅ
ณ็ณป ๅฆไธๆ็คบ๏ผ่ฝฆๅ่ฝฎ่ๆฏๆดไฝๅ้จๅ็ๅ
ณ็ณป๏ผ่ฝฎ่็ฆปๅผ่ฝฆไป็ถๅฏไปฅๅญๅจ ่ๅๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:6","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"็ปๅๅ
ณ็ณป๏ผComposition๏ผ ็ปๅๅ
ณ็ณป๏ผไนๆฏๆดไฝไธ้จๅ็ๅ
ณ็ณป๏ผไฝๆฏๆดไฝไธ้จๅไธๅฏไปฅๅๅผ ็ปๅๅ
ณ็ณปๆฏๅ
ณ่ๅ
ณ็ณปไธญ็ไธ็ง๏ผไนๆฏๆฏ่ๅๅ
ณ็ณป่ฟ่ฆๅผบ็ๅ
ณ็ณป๏ผๅฎ่ฆๆฑๆฎ้็่ๅๅ
ณ็ณปไธญไปฃ่กจๆดไฝ็ๅฏน่ฑก่ด่ดฃไปฃ่กจ้จๅๅฏน่ฑก็็ๅฝๅจๆ ๅฆไธๆ็คบ๏ผๅ
ฌๅธๅ้จๅๆฏๆดไฝๅ้จ้จ็ๅ
ณ็ณป๏ผๆฒกๆๅ
ฌๅธๅฐฑไธๅญๅจ้จ้จ ็ปๅๅ
ณ็ณป ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:3:7","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฎพ่ฎกๆจกๅผ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:0","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไป็ป ่ฎพ่ฎกๆจกๅผๆฏ็จๅบๅๅจ้ขๅฏนๅ็ฑป่ฝฏไปถๅทฅ็จ่ฎพ่ฎก้ฎ้ขๆๆป็ปๅบๆฅ็ๆ็จ็็ป้ช๏ผๆจกๅผไธๆฏไปฃ็ ๏ผ่ๆฏๆ็ฑป้ฎ้ข็้็จ่งฃๅณๆนๆก๏ผ่ฎพ่ฎกๆจกๅผ๏ผDesign Pattern๏ผไปฃ่กจไบๆไฝณ็ๅฎ่ทตใ่ฟไบ่งฃๅณๆนๆกๆฏไผๅค่ฝฏไปถๅผๅไบบๅ็ป่ฟ็ธๅฝ้ฟ็ไธๆฎตๆถ้ด็่ฏ้ชๅ้่ฏฏๆป็ปๅบๆฅ็ใ ่ฎพ่ฎกๆจกๅผ็ๆฌ่ดจๆฏๆ้ซ่ฝฏไปถ็็ปดๆคๆงใ้็จๅๅๆฉๅฑๆง๏ผๅนถ้ไฝ่ฝฏไปถ็ๅคๆๅบฆใ ใ่ฎพ่ฎกๆจกๅผใๆฏ็ปๅ
ธ็ไนฆ๏ผไฝ่
ๆฏErich GammaใRichard HelmใRalph JohnsonๅJohn Vlissides Design๏ผไฟ็งฐโๅไบบ็ปGOFโ๏ผ ่ฎพ่ฎกๆจกๅผๅนถไธๅฑ้ไบๆ็ง่ฏญ่จ๏ผJavaใPHPใC++้ฝๆ่ฎพ่ฎกๆจกๅผใ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:1","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฎพ่ฎกๆจกๅผๅ็ฑป ๆจกๅผๅไธบไธ็ง็ฑปๅ ๅๅปบๅๆจกๅผ๏ผ ๅไพๆจกๅผใๆฝ่ฑกๅทฅๅๆจกๅผใๅๅๆจกๅผใๅปบ้ ่
ๆจกๅผใๅทฅๅๆจกๅผใ ็ปๆๅๆจกๅผ๏ผ ้้
ๅจๆจกๅผใๆกฅๆฅๆจกๅผใ่ฃ
้ฅฐๆจกๅผใ็ปๅๆจกๅผใๅค่งๆจกๅผใไบซๅ
ๆจกๅผใไปฃ็ๆจกๅผใ ่กไธบๅๆจกๅผ๏ผ ๆจก็ๆนๆณๆจกๅผใๅฝไปคๆจกๅผใ่ฎฟ้ฎ่
ๆจกๅผใ่ฟญไปฃๅจๆจกๅผใ่งๅฏ่
ๆจกๅผใไธญไป่
ๆจกๅผใๅคๅฟๅฝๆจกๅผใ่งฃ้ๅจๆจกๅผ๏ผInterpreterๆจกๅผ๏ผใ็ถๆๆจกๅผใ็ญ็ฅๆจกๅผใ่่ดฃๆจกๅผ๏ผ่ดฃไปป้พๆจกๅผ๏ผใ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:2","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅไพๆจกๅผ ไป็ป ๆ่ฐ็ฑป็ๅไพ่ฎพ่ฎกๆจกๅผ๏ผๅฐฑๆฏ้ๅไธๅฎ็ๆนๆณไฟ่ฏๅจๆดไธช็่ฝฏไปถ็ณป็ปไธญ๏ผๅฏนๆไธช็ฑปไธญๅช่ฝๅญๅจไธไธชๅฏน่ฑกๅฎไพ๏ผๅนถไธ่ฏฅ็ฑปๅชๆไพไธไธชๅๅพๅ
ถๅฏน่ฑกๅฎไพ็ๆนๆณ๏ผ้ๆๆนๆณ๏ผใ ๅไพๆจกๅผไธพไพ๏ผ ๆฏๅฆHibernate็SessionFactory๏ผๅฎๅ
ๅฝๆฐๆฎๅญๅจๆบ็ไปฃ็๏ผๅนถ่ด่ดฃๅๅปบSessionๅฏน่ฑกใSessionFactoryๅนถไธๆฏไธไธช่ฝป้็บง็๏ผไธ่ฌๆ
ๅตไธ๏ผไธไธช้กน็ฎ้ๅธธๅช้่ฆไธไธชSessionFactoryๅฐฑๅค๏ผ่ฟๆถๅฐฑไผไฝฟ็จๅฐๅไพๆจกๅผใ ๅไพๆจกๅผ็ๅ
ซ็งๆนๅผ ้ฅฟๆฑๅผ๏ผ้ๆๅธธ้๏ผ ้ฅฟๆฑๅผ๏ผ้ๆไปฃ็ ๅ๏ผ ๆๆฑๅผ๏ผ็บฟ็จไธๅฎๅ
จ๏ผ ๆๆฑๅผ๏ผ็บฟ็จๅฎๅ
จ๏ผๅๆญฅๆนๆณ๏ผ ๆๆฑๅผ๏ผ็บฟ็จๅฎๅ
จ๏ผๅๆญฅไปฃ็ ๅ๏ผ ๅ้ๆฃๆฅ ้ๆๅ
้จ็ฑป ๆไธพ ้ฅฟๆฑๅผ๏ผ้ๆๅธธ้๏ผ ๅฎ็ฐๆญฅ้ชค ๆ้ ๅจ็งๆๅ๏ผ้ฒๆญขnew๏ผ ็ฑป็ๅ
้จๅๅปบๅฏน่ฑก ๅๅคๆด้ฒไธไธช้ๆ็ๅ
ฌๅ
ฑๆนๆณ ไปฃ็ ๅฎ็ฐ public class SingletonTest01 { public static void main(String[] args) { //ๆต่ฏ Singleton instance = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance == instance2); // true System.out.println(\"instance.hashCode=\" + instance.hashCode()); System.out.println(\"instance2.hashCode=\" + instance2.hashCode()); } } //้ฅฟๆฑๅผ(้ๆๅ้) class Singleton { //1. ๆ้ ๅจ็งๆๅ, ๅค้จ่ฝnew private Singleton() { } //2.ๆฌ็ฑปๅ
้จๅๅปบๅฏน่ฑกๅฎไพ private final static Singleton instance = new Singleton(); //3. ๆไพไธไธชๅ
ฌๆ็้ๆๆนๆณ๏ผ่ฟๅๅฎไพๅฏน่ฑก public static Singleton getInstance() { return instance; } } ๆจกๅผไผ็ผบ็น่ฏดๆ๏ผ ไผ็น๏ผ ่ฟ็งๅๆณๆฏ่พ็ฎๅ๏ผๅฐฑๆฏๅจ็ฑป่ฃ
่ฝฝ็ๆถๅๅฐฑๅฎๆๅฎไพๅใ้ฟๅ
ไบ็บฟ็จๅๆญฅ้ฎ้ขใ ็ผบ็น๏ผ ๅจ็ฑป่ฃ
่ฝฝ็ๆถๅๅฐฑๅฎๆๅฎไพๅ๏ผๆฒกๆ่พพๅฐLazy Loading็ๆๆใๅฆๆไปๅง่ณ็ปไปๆชไฝฟ็จ่ฟ่ฟไธชๅฎไพ๏ผๅไผ้ ๆๅ
ๅญ็ๆตช่ดนใ ่ฟ็งๆนๅผๅบไบclassoderๆบๅถ้ฟๅ
ไบๅค็บฟ็จ็ๅๆญฅ้ฎ้ข๏ผไธ่ฟ๏ผinstabceๅจ็ฑป่ฃ
่ฝฝๆถๅฐฑๅฎไพๅ๏ผๅจๅไพๆจกๅผไธญๅคงๅคๆฐ้ฝๆฏ่ฐ็จgetInstanceๆนๆณ๏ผไฝๆฏๅฏผ่ด็ฑป่ฃ
่ฝฝ็ๅๅ ๆๅพๅค็ง๏ผๅ ๆญคไธ่ฝ็กฎๅฎๆๅ
ถไป็ๆนๅผ๏ผๆ่
ๅ
ถไป็้ๆๆนๆณ๏ผๅฏผ่ด็ฑป่ฃ
่ฝฝ๏ผ่ฟไธชๆถๅๅๅงๅinstanceๅฐฑๆฒกๆ่พพๅฐlazy loading็ๆๆใ ็ป่ฎบ๏ผ่ฟ็งๅไพๆจกๅผๅฏ็จ๏ผๅฏ่ฝ้ ๆๅ
ๅญๆตช่ดนใ ้ฅฟๆฑๅผ๏ผ้ๆไปฃ็ ๅ๏ผ ๅฎไพๅบ็จ package com.atguigu.singleton.type2; public class SingletonTest02 { public static void main(String[] args) { //ๆต่ฏ Singleton instance = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance == instance2); // true System.out.println(\"instance.hashCode=\" + instance.hashCode()); System.out.println(\"instance2.hashCode=\" + instance2.hashCode()); } } //้ฅฟๆฑๅผ(้ๆๅ้) class Singleton { //1. ๆ้ ๅจ็งๆๅ, ๅค้จ่ฝnew private Singleton() { } //2.ๆฌ็ฑปๅ
้จๅๅปบๅฏน่ฑกๅฎไพ private static Singleton instance; static { // ๅจ้ๆไปฃ็ ๅไธญ๏ผๅๅปบๅไพๅฏน่ฑก instance = new Singleton(); } //3. ๆไพไธไธชๅ
ฌๆ็้ๆๆนๆณ๏ผ่ฟๅๅฎไพๅฏน่ฑก public static Singleton getInstance() { return instance; } } ๆจกๅผไผ็ผบ็น่ฏดๆ ่ฟ็งๆนๅผๅไธ้ข็ๆนๅผๅ
ถๅฎ็ฑปไผผ๏ผๅชไธ่ฟๅฐ็ฑปๅฎไพๅ็่ฟ็จๆพๅจไบ้ๆไปฃ็ ๅไธญ๏ผไนๆฏๅจ็ฑป่ฃ
่ฝฝ็ๆถๅ๏ผๅฐฑๆง่ก้ๆไปฃ็ ๅไธญ็ไปฃ็ ๏ผๅๅงๅ็ฑป็ๅฎไพใ๏ผไผ็ผบ็นไธไธ้ขไธ่ด๏ผ ็ป่ฎบ๏ผ่ฟ็งๅไพๆจกๅผๅฏ็จ๏ผไฝๆฏๅฏ่ฝ้ ๆๅ
ๅญๆตช่ดนใ ๆๆฑๅผ๏ผ็บฟ็จไธๅฎๅ
จ๏ผ ๅฎไพๅบ็จ public class SingletonTest03 { public static void main(String[] args) { System.out.println(\"ๆๆฑๅผ1 ๏ผ ็บฟ็จไธๅฎๅ
จ~\"); Singleton instance = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance == instance2); // true System.out.println(\"instance.hashCode=\" + instance.hashCode()); System.out.println(\"instance2.hashCode=\" + instance2.hashCode()); } } class Singleton { private static Singleton instance; private Singleton() {} //ๆไพไธไธช้ๆ็ๅ
ฌๆๆนๆณ๏ผๅฝไฝฟ็จๅฐ่ฏฅๆนๆณๆถ๏ผๆๅปๅๅปบ instance //ๅณๆๆฑๅผ public static Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } } ๆจกๅผไผ็ผบ็น่ฏดๆ ่ตทๅฐไบLazy Loading็ๆๆ๏ผไฝๆฏๅช่ฝๅจๅ็บฟ็จไธไฝฟ็จใ ๅฆๆๅจๅค็บฟ็จไธ๏ผไธไธช็บฟ็จ่ฟๅ
ฅไบif(singleton == null)ๅคๆญ่ฏญๅฅๅ๏ผ่ฟๆชๆฅๅพๅๅพไธๆง่ก๏ผๅฆไธไธช็บฟ็จไน้่ฟไบ่ฟไธชๅคๆญ่ฏญๅฅ๏ผ่ฟๆถไพฟไผไบง็ๅคไธชๅฎไพใๆไปฅๅจๅค็บฟ็จ็ฏๅขไธไธๅฏไปฅไฝฟ็จ่ฟ็งๆนๅผใ ็ป่ฎบ๏ผๅจๅฎ้
ๅผๅไธญ๏ผไธ่ฆไฝฟ็จ่ฟ็งๆนๅผใ ๆๆฑๅผ๏ผ็บฟ็จๅฎๅ
จ๏ผๅๆญฅๆนๆณ๏ผ ๅบ็จๅฎไพ public class SingletonTest04 { public static void main(String[] args) { System.out.println(\"ๆๆฑๅผ2 ๏ผ ็บฟ็จๅฎๅ
จ~\"); Singleton instance = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println(instance == instance2); // true System.out.println(\"instance.hashCode=\" + instance.hashCode()); System.out.println(\"instance2.hashCode=\" + instance2.hashCode()); } } // ๆๆฑๅผ(็บฟ็จๅฎๅ
จ๏ผๅๆญฅๆนๆณ) class Singleton { private static Singleton instance; private Singleton() {} //ๆไพไธไธช้ๆ็ๅ
ฌๆๆนๆณ๏ผๅ ๅ
ฅๅๆญฅๅค็็ไปฃ็ ๏ผ่งฃๅณ็บฟ็จๅฎๅ
จ้ฎ้ข //ๅณๆๆฑๅผ public static synchronized Singleton getInstance() { if(instance == null) { instance = new Singleton(); } return instance; } } ๆจกๅผไผ็ผบ็น่ฏดๆ ่งฃๅณไบ็บฟ็จไธๅฎๅ
จ้ฎ้ข ๆ็ๅคชไฝไบ๏ผๆฏไธช็บฟ็จๅๆณ่ทๅพ็ฑป็ๅฎไพๆถๅ๏ผๆง่กgetInstance()ๆนๆณ้ฝ่ฆ่ฟ่กๅๆญฅใ่ๅ
ถๅฎ่ฟไธชๆนๆณๅชๆง่กไธๆฌกๅฎไพๅไปฃ็ ๅฐฑๅคไบ๏ผๅ้ข็ๆณ่ทๅพ่ฏฅ็ฑปๅฎไพ๏ผ็ดๆฅreturnๅฐฑ่กไบใๆนๆณ่ฟ่กๅๆญฅๆ็ๅคชไฝใ ็ป่ฎบ๏ผๅจๅฎ้
ๅผๅไธญ๏ผไธๆจ่ไฝฟ็จ่ฟ็งๆนๅผ ๆๆฑๅผ๏ผ็บฟ็จๅฎๅ
จ๏ผๅๆญฅไปฃ็ ๅ๏ผ ๅบ็จๅฎไพ class Singleton { private static Singleton singleton; private Singleton() {} public Singleton getInstance() { if(singleton == null) { synchronized (Singleton.class) { singleton = new Singleton(); } } return singleton; } } // ไธๆจ่ไฝฟ็จ ๅ้ๆฃๆฅ public class SingletonTest06 { public static void main(String[] args) { System.out.println(\"ๅ้ๆฃๆฅ\"); Singleton inst","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:3","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅทฅๅๆจกๅผ ็ฎๅๅทฅๅๆจกๅผ ๅบ็จไธพไพ ้ๆฑ๏ผๆไธไธชๆซ่จ็้กน็ฎ๏ผ่ฆไพฟไบๆซ่จ็ง็ฑป็ๆฉๅฑ๏ผ่ฆไพฟไบ็ปดๆค ๆซ่จ็็ง็ฑปๅพๅค๏ผๆฏๅฆ GreekPizzใCheesePizz็ญ๏ผ ๆซ่จ็ๅถไฝๆ prepareใbackใcutใbox ๅฎๆๆซ่จๅบ็่ฎข่ดญๅ่ฝ ไผ ็ปๆนๆณๅๆ ๆ่ทฏๅๆ๏ผ็ฑปๅพ๏ผ ๆซ่จ้กน็ฎ็ฑปๅพ ็ฎๅๅทฅๅๆจกๅผ็่ฎพ่ฎกๆนๆก๏ผๅฎไนไธไธชๅฏไปฅๅฎไพๅ็Pizaaๅฏน่ฑก็็ฑป๏ผๅฐ่ฃ
ๅๅปบๅฏน่ฑก็ไปฃ็ ใ //ๅฐPizza ็ฑปๅๆๆฝ่ฑก public abstract class Pizza { protected String name; //ๅๅญ //ๅๅคๅๆๆ, ไธๅ็ๆซ่จไธไธๆ ท๏ผๅ ๆญค๏ผๆไปฌๅๆๆฝ่ฑกๆนๆณ public abstract void prepare(); public void bake() { System.out.println(name + \" baking;\"); } public void cut() { System.out.println(name + \" cutting;\"); } //ๆๅ
public void box() { System.out.println(name + \" boxing;\"); } public void setName(String name) { this.name = name; } } public class PepperPizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub System.out.println(\" ็ป่กๆคๆซ่จๅๅคๅๆๆ \"); } } public class GreekPizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub System.out.println(\" ็ปๅธ่
ๆซ่จ ๅๅคๅๆๆ \"); } } public class CheesePizza extends Pizza { @Override public void prepare() { // TODO Auto-generated method stub System.out.println(\" ็ปๅถไฝๅฅถ้
ชๆซ่จ ๅๅคๅๆๆ \"); } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class OrderPizza { Pizza pizza = null; String orderType = \"\"; // ๆ้ ๅจ public OrderPizza2() { do { orderType = getType(); pizza = SimpleFactory.createPizza2(orderType); // ่พๅบpizza if (pizza != null) { // ่ฎข่ดญๆๅ pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); } else { System.out.println(\" ่ฎข่ดญๆซ่จๅคฑ่ดฅ \"); break; } } while (true); } // ๅไธไธชๆนๆณ๏ผๅฏไปฅ่ทๅๅฎขๆทๅธๆ่ฎข่ดญ็ๆซ่จ็ง็ฑป private String getType() { try { BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); System.out.println(\"input pizza ็ง็ฑป:\"); String str = strin.readLine(); return str; } catch (IOException e) { e.printStackTrace(); return \"\"; } } } ไผ ็ปๆนๆณ็ไผ็ผบ็น ไผ็นๆฏๆฏ่พๅฅฝ็่งฃ๏ผ็ฎๅๆๆไฝ ็ผบ็นๆฏ่ฟๅไบ่ฎพ่ฎกๆจกๅผ็OCPๅๅ๏ผๅณๅฏนๆฉๅฑๅผๆพ๏ผๅฏนไฟฎๆนๅ
ณ้ญใๅณๅฝๆไปฌ็ป็ฑปๅขๅ ๆฐๅ่ฝ็ๆถๅ๏ผๅฐฝ้ไธไฟฎๆนไปฃ็ ๏ผๆ่
ๅฐฝๅฏ่ฝๅฐไฟฎๆนไปฃ็ ๆฏๅฆๆไปฌ่ฟๆถ่ฆๆฐๅขๅ ไธไธชPizza็็ง็ฑป๏ผPepperๆซ่จ๏ผ๏ผๆไปฌ้่ฆๅฆๅคๅขๅ ๆฐ็ง็ฑป่ฟ่กไฟฎๆน ๆน่ฟๆ่ทฏไธๅๆ ๅๆ๏ผ ไฟฎๆนไปฃ็ ๅฏไปฅๆฅๅ๏ผไฝๆฏๅฆๆๆไปฌๅจๅ
ถไป็ๅฐๆนๆๅๅปบPizza็ไปฃ็ ๏ผๅฐฑๆๅณ็๏ผไน้่ฆไฟฎๆน๏ผ่ๅๅปบPizza็ไปฃ็ ๏ผๅพๅพๆๅคๅค ๆ่ทฏ๏ผๆๅๅปบPizzaๅฏน่ฑกๅฐ่ฃ
ๅฐไธไธช็ฑปไธญ๏ผ่ฟๆ ทๆไปฌๆๆฐ็Pizza็ง็ฑปๆถ๏ผๅช้่ฆไฟฎๆน่ฏฅ็ฑปๅณๅฏ๏ผๅ
ถๅฎๆๅๅปบๅฐPizzaๅฏน่ฑก็ไปฃ็ ๅฐฑไธ้่ฆไฟฎๆนไบ -\u003e ็ฎๅๅทฅๅๆจกๅผ ็ฎๅๅทฅๅๆจกๅผไป็ป ็ฎๅๅทฅๅๆจกๅผๆฏๅฑไบๅๅปบๅๆจกๅผ๏ผๆฏๅทฅๅๆจกๅผ็ไธ็งใ็ฎๅๅทฅๅๆจกๅผๆฏ็ฑไธไธชๅทฅๅๅฏน่ฑกๅณๅฎๅๅปบๅบๅชไธ็งไบงๅ็ฑป็ๅฎไพใ็ฎๅๅทฅๅๆจกๅผๆฏๅทฅๅๆจกๅผๅฎถๆไธญๆ็ฎๅๅฎ็จ็ๆจกๅผ ็ฎๅๅทฅๅๆจกๅผ๏ผๅฎไนไบไธไธชๅๅปบๅฏน่ฑก็็ฑป๏ผ็ฑ่ฟไธช็ฑปๆฅๅฐ่ฃ
ๅฎไพๅๅฏน่ฑก็่กไธบ๏ผไปฃ็ ๏ผ ๅจ่ฝฏไปถๅผๅไธญ๏ผๅฝๆไปฌไผ็จๅฐๅคง้็ๅๅปบๆ็งใๆ็ฑปๆ่
ๆๆนๅฏน่ฑกๆถ๏ผๅฐฑไผไฝฟ็จๅฐๅทฅๅๆจกๅผ ็ฎๅๅทฅๅๆจกๅผๆน้ ็ฎๅๅทฅๅๆจกๅผ็่ฎพ่ฎกๆนๆก๏ผๅฎไนไธไธชๅฏไปฅๅฎไพๅPizzaๅฏน่ฑก็็ฑป๏ผๅฐ่ฃ
ๅๅปบๅฏน่ฑก็ไปฃ็ ใ package com.atguigu.factory.simplefactory.pizzastore.order; //็ฎๅๅทฅๅ็ฑป public class SimpleFactory { //ๆดๅ orderType ่ฟๅๅฏนๅบ็Pizza ๅฏน่ฑก public Pizza createPizza(String orderType) { Pizza pizza = null; System.out.println(\"ไฝฟ็จ็ฎๅๅทฅๅๆจกๅผ\"); if (orderType.equals(\"greek\")) { pizza = new GreekPizza(); pizza.setName(\" ๅธ่
ๆซ่จ \"); } else if (orderType.equals(\"cheese\")) { pizza = new CheesePizza(); pizza.setName(\" ๅฅถ้
ชๆซ่จ \"); } else if (orderType.equals(\"pepper\")) { pizza = new PepperPizza(); pizza.setName(\"่กๆคๆซ่จ\"); } return pizza; } //็ฎๅๅทฅๅๆจกๅผ ไนๅซ ้ๆๅทฅๅๆจกๅผ public static Pizza createPizza2(String orderType) { Pizza pizza = null; System.out.println(\"ไฝฟ็จ็ฎๅๅทฅๅๆจกๅผ2\"); if (orderType.equals(\"greek\")) { pizza = new GreekPizza(); pizza.setName(\" ๅธ่
ๆซ่จ \"); } else if (orderType.equals(\"cheese\")) { pizza = new CheesePizza(); pizza.setName(\" ๅฅถ้
ชๆซ่จ \"); } else if (orderType.equals(\"pepper\")) { pizza = new PepperPizza(); pizza.setName(\"่กๆคๆซ่จ\"); } return pizza; } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class OrderPizza { // ๆ้ ๅจ // public OrderPizza() { // Pizza pizza = null; // String orderType; // ่ฎข่ดญๆซ่จ็็ฑปๅ // do { // orderType = getType(); // if (orderType.equals(\"greek\")) { // pizza = new GreekPizza(); // pizza.setName(\" ๅธ่
ๆซ่จ \"); // } else if (orderType.equals(\"cheese\")) { // pizza = new CheesePizza(); // pizza.setName(\" ๅฅถ้
ชๆซ่จ \"); // } else if (orderType.equals(\"pepper\")) { // pizza = new PepperPizza(); // pizza.setName(\"่กๆคๆซ่จ\"); // } else { // break; // } // //่พๅบpizza ๅถไฝ่ฟ็จ // pizza.prepare(); // pizza.bake(); // pizza.cut(); // pizza.box(); // // } while (true); // } //ๅฎไนไธไธช็ฎๅๅทฅๅๅฏน่ฑก SimpleFactory simpleFactory; Pizza pizza = null; //ๆ้ ๅจ public OrderPizza(SimpleFactory simpleFactory) { setFactory(simpleFactory); } public void setFac","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:4","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅๅๆจกๅผ ไผ ็ปๆนๆณ ๅ
้็พ้ฎ้ข ็ฐๅจๆไธๅช็พtom๏ผๅงๅไธบ๏ผtom๏ผๅนด้พไธบ๏ผ1๏ผ้ข่ฒไธบ๏ผ็ฝ่ฒ๏ผ่ฏท็ผๅ็จๅบๅๅปบๅtom็พๅฑๆงๅฎๅ
จ็ธๅ็10ๅช็พใ ไผ ็ปๆนๅผ่งฃๅณ ๆ่ทฏๅๆ๏ผ็ฑปๅพๅพ่งฃ ๅ
้็พ็ฑปๅพ public class Sheep { private String name; private int age; private String color; public Sheep(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return \"Sheep [name=\" + name + \", age=\" + age + \", color=\" + color + \"]\"; } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ไผ ็ป็ๆนๆณ Sheep sheep = new Sheep(\"tom\", 1, \"็ฝ่ฒ\"); Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); Sheep sheep4 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); Sheep sheep5 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor()); //.... System.out.println(sheep); System.out.println(sheep2); System.out.println(sheep3); System.out.println(sheep4); System.out.println(sheep5); //... } } ไผ ็ปๆนๅผ็ไผ็ผบ็น ๆ็นๆฏๆฏ่พๅฅฝ็่งฃ๏ผ็ฎๅๆๆไฝใ ๅจๅๅปบๆฐ็ๅฏน่ฑกๆถ๏ผๆปๆฏ้่ฆ้ๆฐ่ทๅๅๅงๅฏน่ฑก็ๅฑๆง๏ผๅฆๆๅๅปบ็ๅฏน่ฑกๆฏ่พๅคๆๆถ๏ผๆ็่พไฝใ ๆปๆฏ้่ฆ้ๆฐๅๅงๅๅฏน่ฑก๏ผ่ไธๆฏๅจๆๅฐ่ทๅพๅฏน่ฑก่ฟ่กๆถ็็ถๆ๏ผไธๅค็ตๆดปใ ๆน่ฟๆ่ทฏไธๅๆ ๆ่ทฏ๏ผJavaไธญObject็ฑปๆฏๆๆ็ฑป็ๆ น็ฑป๏ผObject็ฑปๆไพไบไธไธชclone()ๆนๆณ๏ผ่ฏฅๆนๆณๅฏไปฅๅฐไธไธชJavaๅฏน่ฑกๅคๅถไธไปฝ๏ผไฝๆฏ้่ฆๅฎ็ฐclone็Java็ฑปๅฟ
้กป่ฆๅฎ็ฐไธไธชๆฅๅฃCloneable๏ผ่ฏฅๆฅๅฃ่กจ็คบ่ฏฅ็ฑป่ฝๅคๅคๅถไธๅ
ทๆๅคๅถ็่ฝๅ-\u003eๅๅๆจกๅผ ๅๅๆจกๅผ ไป็ป ๅๅๆจกๅผ๏ผPrototypeๆจกๅผ๏ผๆฏๆ๏ผ็จๅๅๅฎไพๆๅฎๅๅปบๅฏน่ฑก็็ง็ฑป๏ผๅนถไธ้่ฟๆท่ด่ฟไบๅๅ๏ผๅๅปบๆฐ็ๅฏน่ฑกใ ๅๅๆจกๅผๆฏไธ็งๅๅปบๅ่ฎพ่ฎกๆจกๅผ๏ผๅ
่ฎธไธไธชๅฏน่ฑกๅๅๅปบๅฆๅคไธไธชๅฏๅฎๅถ็ๅฏน่ฑก๏ผๆ ้็ฅ้ๅฆไฝๅๅปบ็็ป่ใ ๅทฅไฝๅ็๏ผ้่ฟๅฐไธไธชๅๅๅฏน่ฑกไผ ็ป้ฃไธช่ฆๅๅจๅๅปบ็ๅฏน่ฑก๏ผ่ฟไธช่ฆๅๅจๅๅปบ็ๅฏน่ฑก้่ฟ่ฏทๆฑๅๅๅฏน่ฑกๆท่ดๅฎไปฌ่ชๅทฑๆฅๅฎๆฝๅๅปบ๏ผๅณ ๅฏน่ฑก.clone() ๅฝข่ฑก็็่งฃ๏ผๅญๅคงๅฃๆๅบ็ดๆฏ๏ผๅๅบๅ
ถไปๅญๅคงๅฃใ ๅๅๆจกๅผๅ็็ปๆๅพ-UML็ฑปๅพ ๅๅๆจกๅผ็ฑปๅพ ๅ็็ปๆๅพ่ฏดๆ Prototype๏ผๅๅ็ฑป๏ผๅฃฐๆไธไธชๅ
้่ชๅทฑ็ๆฅๅฃ ConcretePrototype๏ผๅ
ทไฝ็ๅๅ็ฑป๏ผๅฎ็ฐไธไธชๅ
้่ชๅทฑ็ๆไฝ Client๏ผ่ฎฉไธไธชๅๅๅฏน่ฑกๅ
้่ชๅทฑ๏ผไป่ๅๅปบไธไธชๆฐ็ๅฏน่ฑก๏ผๅฑๆงไธๆ ท๏ผ ๅๅๆจกๅผ่งฃๅณๅ
้็พ้ฎ้ข ไฝฟ็จๅๅๆจกๅผๆน่ฟไผ ็ปๆนๅผ๏ผ่ฎฉ็จๅบๅ
ทๆๆด้ซ็ๆ็ๅๆฉๅฑๆง public class Sheep implements Cloneable { private String name; private int age; private String color; private String address = \"่ๅค็พ\"; public Sheep friend; //ๆฏๅฏน่ฑก, ๅ
้ๆฏไผๅฆไฝๅค็ public Sheep(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return \"Sheep [name=\" + name + \", age=\" + age + \", color=\" + color + \", address=\" + address + \"]\"; } //ๅ
้่ฏฅๅฎไพ๏ผไฝฟ็จ้ป่ฎค็cloneๆนๆณๆฅๅฎๆ @Override protected Object clone() { Sheep sheep = null; try { sheep = (Sheep)super.clone(); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } // TODO Auto-generated method stub return sheep; } } public class Client { public static void main(String[] args) { System.out.println(\"ๅๅๆจกๅผๅฎๆๅฏน่ฑก็ๅๅปบ\"); // TODO Auto-generated method stub Sheep sheep = new Sheep(\"tom\", 1, \"็ฝ่ฒ\"); sheep.friend = new Sheep(\"jack\", 2, \"้ป่ฒ\"); Sheep sheep2 = (Sheep)sheep.clone(); //ๅ
้ Sheep sheep3 = (Sheep)sheep.clone(); //ๅ
้ Sheep sheep4 = (Sheep)sheep.clone(); //ๅ
้ Sheep sheep5 = (Sheep)sheep.clone(); //ๅ
้ System.out.println(\"sheep2 =\" + sheep2 + \"sheep2.friend=\" + sheep2.friend.hashCode()); System.out.println(\"sheep3 =\" + sheep3 + \"sheep3.friend=\" + sheep3.friend.hashCode()); System.out.println(\"sheep4 =\" + sheep4 + \"sheep4.friend=\" + sheep4.friend.hashCode()); System.out.println(\"sheep5 =\" + sheep5 + \"sheep5.friend=\" + sheep5.friend.hashCode()); } } ๅๅๆจกๅผๅจSpringๆกๆถไธญๆบ็ ๅๆ Springไธญๅๅbean็ๅๅปบ๏ผๅฐฑๆฏๅๅๆจกๅผ็ๅบ็จ ไปฃ็ ๅๆ /** * ๆณจ้ * @author Administrator * */ public class Monster { private Integer id = 10 ; private String nickname = \"็้ญ็\"; private String skill = \"่ญ่ๆ\"; public Monster() { System.out.println(\"monster ๅๅปบ..\"); } public Monster(Integer id, String nickname, String skill) { //System.out.println(\"Integer id, String nickname, String skill่ขซ่ฐ็จ\");","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:5","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅปบ้ ่
ๆจกๅผ ไผ ็ปๆนๆณ ็ๆฟ้ฎ้ข ้กน็ฎ้ๆฑ๏ผ ้่ฆๅปบ้ ๆฟๅญ๏ผ่ฟไธ่ฟ็จไธบๆๆกฉใ็ ๅขใๅฐ้กถ ๆฟๅญๆๅ็งๅๆ ท็๏ผๆฏๅฆๆฎ้ๆฟ๏ผ้ซๆฅผ๏ผๅซๅข
๏ผๅ็งๆฟๅญ็่ฟ็จ่ฝ็ถไธๆ ท๏ผไฝๆฏ่ฆๆฑไธ่ฆ็ธๅ็ใ ไผ ็ปๆนๅผ่งฃๅณ ไผ ็ปๆนๅผๅๆ็ฑปๅพ public abstract class AbstractHouse { //ๆๅฐๅบ public abstract void buildBasic(); //็ ๅข public abstract void buildWalls(); //ๅฐ้กถ public abstract void roofed(); public void build() { buildBasic(); buildWalls(); roofed(); } } public class CommonHouse extends AbstractHouse { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญๆๅฐๅบ \"); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญ็ ๅข \"); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญๅฐ้กถ \"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub CommonHouse commonHouse = new CommonHouse(); commonHouse.build(); } } ไผ ็ปๆนๅผ็้ฎ้ขๅๆ ไผ็นๆฏๆฏ่พๅฅฝ็่งฃ๏ผ็ฎๅๆๆไฝใ ่ฎพ่ฎก็็จๅบ็ปๆ๏ผ่ฟไบ็ฎๅ๏ผๆฒกๆ่ฎพ่ฎก็ผๅญๅฑๅฏน่ฑก๏ผ็จๅบ็ๆฉๅฑๅ็ปดๆคไธๅฅฝ๏ผไนๅฐฑๆฏ่ฏด๏ผ่ฟ็ง่ฎพ่ฎกๆนๆก๏ผๆไบงๅ๏ผๅณ๏ผๆฟๅญ๏ผๅๅๅปบไบงๅ็่ฟ็จ๏ผๅณ๏ผๅปบๆฟๅญๆต็จ๏ผๅฐ่ฃ
ๅจไธ่ตท๏ผ่ฆๅๆงๅขๅผบไบใ ่งฃๅณๆนๆก๏ผๅฐไบงๅๅไบงๅๅปบ้ ่ฟ็จ่ฆๅ-\u003eๅปบ้ ่
ๆจกๅผ ๅปบ้ ่
ๆจกๅผๅบๆฌไป็ป ๅปบ้ ่
ๆจกๅผ๏ผBuilder Pattern๏ผๅๅซ็ๆๅจๆจกๅผ๏ผๆฏไธ็งๅฏน่ฑกๆ้ ๆจกๅผใๅฎๅฏไปฅๅฐๅคๆๅฏน่ฑก็ๅปบ้ ่ฟ็จๆฝ่ฑกๅบๆฅ๏ผๆฝ่ฑก็ฑปๅซ๏ผ๏ผไฝฟ่ฟไธชๆฝ่ฑก่ฟ็จ็ไธๅๅฎ็ฐๆนๆณๅฏไปฅๆ้ ๅบไธๅ่กจ็ฐ๏ผๅฑๆง๏ผ็ๅฏน่ฑกใ **ๅปบ้ ่
ๆจกๅผ **ๆฏไธๆญฅไธๆญฅๅๅปบไธไธชๅคๆ็ๅฏน่ฑก๏ผๅฎๅ
่ฎธ็จๆทๅช้่ฟๆๅฎๅคๆๅฏน่ฑก็็ฑปๅๅๅ
ๅฎนๅฐฑๅฏไปฅๆ้ ไปไปฌ๏ผ็จๆทไธ้่ฆ็ฅ้ๅ
้จ็ๅ
ทไฝๆๅปบ็ป่ใ ๅปบ้ ่
ๆจกๅผ็ๅไธช่ง่ฒ Product๏ผไบงๅ่ง่ฒ๏ผ๏ผไธไธชๅ
ทไฝ็ไบงๅๅฏน่ฑก Builder๏ผๆฝ่ฑกๅปบ้ ่
๏ผ๏ผๅๅปบไธไธชProductๅฏน่ฑก็ๅไธช้จไปถๆๅฎ็ๆฅๅฃ/ๆฝ่ฑก็ฑปใ ConcreteBuilder๏ผๅ
ทไฝๅปบ้ ่
๏ผ๏ผๅฎ็ฐๆฅๅฃ๏ผๆ้ ๅ่ฃ
้
ๅไธช้จไปถใ Director๏ผๆๆฅ่
๏ผ๏ผๆๅปบไธไธชไฝฟ็จBuilderๆฅๅฃ็ๅฏน่ฑกใๅฎไธป่ฆๆฏ็จไบๅๅปบไธไธชๅคๆ็ๅฏน่ฑกใๅฎไธป่ฆๆไธคไธชไฝ็จ๏ผไธ๏ผ้็ฆปไบๅฎขๆทไธๅฏน่ฑก็็ไบง่ฟ็จ๏ผไบ๏ผ่ด่ดฃๆงๅถไบงๅๅฏน่ฑก็็ไบง่ฟ็จใ ๅปบ้ ่
ๆจกๅผๅ็็ฑปๅพ ๅปบ้ ่
ๆจกๅผ็ฑปๅพ ๅปบ้ ่
ๆจกๅผ่งฃๅณ็ๆฟ้ฎ้ข ็ๆฟ้ฎ้ข็ฑปๅพ // ๆฝ่ฑก็ๅปบ้ ่
public abstract class HouseBuilder { protected House house = new House(); //ๅฐๅปบ้ ็ๆต็จๅๅฅฝ, ๆฝ่ฑก็ๆนๆณ public abstract void buildBasic(); public abstract void buildWalls(); public abstract void roofed(); //ๅปบ้ ๆฟๅญๅฅฝ๏ผ ๅฐไบงๅ(ๆฟๅญ) ่ฟๅ public House buildHouse() { return house; } } //ๆๆฅ่
๏ผ่ฟ้ๅปๆๅฎๅถไฝๆต็จ๏ผ่ฟๅไบงๅ public class HouseDirector { HouseBuilder houseBuilder = null; //ๆ้ ๅจไผ ๅ
ฅ houseBuilder public HouseDirector(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //้่ฟsetter ไผ ๅ
ฅ houseBuilder public void setHouseBuilder(HouseBuilder houseBuilder) { this.houseBuilder = houseBuilder; } //ๅฆไฝๅค็ๅปบ้ ๆฟๅญ็ๆต็จ๏ผไบค็ปๆๆฅ่
public House constructHouse() { houseBuilder.buildBasic(); houseBuilder.buildWalls(); houseBuilder.roofed(); return houseBuilder.buildHouse(); } } //ไบงๅ-\u003eProduct public class House { private String baise; private String wall; private String roofed; public String getBaise() { return baise; } public void setBaise(String baise) { this.baise = baise; } public String getWall() { return wall; } public void setWall(String wall) { this.wall = wall; } public String getRoofed() { return roofed; } public void setRoofed(String roofed) { this.roofed = roofed; } } public class HighBuilding extends HouseBuilder { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(\" ้ซๆฅผ็ๆๅฐๅบ100็ฑณ \"); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(\" ้ซๆฅผ็็ ๅข20cm \"); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(\" ้ซๆฅผ็้ๆๅฑ้กถ \"); } } public class CommonHouse extends HouseBuilder { @Override public void buildBasic() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญๆๅฐๅบ5็ฑณ \"); } @Override public void buildWalls() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญ็ ๅข10cm \"); } @Override public void roofed() { // TODO Auto-generated method stub System.out.println(\" ๆฎ้ๆฟๅญๅฑ้กถ \"); } } public class Client { public static void main(String[] args) { //็ๆฎ้ๆฟๅญ CommonHouse commonHouse = new CommonHouse(); //ๅๅคๅๅปบๆฟๅญ็ๆๆฅ่
HouseDirector houseDirector = new HouseDirector(commonHouse); //ๅฎๆ็ๆฟๅญ๏ผ่ฟๅไบงๅ(ๆฎ้ๆฟๅญ) House house = houseDirector.constructHouse(); //System.out.println(\"่พๅบๆต็จ\"); System.out.println(\"--------------------------\"); //็้ซๆฅผ HighBuilding highBuilding = new HighBuilding(); //้็ฝฎๅปบ้ ่
houseDirector.setHouseBuilder(highBuilding); //ๅฎๆ็ๆฟๅญ๏ผ่ฟๅไบงๅ(้ซๆฅผ) houseDirector.constructHouse(); } } ๅปบ้ ่
ๆจกๅผๅจJDK็ๅบ็จๅๆบ็ ๅๆ java.lang.StringBuilderไธญ็ๅปบ้ ่
ๆจกๅผ abstract class AbstractStringBuilder implements Appendable, CharSequence { /** * The value is used for character storage. */ char[] value; ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:6","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"้้
ๅจๆจกๅผ ไป็ป ้้
ๅจๆจกๅผ๏ผAdapter Pattern๏ผๅฐๆไธช็ฑป็ๆฅๅฃ่ฝฌๆขๆๅฎขๆท็ซฏๆๆ็ๅฆไธไธชๆฅๅฃ่กจ็คบ๏ผไธป่ฆ็ฎ็ๆฏๅ
ผๅฎนๆง๏ผ่ฎฉๅๆฌๅ ๆฅๅฃไธๅน้
ไธ่ฝไธ่ตทๅทฅไฝ็ไธคไธช็ฑปๅฏไปฅๅๅๅทฅไฝใๅ
ถๅซๅไธบๅ
่ฃ
ๅจ๏ผWrapper๏ผ ้้
ๅจๆจกๅผๅฑไบ็ปๆๅๆจกๅผ ไธป่ฆๅไธบไธ็ฑป๏ผ็ฑป้้
ๅจๆจกๅผใๅฏน่ฑก้้
ๅจๆจกๅผใๆฅๅฃ้้
ๅจๆจกๅผ ้้
ๅจๆจกๅผๅทฅไฝๅ็ ้้
ๅจๆจกๅผ๏ผๅฐไธไธช็ฑป็ๆฅๅฃ่ฝฌๆขๆๅฆไธ็งๆฅๅฃ๏ผ่ฎฉๅๆฌๆฅๅฃไธๅ
ผๅฎน็็ฑปๅฏไปฅๅ
ผๅฎน ไป็จๆท็่งๅบฆ็ไธๅฐ้้
่
๏ผๆฏ่งฃ่ฆ็ ็จๆท่ฐ็จ้้
ๅจ่ฝฌๅๅบๆฅ็็ฎๆ ๆฅๅฃๆนๆณ๏ผ้้
ๅจๅ่ฐ็จ่ขซ้้
่
็็ธๅ
ณๆฅๅฃๆนๆณ ็จๆท็จๆถๅฐๅ้ฆ็ปๆ๏ผๆ่งๅชๆฏๅ็ฎๆ ไบคไบ ็ฑป้้
ๅจๆจกๅผ ไป็ป Adapter็ฑป๏ผ้่ฟ็ปงๆฟsrc็ฑป๏ผๅฎ็ฐdst็ฑปๆฅๅฃ๏ผๅฎๆ src -\u003e dst ็้้
ๅบ็จๅฎไพ ็ๆดปไธญๅ
็ตๅจ็ไพๅญๆฅๅๅบ้้
ๅจๆจกๅผ๏ผๅ
็ตๅจๆฌ่บซ็ธๅฝไบAdapter๏ผ220Vไบคๆต็ต็ธๅฝไบsrc๏ผๅณ่ขซ้้
่
๏ผ๏ผๆไปฌ็dst๏ผๅณ็ฎๆ )ๆฏ5V็ดๆต็ต ็ฑป้้
ๅจๅฎไพ //้้
ๆฅๅฃ public interface IVoltage5V { public int output5V(); } //่ขซ้้
็็ฑป public class Voltage220V { //่พๅบ220V็็ตๅ public int output220V() { int src = 220; System.out.println(\"็ตๅ=\" + src + \"ไผ\"); return src; } } //้้
ๅจ็ฑป public class VoltageAdapter extends Voltage220V implements IVoltage5V { @Override public int output5V() { // TODO Auto-generated method stub //่ทๅๅฐ220V็ตๅ int srcV = output220V(); int dstV = srcV / 44 ; //่ฝฌๆ 5v return dstV; } } public class Phone { //ๅ
็ต public void charging(IVoltage5V iVoltage5V) { if(iVoltage5V.output5V() == 5) { System.out.println(\"็ตๅไธบ5V, ๅฏไปฅๅ
็ต~~\"); } else if (iVoltage5V.output5V() \u003e 5) { System.out.println(\"็ตๅๅคงไบ5V, ไธ่ฝๅ
็ต~~\"); } } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(\" === ็ฑป้้
ๅจๆจกๅผ ====\"); Phone phone = new Phone(); phone.charging(new VoltageAdapter()); } } ็ฑป้้
ๅจๆจกๅผๆณจๆไบ้กนๅ็ป่ Javaๆฏๅ็ปงๆฟๆบๅถ๏ผๆไปฅ็ฑป้้
ๅจ้่ฆ็ปงๆฟsrc็ฑป่ฟไธ็น็ฎๆฏไธไธช็ผบ็น๏ผๅ ไธบ่ฟ่ฆๆฑdstๅฟ
้กปๆฏๆฅๅฃ๏ผๆไธๅฎๅฑ้ๆง src็ฑป็ๆนๆณๅจAdapterไธญ้ฝไผๆด้ฒๅบๆฅ๏ผไนๅขๅ ไบไฝฟ็จ็ๆๆฌ ็ฑไบๅ
ถ็ปงๆฟไบsrc็ฑป๏ผๆไปฅๅฎๅฏไปฅๆ นๆฎ้ๆฑ้ๅsrc็ฑป็ๆนๆณ๏ผไฝฟๅพAdapter็็ตๆดปๆงๅขๅผบไบใ ๅฏน่ฑก้้
ๅจๆจกๅผ ไป็ป ๅบๆฌๆ่ทฏๅ็ฑป็้้
ๅจๆจกๅผ็ธๅ๏ผๅชๆฏๅฐAdapter็ฑปไฝไฟฎๆน๏ผไธๆฏ็ปงๆฟsrc็ฑป๏ผ่ๆฏๆๆsrc็ฑป็ๅฎไพ๏ผไปฅ่งฃๅณๅ
ผๅฎนๆง็้ฎ้ขใๅณ๏ผๆๆsrc็ฑป๏ผๅฎ็ฐdst็ฑปๆฅๅฃ๏ผๅฎๆ src -\u003e dst ็้้
ๆ นๆฎโๅๆๅค็จๅๅโ๏ผๅจ็ณป็ปไธญๅฐฝ้ไฝฟ็จๅ
ณ่ๅ
ณ็ณปๆฅไปฃๆฟ็ปงๆฟๅ
ณ็ณป ๅฏน่ฑก้้
ๅจๆจกๅผๆฏ้้
ๅจๆจกๅผๅธธ็จ็ไธ็ง ๅบ็จๅฎไพ ็ๆดปไธญๅ
็ตๅจ็ไพๅญๆฅ่ฎฒ่งฃ้้
ๅจ๏ผๅ
็ตๅจๆฌ่บซ็ธๅฝไบAdapter๏ผ220Vไบคๆต็ต็ธๅฝไบsrc๏ผๅณ่ขซ้้
่
๏ผ๏ผๆไปฌ็dst๏ผๅณ็ฎๆ ๏ผๆฏ5V็ดๆต็ต๏ผไฝฟ็จๅฏน่ฑก้้
ๅจๆจกๅผๅฎๆ  //้้
ๆฅๅฃ public interface IVoltage5V { public int output5V(); } //่ขซ้้
็็ฑป public class Voltage220V { //่พๅบ220V็็ตๅ๏ผไธๅ public int output220V() { int src = 220; System.out.println(\"็ตๅ=\" + src + \"ไผ\"); return src; } } //้้
ๅจ็ฑป public class VoltageAdapter implements IVoltage5V { private Voltage220V voltage220V; // ๅ
ณ่ๅ
ณ็ณป-่ๅ //้่ฟๆ้ ๅจ๏ผไผ ๅ
ฅไธไธช Voltage220V ๅฎไพ public VoltageAdapter(Voltage220V voltage220v) { this.voltage220V = voltage220v; } @Override public int output5V() { int dst = 0; if(null != voltage220V) { int src = voltage220V.output220V();//่ทๅ220V ็ตๅ System.out.println(\"ไฝฟ็จๅฏน่ฑก้้
ๅจ๏ผ่ฟ่ก้้
~~\"); dst = src / 44; System.out.println(\"้้
ๅฎๆ๏ผ่พๅบ็็ตๅไธบ=\" + dst); } return dst; } } public class Phone { //ๅ
็ต public void charging(IVoltage5V iVoltage5V) { if(iVoltage5V.output5V() == 5) { System.out.println(\"็ตๅไธบ5V, ๅฏไปฅๅ
็ต~~\"); } else if (iVoltage5V.output5V() \u003e 5) { System.out.println(\"็ตๅๅคงไบ5V, ไธ่ฝๅ
็ต~~\"); } } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(\" === ๅฏน่ฑก้้
ๅจๆจกๅผ ====\"); Phone phone = new Phone(); phone.charging(new VoltageAdapter(new Voltage220V())); } } ๅฏน่ฑก้้
ๅจๆจกๅผๆณจๆไบ้กนๅ็ป่ ๅฏน่ฑก้้
ๅจ ๅฏน่ฑก้้
ๅจๅ็ฑป้้
ๅจๅ
ถๅฎ็ฎๆฏๅไธ็งๆๆณ๏ผๅชไธ่ฟๅฎ็ฐๆนๅผไธๅใๆ นๆฎๅๆๅค็จๅๅ๏ผไฝฟ็จ็ปๅๆฟไปฃ็ปงๆฟ๏ผๆไปฅๅฎ่งฃๅณไบ็ฑป้้
ๅจๅฟ
้กป็ปงๆฟsrc็ๅฑ้ๆง้ฎ้ข๏ผไนไธๅ่ฆๆฑdstๅฟ
้กปๆฏๆฅๅฃ ไฝฟ็จๆๆฌๆดไฝ๏ผๆด็ตๆดป ๆฅๅฃ้้
ๅจๆจกๅผ ไป็ป ไธไบไนฆ็ฑ็งฐไธบ๏ผ้้
ๅจๆจกๅผ๏ผDefault Adapter Pattern๏ผๆ็ผบ็้้
ๅจๆจกๅผ ๅฝไธ้่ฆๅ
จ้จๅฎ็ฐๆฅๅฃๆไพ็ๆนๆณๆถ๏ผๅฏไปฅๅ
่ฎพ่ฎกไธไธชๆฝ่ฑก็ฑปๅฎ็ฐๆฅๅฃ๏ผๅนถไธบ่ฏฅๆฅๅฃไธญๆฏไธชๆนๆณๆไพไธไธช้ป่ฎคๅฎ็ฐ๏ผ็ฉบๆนๆณ๏ผ๏ผ้ฃไน่ฏฅๆฝ่ฑก็ฑป็ๅญ็ฑปๅฏๆ้ๆฉๅฐ่ฆ็็ถ็ฑป็ๆไบๆนๆณๆฅๅฎ็ฐ้ๆฑ ้็จไบไธไธชๆฅๅฃไธๆณไฝฟ็จๅ
ถๆๆ็ๆนๆณ็ๆ
ๅต ๅบ็จๅฎไพ ๆฅๅฃ้้
ๅจๅฎไพ public interface InterfaceAdapter { public void m1(); public void m2(); public void m3(); public void m4(); } //ๅจAbsAdapter ๆไปฌๅฐ Interface4 ็ๆนๆณ่ฟ่ก้ป่ฎคๅฎ็ฐ public abstract class AbsAdapter implements InterfaceAdapter { //้ป่ฎคๅฎ็ฐ public void m1() { } public void m2() { } public void m3() { } public void m4() { } } public class Client { public static void main(String[] args) { AbsAdapter absAdapter = new AbsAdapter() { //ๅช้่ฆๅป่ฆ็ๆไปฌ ้่ฆไฝฟ็จ ๆฅๅฃๆนๆณ @Override public void m1() { // TODO Auto-generated method stub System.out.println(\"ไฝฟ็จไบm1็ๆนๆณ\"); } }; absAdapter.m1(); } } ๆๆถๅๆไปฌไธๆณๅฎ็ฐInterfaceAdapterๆฅๅฃไธญ็ๅ
จ้จๆนๆณ๏ผๆไปฌๅชๆณ็ๅฌm1ๆนๆณ๏ผๆไปฌๅช้ๆๅฆไธๆนๅผๅฎ็ฐๆฅๅฃ้้
ๅจใ AbsAdapter็ฑป๏ผๅฐฑๆฏไธไธชๆฅๅฃ้้
ๅจ๏ผๅฎ็ฉบๅฎ็ฐไบInterfaceAdapterๆฅๅฃไธญ็ๆๆๆนๆณใ ้้
ๅจๆจกๅผๅจSpringMVCๆกๆถๅบ็จ็ๆบ็ ๅๆ SpringMVCไธญ็HandleAdapter๏ผๅฐฑไฝฟ็จไบ้้
ๅจๆจกๅผ ไฝฟ็จHandleAdapter็ๅๅ ๅๆ๏ผ ๆ นๆฎๆบ็ ๅๆๅฏไปฅ็ๅฐๅค็ๅจ็็ฑปๅไธๅ๏ผๆๅค้ๅฎ็ฐๆนๅผ๏ผ้ฃไน","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:7","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๆกฅๆฅๆจกๅผ ไผ ็ปๆนๆณ ๆๆบๆไฝ้ฎ้ข ็ฐๅจๅฏนไบไธๅๆๆบ็ฑปๅ็ไธๅๅ็ๅฎ็ฐๆไฝ็ผ็จ๏ผๆฏๅฆ๏ผๅผๆบใๅ
ณๆบใไธ็ฝใๆ็ต่ฏ็ญ๏ผ๏ผๅฆไธๅพๆ็คบ๏ผ Phone ไผ ็ปๆนๆก่งฃๅณๆๆบไฝฟ็จ้ฎ้ข ไผ ็ปๆนๆณๅฏนๅบ็็ฑปๅพ ๆๆบไฝฟ็จ้ฎ้ข็ฑปๅพ ไผ ็ปๆนๆก่งฃๅณๆๆบๆไฝ็ฑปๅ ๆฉๅฑๆง้ฎ้ข๏ผ็ฑป็็ธ๏ผ๏ผๅฆๆๆไปฌๅๅขๅ ๆๆบ็ๆ ทๅผ๏ผๆ่ฝฌๅผ๏ผ,ๅฐฑ้่ฆๅขๅ ๅไธชๅ็ๆๆบ็็ฑป๏ผๅๆ ทๅฆๆๆไปฌๅขๅ ไธไธชๆๆบๅ็๏ผไน่ฆๅจๅไธชๆๆบๆ ทๅผ็ฑปไธๅขๅ ่ฟๅไบๅไธ่่ดฃๅๅ๏ผๅฝๆไปฌๅขๅ ๆๆบๆ ทๅผๆถ๏ผ่ฆๅๆถๅขๅ ๆๆๅ็็ๆๆบ๏ผ่ฟๆ ทๅขๅ ไบไปฃ็ ็ปดๆคๆๆฌ ่งฃๅณๆนๆก-ไฝฟ็จๆกฅๆฅๆจกๅผ ๆกฅๆฅๆจกๅผ ๅบๆฌไป็ป **ๆกฅๆฅๆจกๅผ๏ผBridgeๆจกๅผ๏ผ**ๆฏๆ๏ผๅฐๅฎ็ฐไธๆฝ่ฑกๆพๅจไธคไธชไธๅ็็ฑปๅฑๆฌกไธญ๏ผไฝฟไธคไธชๅฑๆฌกๅฏไปฅ็ฌ็ซๆนๅ ๆฏไธ็ง็ปๆๅ่ฎพ่ฎกๆจกๅผ Bridgeๆจกๅผๅบไบ็ฑป็ๆๅฐ่ฎพ่ฎกๅๅ๏ผ้่ฟไฝฟ็จๅฐ่ฃ
ใ่ๅๅ็ปงๆฟ็ญ่กไธบ่ฎฉไธๅ็็ฑปๆฟๆ
ไธๅ็่่ดฃใๅฎ็ไธป่ฆ็น็นๆฏๆๆฝ่ฑก๏ผAbstraction๏ผไธ่กไธบๅฎ็ฐ๏ผImplementation๏ผๅ็ฆปๅผๆฅ๏ผไป่ๅฏไปฅไฟๆๅ้จๅ็็ฌ็ซๆงไปฅๅๅบๅฏนไปไปฌ็ๅ่ฝๆฉๅฑ ๆกฅๆฅๆจกๅผๅ็็ฑปๅพ ๆกฅๆฅๆจกๅผ็ฑปๅพ ็ฑปๅพ่ฏดๆ Client็ฑป๏ผๆกฅๆฅๆจกๅผๆจกๅผ็่ฐ็จ่
ๆฝ่ฑก็ฑป๏ผAbstraction๏ผ๏ผ็ปดๆคไบImplementor/ๅณๅฎ็ๅฎ็ฐ็ฑปConcrete ImplementorA..๏ผไบ่
ๆฏ่ๅๅ
ณ็ณป๏ผAbstractionๅ
ๅฝๆกฅๆฅ็ฑป RefinedAbstraction๏ผๆฏAbstractionๆฝ่ฑก็ฑป็ๅญ็ฑป Implementor๏ผ่กไธบๅฎ็ฐ็ฑป็ๆฅๅฃ Concrete ImplementorA/B๏ผ่กไธบ็ๅ
ทไฝๅฎ็ฐ็ฑป ไปUMLๅพ๏ผ่ฟ้็ๆฝ่ฑก็ฑปๅๆฅๅฃๆฏ่ๅ็ๅ
ณ็ณป๏ผๅ
ถๅฎ่ฐ็จๅ่ขซ่ฐ็จๅ
ณ็ณป ๆกฅๆฅๆจกๅผ่งฃๅณๆๆบๆไฝ้ฎ้ข ไฝฟ็จๆกฅๆฅๆจกๅผๆน่ฟไผ ็ปๆนๅผ๏ผ่ฎฉ็จๅบๅ
ทๆๆๅฅฝ็ๆฉๅฑๆง๏ผๅฉ็จ็จๅบ็ปดๆค ๆกฅๆฅๆจกๅผ่งฃๅณๆๆบๆไฝ้ฎ้ข็ฑปๅพ //ๆฅๅฃ public interface Brand { void open(); void close(); void call(); } public abstract class Phone { //็ปๅๅ็ private Brand brand; //ๆ้ ๅจ public Phone(Brand brand) { super(); this.brand = brand; } protected void open() { this.brand.open(); } protected void close() { brand.close(); } protected void call() { brand.call(); } } //ๆๅ ๅผๆๆบ็ฑป๏ผ็ปงๆฟ ๆฝ่ฑก็ฑป Phone public class FoldedPhone extends Phone { //ๆ้ ๅจ public FoldedPhone(Brand brand) { super(brand); } public void open() { super.open(); System.out.println(\" ๆๅ ๆ ทๅผๆๆบ \"); } public void close() { super.close(); System.out.println(\" ๆๅ ๆ ทๅผๆๆบ \"); } public void call() { super.call(); System.out.println(\" ๆๅ ๆ ทๅผๆๆบ \"); } } public class UpRightPhone extends Phone { //ๆ้ ๅจ public UpRightPhone(Brand brand) { super(brand); } public void open() { super.open(); System.out.println(\" ็ด็ซๆ ทๅผๆๆบ \"); } public void close() { super.close(); System.out.println(\" ็ด็ซๆ ทๅผๆๆบ \"); } public void call() { super.call(); System.out.println(\" ็ด็ซๆ ทๅผๆๆบ \"); } } public class Vivo implements Brand { @Override public void open() { // TODO Auto-generated method stub System.out.println(\" Vivoๆๆบๅผๆบ \"); } @Override public void close() { // TODO Auto-generated method stub System.out.println(\" Vivoๆๆบๅ
ณๆบ \"); } @Override public void call() { // TODO Auto-generated method stub System.out.println(\" Vivoๆๆบๆ็ต่ฏ \"); } } public class XiaoMi implements Brand { @Override public void open() { // TODO Auto-generated method stub System.out.println(\" ๅฐ็ฑณๆๆบๅผๆบ \"); } @Override public void close() { // TODO Auto-generated method stub System.out.println(\" ๅฐ็ฑณๆๆบๅ
ณๆบ \"); } @Override public void call() { // TODO Auto-generated method stub System.out.println(\" ๅฐ็ฑณๆๆบๆ็ต่ฏ \"); } } public class Client { public static void main(String[] args) { //่ทๅๆๅ ๅผๆๆบ (ๆ ทๅผ + ๅ็ ) Phone phone1 = new FoldedPhone(new XiaoMi()); phone1.open(); phone1.call(); phone1.close(); System.out.println(\"=======================\"); Phone phone2 = new FoldedPhone(new Vivo()); phone2.open(); phone2.call(); phone2.close(); System.out.println(\"==============\"); UpRightPhone phone3 = new UpRightPhone(new XiaoMi()); phone3.open(); phone3.call(); phone3.close(); System.out.println(\"==============\"); UpRightPhone phone4 = new UpRightPhone(new Vivo()); phone4.open(); phone4.call(); phone4.close(); } } ๆกฅๆฅๆจกๅผๅจJDBC็ๆบ็ ๅๆ JDBC็Driverๆฅๅฃ๏ผๅฆๆไปๆกฅๆฅๆจกๅผๆฅ็๏ผDriverๅฐฑๆฏไธไธชๆฅๅฃ๏ผไธ้ขๅฏไปฅๆMySQL็Driver๏ผOracle็Driver๏ผ่ฟไบๅฐฑๅฏไปฅๅฝไฝๅฎ็ฐๆฅๅฃ็ฑป JDBCๆบ็ ๅๆ็ฑปๅพ import java.sql.SQLException; /** * The Java SQL framework allows for multiple database drivers. Each driver should supply a class that implements the Driver interface * * \u003cp\u003e * The DriverManager will try to load as many drivers as it can find and then for any given connection request, it will ask each driver in turn to try to * connect to the target URL. * * \u003cp\u003e * It is strongly recommended that each Driver class should be small and standalone so that the Driver class can be loaded and queried without bringing in vast * quantities of supporting code. * * \u003cp\u003e * When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager. This means that a user can load and register a * driver by doing Class.forName(\"foo.bah.Driver\") */ public class Driver extends NonRegisteringDriver implements java.sql.Driver { // // Register ourselves with the DriverM","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:8","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฃ
้ฅฐ่
ๆจกๅผ ไผ ็ปๆนๆณ ๅๅก่ฎขๅ้กน็ฎ๏ผๅๅก้ฆ๏ผ ๅๅก็ง็ฑป/ๅๅๅๅก๏ผEspresso๏ผๆๅคงๅฉๆต็ผฉๅๅก๏ผใShortBlackใLongBlack๏ผ็พๅผๅๅก๏ผใDecaf๏ผๆ ๅ ๅๅก๏ผ ่ฐๆ๏ผMilkใSoy๏ผ่ฑๆต๏ผใChocolate ่ฆๆฑๅจๆฉๅฑๆฐ็ๅๅก็ง็ฑปๆถ๏ผๅ
ทๆ่ฏๅฅฝ็ๆฉๅฑๆงใๆนๅจๆนไพฟใ็ปดๆคๆนไพฟ ไฝฟ็จOO็ๆฅ่ฎก็ฎไธๅ็ง็ฑปๅๅก็่ดน็จ๏ผๅฎขๆทๅฏไปฅ็นๅๅๅๅกใไนๅฏไปฅ็นๅๅๅๅก+่ฐๆ็ปๅ ่งฃๅณๆนๆกไธ ๅๅก่ฎขๅ่งฃๅณๆนๆกไธ ๆนๆกไธ้ฎ้ขๅๆ Drinkๆฏไธไธชๆฝ่ฑก็ฑป๏ผ่กจ็คบ้ฅฎๆ desๅฐฑๆฏๅฏนๅๅก็ๆ่ฟฐ๏ผๆฏๅฆๅๅก็ๅๅญ cost()ๆนๆณๅฐฑๆฏ่ฎก็ฎ่ดน็จ๏ผDrink็ฑปไธญๅไธไธชๆฝ่ฑกๆนๆณ Decafๅฐฑๆฏๅๅๅๅก๏ผ็ปงๆฟDrink๏ผๅนถๅฎ็ฐcostๆนๆณ Espress \u0026\u0026 Milk ๅฐฑๆฏๅๅๅๅก+่ฐๆ๏ผ่ฟไธช็ปๅๅพๅค ้ฎ้ข๏ผ่ฟๆ ท่ฎพ่ฎกไผๆๅพๅค็ฑป๏ผๅฝๆไปฌๅขๅ ไธไธชๅๅๅๅกๆ่
ไธไธชๆฐ็่ฐๆ๏ผ็ฑป็ๆฐ้ๅฐฑไผๅๅข๏ผๅฐฑไผๅบ็ฐ็ฑป็็ธ ่งฃๅณๆนๆกไบ ๅ้ขๅๆๅฐๆนๆกไธๅ ไธบๅๅกๅๅ+่ฐๆ็ปๅไผ้ ๆ็ฑป็ๅๅข๏ผๅ ๆญคๅฏไปฅๅๆน่ฟ๏ผๅฐ่ฐๆๅ
็ฝฎๅฐDrink็ฑป๏ผ่ฟๆ ทๅฐฑไธไผ้ ๆ็ฑปๆฐ้่ฟๅคใไป่ๆ้ซ้กน็ฎ็็ปดๆคๆง๏ผๅฆไธๅพ๏ผ ๅๅก้ฆ่งฃๅณๆนๆกไบ **่ฏดๆ๏ผ**milk๏ผsoy๏ผchocolate ๅฏไปฅ่ฎพ่ฎกไธบBoolean๏ผ่กจ็คบๆฏๅฆ่ฆๆทปๅ ็ธๅบ็่ฐๆ ๆนๆกไบๅๆ ๆนๆกไบๅฏไปฅๆงๅถ็ฑป็ๆฐ้๏ผไธ่ณไบ้ ๆๅพๅค็็ฑป ๅจๅขๅ ๆ่
ๅ ้ค่ฐๆ็ง็ฑปๆถ๏ผไปฃ็ ็็ปดๆค้ๅพๅคง ่่ๅฐ็จๆทๅฏไปฅๆทปๅ ๅคไปฝ่ฐๆๆถ๏ผๅฏไปฅๅฐhasMIlk่ฟๅไธไธชๅฏนๅบ็int ่่ไฝฟ็จ่ฃ
้ฅฐ่
ๆจกๅผ ่ฃ
้ฅฐ่
ๆจกๅผ ๅบๆฌไป็ป ่ฃ
้ฅฐ่
ๆจกๅผ๏ผๅจๆ็ๅฐๆฐๅ่ฝ้ๅ ๅฐๅฏน่ฑกไธใๅจๅฏน่ฑกๅ่ฝๆฉๅฑๆน้ข๏ผๅฎๆฏ็ปงๆฟๆดๆๅผนๆง๏ผ่ฃ
้ฅฐ่
ๆจกๅผไนไฝ็ฐไบๅผ้ญๅๅ๏ผOCP๏ผ ่ฟ้ๆๅฐ็ๅจๆ็ๅฐๆฐๅ่ฝ้ๅ ๅฐๅฏน่ฑกๅOCPๅๅ๏ผๅจๅ้ข็ๅบ็จๅฎไพไธไผไปฅไปฃ็ ็ๅฝขๅผไฝ็ฐ๏ผ่ฏท่ฏป่
ๆณจๆใ ่ฃ
้ฅฐ่
ๆจกๅผๅ็ ๅ็ๅพ ่ฃ
้ฅฐ่
ๆจกๅผๅฐฑๅๆๅ
ไธไธชๅฟซ้ ไธปไฝ๏ผๆฏๅฆ๏ผ้ถ็ทใ่กฃๆ๏ผComponent๏ผ //่ขซ่ฃ
้ฅฐ่
ๅ
่ฃ
๏ผๆฏๅฆ๏ผๆฅ็บธๅกซๅ
ใๅกๆๆณกๆฒซใ็บธๆฟใๆจๆฟ๏ผDecorator๏ผ Componentไธปไฝ๏ผๆฏๅฆ็ฑปไผผๅ้ข็Drink ConcreteComponent๏ผๅ
ทไฝ็ไธปไฝ๏ผๆฏๅฆๅ้ขๅไธชๅๅๅๅก Decorator๏ผ่ฃ
้ฅฐ่
๏ผๆฏๅฆๅ็ง่ฐๆ ๅฆๅพไธญComponentไธConcreteComponentไน้ด๏ผๅฆๆConcreteComponent็ฑปๅพๅค๏ผ่ฟๅฏไปฅ่ฎพ่ฎกไธไธช็ผๅฒๅฑ๏ผๅฐๅ
ฑๆ็้จๅๆๅๅบๆฅ๏ผๆฝ่ฑกๅฑไธไธช็ฑป ่ฃ
้ฅฐ่
ๆจกๅผ่งฃๅณๅๅก่ฎขๅ ่ฃ
้ฅฐ่
ๆจกๅผ่งฃๅณๅๅก่ฎขๅ ่ฏดๆ๏ผ Drink ็ฑปๅฐฑๆฏๅ้ข่ฏด็ๆฝ่ฑก็ฑป๏ผComponent ShortBlack ๅฐฑๆฏๅๅๅๅก Decoratorๆฏไธไธช่ฃ
้ฅฐ็ฑป๏ผๅซๆไธไธช่ขซ่ฃ
้ฅฐ็ๅฏน่ฑก๏ผDrink obj๏ผ Decorator็costๆนๆณ่ฟ่กไธไธช่ดน็จ็ๅ ๅ ่ฎก็ฎ๏ผ้ๅฝ็่ฎก็ฎไปทๆ ผ ่ฃ
้ฅฐ่
ๆจกๅผไธ็่ฎขๅ๏ผ2ไปฝๅทงๅ
ๅ+1ไปฝ็ๅฅถ็LongBlack ่ฃ
้ฅฐ่
ๆจกๅผไธ็่ฎขๅ ่ฏดๆ๏ผ Milkๅ
ๅซไบLongBlack ไธไปฝChocolateๅ
ๅซไบ๏ผMilk+LongBlack๏ผ ไธไปฝChocolateๅ
ๅซไบ๏ผChocolate+Milk+LongBlack๏ผ ่ฟๆ ทๆฏไธ็ฎกไปไนๅฝขๅผ็ๅๅๅๅก+่ฐๆ็ปๅ๏ผ้่ฟ้ๅฝๆนๅผๅฏไปฅๆนไพฟ็็ปๅๅ็ปดๆค ่ฃ
้ฅฐ่
ๆจกๅผๅๅก่ฎขๅๅบ็จๅฎไพ public abstract class Drink { public String des; // ๆ่ฟฐ private float price = 0.0f; public String getDes() { return des; } public void setDes(String des) { this.des = des; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } //่ฎก็ฎ่ดน็จ็ๆฝ่ฑกๆนๆณ //ๅญ็ฑปๆฅๅฎ็ฐ public abstract float cost(); } public class Coffee extends Drink { @Override public float cost() { // TODO Auto-generated method stub return super.getPrice(); } } public class DeCaf extends Coffee { public DeCaf() { setDes(\" ๆ ๅ ๅๅก \"); setPrice(1.0f); } } public class Decorator extends Drink { private Drink obj; public Decorator(Drink obj) { //็ปๅ // TODO Auto-generated constructor stub this.obj = obj; } @Override public float cost() { // TODO Auto-generated method stub // getPrice ่ชๅทฑไปทๆ ผ return super.getPrice() + obj.cost(); } @Override public String getDes() { // TODO Auto-generated method stub // obj.getDes() ่พๅบ่ขซ่ฃ
้ฅฐ่
็ไฟกๆฏ return des + \" \" + getPrice() + \" \u0026\u0026 \" + obj.getDes(); } } public class Espresso extends Coffee { public Espresso() { setDes(\" ๆๅคงๅฉๅๅก \"); setPrice(6.0f); } } //ๅ
ทไฝ็Decorator๏ผ ่ฟ้ๅฐฑๆฏ่ฐๅณๅ public class Chocolate extends Decorator { public Chocolate(Drink obj) { super(obj); setDes(\" ๅทงๅ
ๅ \"); setPrice(3.0f); // ่ฐๅณๅ ็ไปทๆ ผ } } public class LongBlack extends Coffee { public LongBlack() { setDes(\" longblack \"); setPrice(5.0f); } } public class ShortBlack extends Coffee{ public ShortBlack() { setDes(\" shortblack \"); setPrice(4.0f); } } public class Milk extends Decorator { public Milk(Drink obj) { super(obj); // TODO Auto-generated constructor stub setDes(\" ็ๅฅถ \"); setPrice(2.0f); } } public class Soy extends Decorator{ public Soy(Drink obj) { super(obj); // TODO Auto-generated constructor stub setDes(\" Soy \"); setPrice(1.5f); } } public class CoffeeBar { public static void main(String[] args) { // TODO Auto-generated method stub // ่ฃ
้ฅฐ่
ๆจกๅผไธ็่ฎขๅ๏ผ2ไปฝๅทงๅ
ๅ+ไธไปฝ็ๅฅถ็LongBlack // 1. ็นไธไปฝ LongBlack Drink order = new LongBlack(); System.out.println(\"่ดน็จ1=\" + order.cost()); System.out.println(\"ๆ่ฟฐ=\" + order.getDes()); // 2. order ๅ ๅ
ฅไธไปฝ็ๅฅถ order = new Milk(order); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ่ดน็จ =\" + order.cost()); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ๆ่ฟฐ = \" + order.getDes()); // 3. order ๅ ๅ
ฅไธไปฝๅทงๅ
ๅ order = new Chocolate(order); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ๅ ๅ
ฅไธไปฝๅทงๅ
ๅ ่ดน็จ =\" + order.cost()); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ๅ ๅ
ฅไธไปฝๅทงๅ
ๅ ๆ่ฟฐ = \" + order.getDes()); // 3. order ๅ ๅ
ฅไธไปฝๅทงๅ
ๅ order = new Chocolate(order); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ๅ ๅ
ฅ2ไปฝๅทงๅ
ๅ ่ดน็จ =\" + order.cost()); System.out.println(\"order ๅ ๅ
ฅไธไปฝ็ๅฅถ ๅ ๅ
ฅ2ไปฝๅทงๅ
ๅ ๆ่ฟฐ = \" + order.getDes()); System.out.println(\"===========================\"); Drink order2 = new DeCaf(); System.out.println(\"order2 ๆ ๅ ๅๅก ่ดน็จ =\" + orde","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:9","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"็ปๅๆจกๅผ ไผ ็ปๆนๆณ ๅญฆๆ ก้ข็ณปๅฑ็คบ้ๆฑ ็ผๅ็จๅบๅฑ็คบไธไธชๅญฆๆ ก้ข็ณป็ปๆ๏ผ้ๆฑๆฏ่ฟๆ ท็๏ผ่ฆๅจไธไธช้กต้ขไธญๅฑ็คบๅบๅญฆๆ ก็้ข็ณป็ปๆ๏ผไธไธชๅญฆๆ กๆๅคไธชๅญฆ้ข๏ผไธไธชๅญฆ้ขๆๅคไธช็ณปใๅฆไธๅพๆ็คบใ ๅญฆ้ขๅฑ็คบ้ๆฑ ไผ ็ปๆนๆก่งฃๅณๅญฆๆ ก้ข็ณปๅฑ็คบ๏ผ็ฑปๅพ๏ผ ไผ ็ป่งฃๅณๆนๆก็ฑปๅพ ไผ ็ปๆนๆก่งฃๅณๅญฆๆ ก้ข็ณปๅฑ็คบๅญๅจ็้ฎ้ขๅๆ ๅฐๅญฆ้ข็ไฝๆฏๅญฆๆ ก็ๅญ็ฑป๏ผ็ณปๆฏๅญฆ้ข็ๅญ็ฑป๏ผ่ฟๆ ทๅฎ้
ไธๆฏ็ซๅจ็ป็ปๅคงๅฐๆฅ่ฟ่กๅๅฑๆฌก็ ๅฎ้
ไธๆไปฌ็่ฆๆฑๆฏ๏ผๅจไธไธช้กต้ขไธญๅฑ็คบๅบๅญฆๆ ก็้ข็ณป็ปๆ๏ผไธไธชๅญฆๆ กๆๅคไธชๅญฆ้ข๏ผไธไธชๅญฆ้ขๆๅคไธช้ข็ณป๏ผๅ ๆญค่ฟ็งๆนๆก๏ผไธ่ฝๅพๅฅฝๅฎ็ฐ็็ฎก็ๆไฝ๏ผๆฏๅฆๅฏนๅญฆ้ขใ็ณป็ๆทปๅ ๏ผๅ ้ค๏ผ้ๅ็ญ ่งฃๅณๆนๆก๏ผๆๅญฆๆ กใ้ขใ็ณป้ฝ็ๅๆฏ็ป็ป็ปๆ๏ผไปไปฌไน้ดๆฒกๆ็ปงๆฟ็ๅ
ณ็ณป๏ผ่ๆฏไธไธชๆ ๅฝข็ปๆ๏ผๅฏไปฅๆดๅฅฝ็ๅฎ็ฐ็ฎก็ๆไฝ-\u003e(็ปๅๆจกๅผ) ็ปๅๆจกๅผ ๅบๆฌไป็ป ็ปๅๆจกๅผ๏ผComposite Pattern๏ผ๏ผๅๅซ้จๅๆดไฝๆจกๅผ๏ผๅฎๅๅปบไบๅฏน่ฑก็ป็ๆ ๅฝข็ปๆ๏ผๅฐๅฏน่ฑก็ปๅๆๆ ็ถ็ปๆไปฅ่กจ็คบโๆดไฝ-้จๅโ็ๅฑๆฌกๅ
ณ็ณป ็ปๅๆจกๅผไพๆฎๆ ๅฝข็ปๆๆฅ็ปๅๅฏน่ฑก๏ผ็จๆฅ่กจ็คบ้จๅไปฅๅๆดไฝๅฑๆฌก ่ฟ็ง็ฑปๅ็่ฎพ่ฎกๆจกๅผๅฑไบ็ปๆๅๆจกๅผ ็ปๅๆจกๅผไฝฟๅพ็จๆทๅฏนๅไธชๅฏน่ฑกๅ็ปๅๅฏน่ฑก็่ฎฟ้ฎๅ
ทๆไธ่ดๆง๏ผๅณ๏ผ็ปๅ่ฝ่ฎฉๅฎขๆทไปฅไธ่ด็ๆนๅผๅค็ไธชๅซๅฏน่ฑกไปฅๅ็ปๅๅฏน่ฑก ็ปๅๆจกๅผ็ๅ็็ฑปๅพ ็ปๅๆจกๅผๅ็็ฑปๅพ ็ปๅๆจกๅผ็่ง่ฒๅ่่ดฃ Component๏ผ่ฟๆฏ็ปๅไธญๅฏน่ฑกๅฃฐๆๆฅๅฃ๏ผๅจ้ๅฝๆ
ๅตไธ๏ผๅฎ็ฐๆๆ็ฑปๅ
ฑๆ็ๆฅๅฃ้ป่ฎค่กไธบ๏ผ็จไบ่ฎฟ้ฎๅ็ฎก็Componentๅญ้จไปถ๏ผComponentๅฏไปฅๆฏๆฝ่ฑก็ฑปๆ่
ๆฅๅฃ Leaf๏ผๅจ็ปๅไธญ่กจ็คบๅถๅญ่็น๏ผๅถๅญ่็นๆฒกๆๅญ่็น Composite๏ผ้ๅถๅญ่็น๏ผ็จไบๅญๅจๅญ้จไปถ๏ผๅจComponentๆฅๅฃไธญๅฎ็ฐๅญ้จไปถ็็ธๅ
ณๆไฝ๏ผๆฏๅฆๅขๅ ๏ผadd๏ผ๏ผๅ ้ค๏ผdelete๏ผ ็ปๅๆจกๅผ่งฃๅณๅญฆๆ ก้ข็ณปๅฑ็คบ็ๅบ็จๅฎไพ ้ๆฑ๏ผ็ผๅ็จๅบๅฑ็คบไธไธชๅญฆๆ ก้ข็ณป็ปๆ๏ผ่ฆๅจไธไธช้กต้ขไธญๅฑ็คบๅบๅญฆๆ ก็้ข็ณป็ปๆ๏ผไธไธชๅญฆๆ กๆๅคไธชๅญฆ้ข๏ผไธไธชๅญฆ้ขๆๅคไธช็ณป ็ปๅๆจกๅผ่งฃๅณๅญฆๆ ก้ข็ณปๅฑ็คบ public abstract class OrganizationComponent { private String name; // ๅๅญ private String des; // ่ฏดๆ protected void add(OrganizationComponent organizationComponent) { //้ป่ฎคๅฎ็ฐ throw new UnsupportedOperationException(); } protected void remove(OrganizationComponent organizationComponent) { //้ป่ฎคๅฎ็ฐ throw new UnsupportedOperationException(); } //ๆ้ ๅจ public OrganizationComponent(String name, String des) { super(); this.name = name; this.des = des; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } //ๆนๆณprint, ๅๆๆฝ่ฑก็, ๅญ็ฑป้ฝ้่ฆๅฎ็ฐ protected abstract void print(); } import java.util.ArrayList; import java.util.List; //University ๅฐฑๆฏ Composite , ๅฏไปฅ็ฎก็College public class University extends OrganizationComponent { List\u003cOrganizationComponent\u003e organizationComponents = new ArrayList\u003cOrganizationComponent\u003e(); // ๆ้ ๅจ public University(String name, String des) { super(name, des); // TODO Auto-generated constructor stub } // ้ๅadd @Override protected void add(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub organizationComponents.add(organizationComponent); } // ้ๅremove @Override protected void remove(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub organizationComponents.remove(organizationComponent); } @Override public String getName() { // TODO Auto-generated method stub return super.getName(); } @Override public String getDes() { // TODO Auto-generated method stub return super.getDes(); } // printๆนๆณ๏ผๅฐฑๆฏ่พๅบUniversity ๅ
ๅซ็ๅญฆ้ข @Override protected void print() { // TODO Auto-generated method stub System.out.println(\"--------------\" + getName() + \"--------------\"); //้ๅ organizationComponents for (OrganizationComponent organizationComponent : organizationComponents) { organizationComponent.print(); } } } public class Department extends OrganizationComponent { //ๆฒกๆ้ๅ public Department(String name, String des) { super(name, des); // TODO Auto-generated constructor stub } //add , remove ๅฐฑไธ็จๅไบ๏ผๅ ไธบไปๆฏๅถๅญ่็น @Override public String getName() { // TODO Auto-generated method stub return super.getName(); } @Override public String getDes() { // TODO Auto-generated method stub return super.getDes(); } @Override protected void print() { // TODO Auto-generated method stub System.out.println(getName()); } } import java.util.ArrayList; import java.util.List; public class College extends OrganizationComponent { //List ไธญ ๅญๆพ็Department List\u003cOrganizationComponent\u003e organizationComponents = new ArrayList\u003cOrganizationComponent\u003e(); // ๆ้ ๅจ public College(String name, String des) { super(name, des); // TODO Auto-generated constructor stub } // ้ๅadd @Override protected void add(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub // ๅฐๆฅๅฎ้
ไธๅกไธญ๏ผColleage ็ add ๅ University add ไธไธๅฎๅฎๅ
จไธๆ ท organizationComponents.add(organizationComponent); } // ้ๅremove @Override protected void remove(OrganizationComponent organizationComponent) { // TODO Auto-generated method stub organizationComponents.remove(organizationComponent); } @Override public String getName() { // TODO Auto-generated method","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:10","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅค่งๆจกๅผ ไผ ็ปๆนๆณ ๅฝฑ้ข็ฎก็้กน็ฎ ็ปๅปบไธไธชๅฎถๅบญๅฝฑ้ข๏ผ DVDๆญๆพๅจใๆๅฝฑไปชใ่ชๅจๅฑๅนใ็ฏ็ป็ซไฝๅฃฐใ็็ฑณ่ฑๆบ๏ผ่ฆๆฑๅฎๆไฝฟ็จๅฎถๅบญๅฝฑ้ข็ๅ่ฝ๏ผๅ
ถ่ฟ็จๅฆไธ๏ผ ็ดๆฅ็จ้ฅๆงๅจ๏ผ็ป็ญนๅ็ณป็ปๅผๅ
ณ ๅผ็็ฑณ่ฑๆบ ๆพไธๆๅฝฑๅนๅธ ๅผๆๅฝฑไปช ๅผ้ณๅ ๅผDVD๏ผ้DVD็ๆบ ๅปๆฟ็็ฑณ่ฑ ่ฐๆ็ฏๅ
ณ ๆญๆพ ่งๅฝฑ็ปๆ๏ผๅ
ณ้ญๅ็ง่ฎพๅค ไผ ็ปๆนๅผ่งฃๅณๅฝฑ้ข็ฎก็ ไผ ็ปๆนๅผ่งฃๅณๅฝฑ้ข็ฎก็ ไผ ็ปๆนๅผ่งฃๅณๅฝฑ้ข็ฎก็้ฎ้ขๅๆ ๅจClientTest็mainๆนๆณไธญ๏ผๅๅปบๅไธชๅญ็ณป็ป็ๅฏน่ฑก๏ผๅนถ็ดๆฅๅป่ฐ็จๅญ็ณป็ป๏ผๅฏน่ฑก๏ผ็ธๅ
ณๆนๆณ๏ผไผ้ ๆ่ฐ็จ่ฟ็จๆททไนฑ๏ผๆฒกๆๆธ
ๆฐ็่ฟ็จ ไธๅฉไบๅจClientTestไธญ๏ผๅป็ปดๆคๅฏนๅญ็ณป็ป็ๆไฝ ่งฃๅณๆ่ทฏ๏ผๅฎไนไธไธช้ซๅฑๆฅๅฃ๏ผ็ปๅญ็ณป็ปไธญ็ไธ็ปๆฅๅฃๆไพไธไธชไธ่ด็็้ข๏ผๆฏๅฆๅจ้ซๅฑๆฅๅฃๆไพๅไธชๆนๆณ๏ผready๏ผplay๏ผpause๏ผend๏ผ๏ผ็จๆฅ่ฎฟ้ฎๅญ็ณป็ปไธญ็ไธ็พคๆฅๅฃ ๅฐฑๆฏ้่ฟๅฎไนไธไธชไธ่ด็ๆฅๅฃ๏ผ็้ข็ฑป๏ผ๏ผ็จไปฅๅฑ่ฝๅ
้จๅญ็ณป็ป็็ป่๏ผไฝฟๅพ่ฐ็จ็ซฏๅช้่ท่ฟไธชๆฅๅฃๅ็่ฐ็จ๏ผ่ๆ ้กปๅ
ณๅฟ่ฟไธชๅญ็ณป็ป็ๅ
้จ็ป่-\u003eๅค่งๆจกๅผ ๅค่งๆจกๅผ ๅบๆฌไป็ป ๅค่งๆจกๅผ๏ผFacade๏ผ๏ผไนๅซโ่ฟ็จๆจกๅผ๏ผๅค่งๆจกๅผไธบๅญ็ณป็ปไธญ็ไธ็ปๆฅๅฃๆไพไธไธชไธ่ด็็้ข๏ผๆญคๆจกๅผๅฎไนไบไธไธช้ซๅฑๆฅๅฃ๏ผ่ฟไธชๆฅๅฃไฝฟๅพ่ฟไธๅญ็ณป็ปๆดๅ ๅฎนๆไฝฟ็จโ ๅค่งๆจกๅผ้่ฟๅฎไนไธชไธ่ด็ๆฅๅฃ๏ผ็จไปฅๅฑ่ฝๅ
้จๅญ็ณป็ป็็ป่๏ผไฝฟๅพ่ฐ็จ็ซฏๅช้่ท่ฟไธชๆฅๅฃๅ็่ฐ็จ๏ผ่ๆ ้ๅ
ณๅฟ่ฟไธชๅญ็ณป็ป็ๅ
้จ็ป่ ๅค่งๆจกๅผๅ็็ฑปๅพ ๅค่งๆจกๅผๅ็็ฑปๅพ ๅค่งๆจกๅผ็่ง่ฒๅ่่ดฃ ๅค่ง็ฑป๏ผFacade๏ผ๏ผไธบ่ฐ็จ็ซฏๆไพ็ปไธ็่ฐ็จๆฅๅฃ๏ผๅค่ง็ฑป็ฅ้ๅชไบๅญ็ณป็ป่ด่ดฃๅค็่ฏทๆฑ๏ผไป่ๅฐ่ฐ็จ็ซฏ็่ฏทๆฑไปฃ็็ป้ๅฝๅญ็ณป็ปๅฏน่ฑก ่ฐ็จ็๏ผClient๏ผ๏ผๅค่งๆฅๅฃ็่ฐ็จ่
ๅญ็ณป็ป็้ๅ๏ผๆๆจกๅๆ่
ๅญ็ณป็ป๏ผๅค็Facadeๅฏน่ฑกๆๆดพ็ไปปๅก๏ผๅฎๆฏๅ่ฝ็ๅฎ้
ๆไพ่
ๅค่งๆจกๅผ่งฃๅณๅฝฑ้ข็ฎก็ ๅค่งๆจกๅผๅฏไปฅ็่งฃไธบ่ฝฌๆขไธ็พคๆฅๅฃ๏ผๅฎขๆทๅช่ฆ่ฐ็จไธไธชๆฅๅฃ๏ผ่ไธ็จ่ฐ็จๅคไธชๆฅๅฃๆ่ฝ่พพๅฐ็ฎ็ใๆฏๅฆ๏ผๅจPCไธๅฎ่ฃ
่ฝฏไปถ็ๆถๅ็ปๅธธๆไธ้ฎๅฎ่ฃ
้้กน๏ผ็ๅป้ๆฉๅฎ่ฃ
็ฎๅฝใๅฎ่ฃ
็็ปไปถ็ญ็ญ๏ผ๏ผ่ฟๆๅฐฑๆฏๆๆบ็้ๅฏๅ่ฝ๏ผๆๅ
ณๆบๅๅฏๅจๅไธบไธไธชๆไฝ๏ผ ๅค่งๆจกๅผๅฐฑๆฏ่งฃๅณๅคไธชๅคๆๆฅๅฃๅธฆๆฅ็ไฝฟ็จๅฐ้พ๏ผ่ตทๅฐ็ฎๅ็จๆทๆไฝ็ไฝ็จ ็คบๆๅพ่ฏดๆๅฆไธ๏ผ ๅค่งๆจกๅผ่งฃๅณๅฝฑ้ข็ฎก็็คบๆๅพ ๅค่งๆจกๅผ่งฃๅณๅฝฑ้ข็ฎก็ๅบ็จๅฎไพ ๅค่งๆจกๅผ่งฃๅณๅฝฑ้ข็ฎก็ๅบ็จๅฎไพ public class HomeTheaterFacade { //ๅฎไนๅไธชๅญ็ณป็ปๅฏน่ฑก private TheaterLight theaterLight; private Popcorn popcorn; private Stereo stereo; private Projector projector; private Screen screen; private DVDPlayer dVDPlayer; //ๆ้ ๅจ public HomeTheaterFacade() { super(); this.theaterLight = TheaterLight.getInstance(); this.popcorn = Popcorn.getInstance(); this.stereo = Stereo.getInstance(); this.projector = Projector.getInstance(); this.screen = Screen.getInstance(); this.dVDPlayer = DVDPlayer.getInstanc(); } //ๆไฝๅๆ 4 ๆญฅ public void ready() { popcorn.on(); popcorn.pop(); screen.down(); projector.on(); stereo.on(); dVDPlayer.on(); theaterLight.dim(); } public void play() { dVDPlayer.play(); } public void pause() { dVDPlayer.pause(); } public void end() { popcorn.off(); theaterLight.bright(); screen.up(); projector.off(); stereo.off(); dVDPlayer.off(); } } public class Stereo { private static Stereo instance = new Stereo(); public static Stereo getInstance() { return instance; } public void on() { System.out.println(\" Stereo on \"); } public void off() { System.out.println(\" Screen off \"); } public void up() { System.out.println(\" Screen up.. \"); } //... } public class DVDPlayer { //ไฝฟ็จๅไพๆจกๅผ, ไฝฟ็จ้ฅฟๆฑๅผ private static DVDPlayer instance = new DVDPlayer(); public static DVDPlayer getInstanc() { return instance; } public void on() { System.out.println(\" dvd on \"); } public void off() { System.out.println(\" dvd off \"); } public void play() { System.out.println(\" dvd is playing \"); } //.... public void pause() { System.out.println(\" dvd pause ..\"); } } public class TheaterLight { private static TheaterLight instance = new TheaterLight(); public static TheaterLight getInstance() { return instance; } public void on() { System.out.println(\" TheaterLight on \"); } public void off() { System.out.println(\" TheaterLight off \"); } public void dim() { System.out.println(\" TheaterLight dim.. \"); } public void bright() { System.out.println(\" TheaterLight bright.. \"); } } public class Projector { private static Projector instance = new Projector(); public static Projector getInstance() { return instance; } public void on() { System.out.println(\" Projector on \"); } public void off() { System.out.println(\" Projector ff \"); } public void focus() { System.out.println(\" Projector is Projector \"); } //... } public class Popcorn { private static Popcorn instance = new Popcorn(); public static Popcorn getInstance() { return instance; } public void on() { System.out.println(\" popcorn on \"); } public void off() { System.out.println(\" popcorn ff \"); } public void pop() { System.out.println(\" popcorn is poping \"); } } public class Screen { private static Screen instance = new Screen(); public static Screen getInstance() { return instance; } public void up() { System.out.println(\" Screen up \"); } public void down() { System.out.println(\" Screen down \"); } } ๅค่งๆจกๅผๅจMyBatisๆกๆถๅบ็จ็ๆบ็ ๅๆ Mybatisไธญ็ConfigurationๅปๅๅปบMetaObjectๅฏน่ฑกไฝฟ็จๅฐๅค่งๆจกๅผ mybatisไธญไฝฟ็จๅค่งๆจกๅผ่ง่ฒ็ฑปๅพ public class Configuration { protected ReflectorFactory reflectorFactory = new DefaultReflectorFactory(); protected","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:11","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไบซๅ
ๆจกๅผ ไผ ็ปๆนๆณ ๅฑ็คบ็ฝ็ซ้กน็ฎ้ๆฑ ๅฐๅ็ๅคๅ
้กน็ฎ๏ผ็ปๅฎขๆทAๅไธไธชไบงๅๅฑ็คบ็ฝ็ซ๏ผๅฎขๆทA็ๆๅๆ่งๆๆไธ้๏ผไนๅธๆๅ่ฟๆ ท็ไบงๅๅฑ็คบ็ฝ็ซ๏ผไฝๆฏ่ฆๆฑ้ฝๆไบไธๅ๏ผ ๅฎขๆท่ฆๆฑไปฅๆฐ้ป็ๅฝขๅผๅๅธ ๆๅฎขๆทไบบ่ฆๆฑไปฅๅๅฎข็ๅฝขๅผๅๅธ ๆๅฎขๆทๅธๆไปฅๅพฎไฟกๅ
ฌไผๅท็ๅฝขๅผๅๅธ ไผ ็ปๆนๆก่งฃๅณ็ฝ็ซๅฑ็ฐ้กน็ฎ ็ด่งๅคๅถ็ฒ่ดดไธไปฝ๏ผ็ถๅๆ นๆฎๅฎขๆทไธๅ่ฆๆฑ๏ผ่ฟ่กๅฎๅถไฟฎๆน ็ปๆฏไธช็ฝ็ซ็ง็จไธไธช็ฉบ้ด ๆนๆก่ฎพ่ฎก็คบๆๅพๅฆไธ๏ผ ๅฑ็คบ็ฝ็ซๆนๆก่ฎพ่ฎก็คบๆๅพ ไผ ็ปๆนๆก่งฃๅณ็ฝ็ซๅฑ็ฐ้กน็ฎ้ฎ้ขๅๆ ้่ฆ็็ฝ็ซ็ปๆ็ธไผผๅบฆๅพ้ซ๏ผ่ไธ้ฝไธๆฏ้ซ่ฎฟ้ฎ้็ฝ็ซ๏ผๅฆๆๅๆๅคไธช่ๆ็ฉบ้ดๆฅๅค็๏ผ็ธๅฝไบไธไธช็ธๅ็็ฝ็ซ็ๅฎไพๅฏน่ฑกๆๅพๅค๏ผ้ ๆๆๅกๅจ็่ตๆบๆตช่ดน ่งฃๅณๆ่ทฏ๏ผๆดๅๅฐไธไธช็ฝ็ซไธญ๏ผๅ
ฑไบซๅ
ถ็ธๅ
ณ็ไปฃ็ ๅๆฐๆฎ๏ผๅฏนไบ็กฌ็ใๅ
ๅญใCPuใๆฐๆฎๅบ็ฉบ้ด็ญๆๅกๅจ่ตๆบ้ฝๅฏไปฅ่พพๅฐๅ
ฑไบซ๏ผๅๅฐๆๅกๅจ่ตๆบ ๅฏนไบไธ้ขไปฃ็ ๆฅ่ฏด๏ผ็ฑไบๆฏไธไปฝๅฎไพ๏ผ็ปดๆคๅๆฉๅฑ้ฝๆดๅ ๅฎนๆ ไธ้ข็่งฃๅณๆ่ทฏๅฐฑๅฏไปฅไฝฟ็จไบซๅ
ๆจกๅผๆฅ่งฃๅณ ไบซๅ
ๆจกๅผ ๅบๆฌไป็ป ไบซๅ
ๆจกๅผ๏ผFlyweight Pattern๏ผไนๅซ่้ๆจกๅผ๏ผ่ฟ็จๅ
ฑไบซๆๆฏๆๆๅฐๆฏๆๅคง้็ป็ฒๅบฆ็ๅฏน่ฑก ๅธธ็จไบ็ณป็ปๅบๅฑๅผๅ๏ผ่งฃๅณ็ณป็ป็ๆง่ฝ้ฎ้ขใๅๆฐๆฎๅบ่ฟๆฅๆฑ ๏ผ้้ข้ฝๆฏๅๅปบๅฅฝ็่ฟๆฅๅฏน่ฑก๏ผๅจ่ฟไบ่ฟๆฅๅฏน่ฑกไธญๆไปฌ้่ฆ็ๅ็ดๆฅๆฟๆฅ็จ๏ผ้ฟๅ
้ๆฐๅๅปบ๏ผๅฆๆๆฒกๆๆไปฌ้่ฆ็๏ผๅๅๅปบไธไธช ไบซๅ
ๆจกๅผ่ฝๅค่งฃๅณ้ๅคๅฏน่ฑก็ๅ
ๅญๆตช่ดน้ฎ้ข๏ผๅฝ็ณป็ปไธญๆๅคง้็ธไผผๅฏน่ฑก๏ผ้่ฆ็ผๅญๆฑ ๆถใไธ้ๆปๆฏๅๅปบๆฐๅฏน่ฑก๏ผๅฏไปฅไป็ผๅญๆฑ ้ๆฟใ่ฟๆ ทๅฏไปฅ้ไฝ็ณป็ปๅ
ๅญ๏ผๅๆถๆ้ซๆ็ ไบซๅ
ๆจกๅผ็ปๅ
ธ็ๅบ็จๅธธ่งๅฐฑๆฏๆฑ ๆๆฏไบ๏ผStringๅธธ้ๆฑ ใๆฐๆฎๅบ่ฟๆฅๆฑ ใ็ผๅฒๆฑ ็ญ็ญ้ฝๆฏไบซๅ
ๆจกๅผ็ๅบ็จ๏ผไบซๅ
ๅๆจกๅผๆฏๆฑ ๆๆฏ็้่ฆๅฎ็ฐๆนๅผ Stringๅธธ้ๆฑ ไบซๅ
ๆจกๅผ็ๅ็็ฑปๅพ ไบซๅ
ๆจกๅผๅ็็ฑปๅพ ไบซๅ
ๆจกๅผ็่ง่ฒๅ่่ดฃ FlyWeightๆฏๆฝ่ฑก็ไบซๅ
่ง่ฒ๏ผๅฎๆฏไบงๅ็ๆฝ่ฑก็ฑป๏ผๅๆถๅฎไนๅบๅฏน่ฑก็ๅค้จ็ถๆๅๅ
้จ็ถๆ็ๆฅๅฃๆๅฎ็ฐ ConcreteFlyWeightๆฏๅ
ทไฝ็ไบซๅ
่ง่ฒ๏ผๆฏๅ
ทไฝ็ไบงๅ็ฑป๏ผๅฎ็ฐๆฝ่ฑก่ง่ฒๅฎไน็ธๅ
ณไธๅก UnSharedConcreteFlyWeightๆฏไธๅฏๅ
ฑไบซ็่ง่ฒ๏ผไธ่ฌไธไผๅบ็ฐๅจไบซๅ
ๅทฅๅ FlyWeightFactoryไบซๅ
ๅทฅๅ็ฑป๏ผ็จไบๅๅปบไธไธชๆฑ ๅฎนๅจ๏ผ้ๅ๏ผ๏ผๅๆถๆไพไปๆฑ ไธญ่ทๅๅฏน่ฑกๆนๆณ ๅ
้จ็ถๆๅๅค้จ็ถๆ ๆฏๅฆๅดๆฃใไบๅญๆฃใ่ทณๆฃใๅฎไปฌ้ฝๆๅคง้็ๆฃๅญๅฏน่ฑก๏ผๅดๆฃๅไบๅญๆฃๅชๆ้ป็ฝไธค่ฒ๏ผ่ทณๆฃ้ข่ฒๅคไธ็น๏ผๆไปฅๆฃๅญ้ข่ฒๅฐฑๆฏๆฃๅญ็ๅ
้จ็ถๆ๏ผ่ๅไธชๆฃๅญไน้ด็ๅทฎๅซๅฐฑๆฏไฝ็ฝฎ็ไธๅ๏ผๅฝๆไปฌ่ฝๅญๅ๏ผ่ฝๅญ้ข่ฒๆฏๅฎ็๏ผไฝไฝ็ฝฎๆฏๅๅ็๏ผๆไปฅๆฃๅญๅๆ ๅฐฑๆฏๆฃๅญ็ๅค้จ็ถๆ ไบซๅ
ๆจกๅผๆๅบไธคไธช่ฆๆฑ๏ผ็ป็ฒๅบฆๅๅ
ฑไบซๅฏน่ฑกใ่ฟ้ๅฐฑๆถๅๅฐๅ
้จ็ถๆๅๅค้จ็ถๆไบ๏ผๅณๅฐๅฏน่ฑก็ไฟกๆฏๅไธบไธคไธช้จๅ๏ผๅ
้จ็ถๆๅๅค้จ็ถๆ ๅ
้จ็ถๆๆๅฏน่ฑกๅ
ฑไบซๅบๆฅ็ไฟกๆฏ๏ผๅญๅจๅจไบซๅ
ๅฏน่ฑกๅ
้จไธไธไผ้็ฏๅข็ๆนๅ่ๅๅ ๅค้จ็ถๆๆๅฏน่ฑกๅพไปฅไพ่ต็ไธไธชๆ ่ฎฐ๏ผๆฏ้็ฏๅขๆนๅ่ๅๅ็ใไธๅฏๅ
ฑไบซ็็ถๆ ไธพไธชไพๅญ๏ผๅดๆฃ็่ฎบไธๆ361ไธช็ฉบไฝๅฏไปฅๆพๆฃๅญ๏ผๆฏไธชๆฃ็้ฝๆๅฏ่ฝๆไธคไธ็พไธชๆฃๅญๅฏน่ฑกไบง็๏ผๅ ไธบๅ
ๅญ็ฉบ้ดๆ้๏ผไธๅฐๆๅกๅจๅพ้พๆฏๆๆดๅค็็ฉๅฎถ็ฉๅดๆฃๆธธๆ๏ผๅฆๆ็จไบซๅ
ๆจกๅผๆฅๅค็ๆฃๅญ๏ผ้ฃไนๆฃๅญๅฏน่ฑกๅฐฑๅฏไปฅๅๅฐๅฐๅชๆไธคไธชๅฎไพ๏ผ่ฟๆ ทๅฐฑๅพๅฅฝ็่งฃๅณไบๅฏน่ฑก็ๅผ้้ฎ้ข ไบซๅ
ๆจกๅผ่งฃๅณ็ฝ็ซๅฑ็ฐ้กน็ฎๅบ็จๅฎไพ ไบซๅ
ๆจกๅผ่งฃๅณ็ฝ็ซๅฑ็ฐ็ฑปๅพ import java.util.HashMap; // ็ฝ็ซๅทฅๅ็ฑป๏ผๆ นๆฎ้่ฆ่ฟๅๅไธไธช็ฝ็ซ public class WebSiteFactory { //้ๅ๏ผ ๅ
ๅฝๆฑ ็ไฝ็จ private HashMap\u003cString, ConcreteWebSite\u003e pool = new HashMap\u003c\u003e(); //ๆ นๆฎ็ฝ็ซ็็ฑปๅ๏ผ่ฟๅไธไธช็ฝ็ซ, ๅฆๆๆฒกๆๅฐฑๅๅปบไธไธช็ฝ็ซ๏ผๅนถๆพๅ
ฅๅฐๆฑ ไธญ,ๅนถ่ฟๅ public WebSite getWebSiteCategory(String type) { if(!pool.containsKey(type)) { //ๅฐฑๅๅปบไธไธช็ฝ็ซ๏ผๅนถๆพๅ
ฅๅฐๆฑ ไธญ pool.put(type, new ConcreteWebSite(type)); } return (WebSite)pool.get(type); } //่ทๅ็ฝ็ซๅ็ฑป็ๆปๆฐ (ๆฑ ไธญๆๅคๅฐไธช็ฝ็ซ็ฑปๅ) public int getWebSiteCount() { return pool.size(); } } public abstract class WebSite { public abstract void use(User user);//ๆฝ่ฑกๆนๆณ } //ๅ
ทไฝ็ฝ็ซ public class ConcreteWebSite extends WebSite { //ๅ
ฑไบซ็้จๅ๏ผๅ
้จ็ถๆ private String type = \"\"; //็ฝ็ซๅๅธ็ๅฝขๅผ(็ฑปๅ) //ๆ้ ๅจ public ConcreteWebSite(String type) { this.type = type; } @Override public void use(User user) { // TODO Auto-generated method stub System.out.println(\"็ฝ็ซ็ๅๅธๅฝขๅผไธบ:\" + type + \" ๅจไฝฟ็จไธญ .. ไฝฟ็จ่
ๆฏ\" + user.getName()); } } public class User { private String name; public User(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub // ๅๅปบไธไธชๅทฅๅ็ฑป WebSiteFactory factory = new WebSiteFactory(); // ๅฎขๆท่ฆไธไธชไปฅๆฐ้ปๅฝขๅผๅๅธ็็ฝ็ซ WebSite webSite1 = factory.getWebSiteCategory(\"ๆฐ้ป\"); webSite1.use(new User(\"tom\")); // ๅฎขๆท่ฆไธไธชไปฅๅๅฎขๅฝขๅผๅๅธ็็ฝ็ซ WebSite webSite2 = factory.getWebSiteCategory(\"ๅๅฎข\"); webSite2.use(new User(\"jack\")); // ๅฎขๆท่ฆไธไธชไปฅๅๅฎขๅฝขๅผๅๅธ็็ฝ็ซ WebSite webSite3 = factory.getWebSiteCategory(\"ๅๅฎข\"); webSite3.use(new User(\"smith\")); // ๅฎขๆท่ฆไธไธชไปฅๅๅฎขๅฝขๅผๅๅธ็็ฝ็ซ WebSite webSite4 = factory.getWebSiteCategory(\"ๅๅฎข\"); webSite4.use(new User(\"king\")); System.out.println(\"็ฝ็ซ็ๅ็ฑปๅ
ฑ=\" + factory.getWebSiteCount()); } } ไบซๅ
ๆจกๅผๅจJDK-Interge็ๅบ็จๆบ็ ๅๆ public class FlyWeight { public static void main(String[] args) { // TODO Auto-generated method stub //ๅฆๆ Integer.valueOf(x) x ๅจ -128 --- 127 ็ดๆฅ๏ผๅฐฑๆฏไฝฟ็จไบซๅ
ๆจกๅผ่ฟๅ,ๅฆๆไธๅจ //่ๅด็ฑป๏ผๅไป็ถ new //ๅฐ็ป: //1. ๅจvalueOf ๆนๆณไธญ๏ผๅ
ๅคๆญๅผๆฏๅฆๅจ IntegerCache ไธญ๏ผๅฆๆไธๅจ๏ผๅฐฑๅๅปบๆฐ็Integer(new), ๅฆๅ๏ผๅฐฑ็ดๆฅไป ็ผๅญๆฑ ่ฟๅ //2. valueOf ๆนๆณ๏ผๅฐฑไฝฟ็จๅฐไบซๅ
ๆจกๅผ //3. ๅฆๆไฝฟ็จvalueOf ๆนๆณๅพๅฐไธไธชInteger ๅฎไพ๏ผ่ๅดๅจ -128 - 127 ๏ผๆง่ก้ๅบฆๆฏ new ๅฟซ Integer x = Integer.valueOf(127); // ๅพๅฐ xๅฎไพ๏ผ็ฑปๅ Integer Integer y = new Integer(127); // ๅพๅฐ y ๅฎไพ๏ผ็ฑปๅ Integer Integer z = Integer.valueOf(127);//.. Integer w = new Integer(127); System.out.println(x.equals(y)); // ๅคงๅฐ๏ผtrue System.out.println(x == y ); // false System.out.println(x == z ); // true System.out.println(w == x ); // false System.out.println(w == y ); // false Integer x1 = Integer.valueOf(200); Integer x2 = Integer.valueOf(200); System.out.println(\"x1==x2\" + (x1 == x2)); // false } } ไบซๅ
ๆจกๅผ็ๆณจๆไบ้กนๅ็ป่ ไบซๅ
ๆจกๅผ ๅจไบซๅ
ๆจกๅผ่ฟๆ ท็่งฃ๏ผโไบซโๅฐฑ่กจ็คบๅ
ฑไบซ๏ผโๅ
โ่กจ็คบๅฏน่ฑก ็ณป็ปไธญๆๅคง้ๅฏน่ฑก๏ผ่ฟไบๅฏน่ฑกๆถ่ๅคง้ๅ
ๅญ๏ผๅนถไธๅฏน่ฑก็็ถๆๅคง้จๅๅฏไปฅๅค้จๅๆถ๏ผๆไปฌๅฐฑๅฏไปฅ่่้็จไบซๅ
ๆจกๅผ ็จๅฏไธๆ ่ฏ็ ๅคๆญ๏ผๅฆๆๅจๅ
ๅญไธญๆ๏ผๅ่ฟๅ่ฟไธชๅฏ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:12","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไปฃ็ๆจกๅผ ๅบๆฌไป็ป ไปฃ็ๆจกๅผ(Proxy)๏ผไธบไธไธชๅฏน่ฑกๆไพไธไธชๆฟ่บซ๏ผไปฅๆงๅถๅฏน่ฟไธชๅฏน่ฑก็่ฎฟ้ฎใๅณ้่ฟไปฃ็ๅฏน่ฑก่ฎฟ้ฎ็ฎๆ ๅฏน่ฑก๏ผ่ฟๆ ทๅ็ๅฅฝๅคๆฏ๏ผๅฏไปฅๅจ็ฎๆ ๅฏน่ฑกๅฎ็ฐ็ๅบ็กไธ๏ผๅขๅผบ้ขๅค็ๅ่ฝๆไฝ๏ผๅณๆฉๅฑ็ฎๆ ๅฏน่ฑก็ๅ่ฝใ ่ขซไปฃ็็ๅฏน่ฑกๅฏไปฅๆฏ่ฟ็จๅฏน่ฑกใๅๅปบๅผ้ๅคง็ๅฏน่ฑกๆ้่ฆๅฎๅ
จๆงๅถ็ๅฏน่ฑกใ ไปฃ็ๆจกๅผๆไธๅ็ๅฝขๅผ๏ผไธป่ฆๆไธ็ง๏ผ้ๆไปฃ็ใๅจๆไปฃ็๏ผJDKไปฃ็ใๆฅๅฃไปฃ็๏ผๅCglibไปฃ็๏ผๅฏไปฅๅจๅ
ๅญๅจๆ็ๅๅปบๅฏน่ฑก๏ผ่ไธ้่ฆๅฎ็ฐๆฅๅฃ๏ผๅฎๆฏๅฑไบๅจๆไปฃ็็่็ด๏ผ ไปฃ็ๆจกๅผ็คบๆๅพๅฆไธ๏ผ ไปฃ็ๆจกๅผ็คบๆๅพ ้ๆไปฃ็ ๅบๆฌไป็ป ้ๆไปฃ็ๅจไฝฟ็จๆถ๏ผ้่ฆๅฎไนๆฅๅฃๆ่
็ถ็ฑป๏ผ่ขซไปฃ็ๅฏน่ฑก๏ผๅณ็ฎๆ ๅฏน่ฑก๏ผไธไปฃ็ๅฏน่ฑกไธ่ตทๅฎ็ฐ็ธๅ็ๆฅๅฃๆ่
ๆฏ็ปงๆฟ็ธๅ็ถ็ฑป ๅบ็จๅฎไพ ๅ
ทไฝ่ฆๆฑ ๅฎไนไธไธชๆฅๅฃ๏ผITeacherDao ็ฎๆ ๅฏน่ฑกTeacherDaoๅฎ็ฐๆฅๅฃITeacherDAO ไฝฟ็จ้ๆไปฃ็ๆนๅผ๏ผๅฐฑ้่ฆๅจไปฃ็ๅฏน่ฑกTeacherDAOProxyไธญไนๅฎ็ฐITeacherDAO ่ฐ็จ็ๆถๅ้่ฟ่ฐ็จไปฃ็ๅฏน่ฑก็ๆนๆณๆฅ่ฐ็จ็ฎๆ ๅฏน่ฑก ็นๅซๆ้๏ผไปฃ็ๅฏน่ฑกไธ็ฎๆ ๅฏน่ฑก่ฆๅฎ็ฐ็ธๅ็ๆฅๅฃ๏ผ็ถๅ้่ฟ่ฐ็จ็ธๅ็ๆนๆณๆฅ่ฐ็จ็ฎๆ ๅฏน่ฑก็ๆนๆณ ้ๆไปฃ็ๅ็ฑปๅพ่งฃ๏ผ็ฑปๅพ๏ผ //ไปฃ็ๅฏน่ฑก,้ๆไปฃ็ public class TeacherDaoProxy implements ITeacherDao{ private ITeacherDao target; // ็ฎๆ ๅฏน่ฑก๏ผ้่ฟๆฅๅฃๆฅ่ๅ //ๆ้ ๅจ public TeacherDaoProxy(ITeacherDao target) { this.target = target; } @Override public void teach() { // TODO Auto-generated method stub System.out.println(\"ๅผๅงไปฃ็ ๅฎๆๆไบๆไฝใใใใใ \");//ๆนๆณ target.teach(); System.out.println(\"ๆไบคใใใใใ\");//ๆนๆณ } } //ๆฅๅฃ public interface ITeacherDao { void teach(); // ๆ่ฏพ็ๆนๆณ } public class TeacherDao implements ITeacherDao { @Override public void teach() { // TODO Auto-generated method stub System.out.println(\" ่ๅธๆ่ฏพไธญ ใใใใใ\"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅๅปบ็ฎๆ ๅฏน่ฑก(่ขซไปฃ็ๅฏน่ฑก) TeacherDao teacherDao = new TeacherDao(); //ๅๅปบไปฃ็ๅฏน่ฑก, ๅๆถๅฐ่ขซไปฃ็ๅฏน่ฑกไผ ้็ปไปฃ็ๅฏน่ฑก TeacherDaoProxy teacherDaoProxy = new TeacherDaoProxy(teacherDao); //้่ฟไปฃ็ๅฏน่ฑก๏ผ่ฐ็จๅฐ่ขซไปฃ็ๅฏน่ฑก็ๆนๆณ //ๅณ๏ผๆง่ก็ๆฏไปฃ็ๅฏน่ฑก็ๆนๆณ๏ผไปฃ็ๅฏน่ฑกๅๅป่ฐ็จ็ฎๆ ๅฏน่ฑก็ๆนๆณ teacherDaoProxy.teach(); } } ้ๆไปฃ็ไผ็ผบ็น ไผ็น๏ผๅจไธไฟฎๆน็ฎๆ ๅฏน่ฑก็ๅ่ฝๅๆไธ๏ผ่ฝ้่ฟไปฃ็ๅฏน่ฑกๅฏน็ฎๆ ๅ่ฝๆฉๅฑ ็ผบ็น๏ผๅ ไธบไปฃ็ๅฏน่ฑก้่ฆไธ็ฎๆ ๅฏน่ฑกๅฎ็ฐไธๆ ท็ๆฅๅฃ๏ผๆไปฅไผๆๅพๅคไปฃ็็ฑป ไธๆฆๆฅๅฃๅขๅ ๆนๆณ๏ผ็ฎๆ ๅฏน่ฑกไธไปฃ็ๅฏน่ฑก้ฝ่ฆ็ปดๆค ๅจๆไปฃ็ ๅบๆฌไป็ป ไปฃ็ๅฏน่ฑก๏ผไธ้่ฆๅฎ็ฐๆฅๅฃ๏ผไฝๆฏ็ฎๆ ๅฏน่ฑก่ฆๅฎ็ฐๆฅๅฃ๏ผๅฆๅไธ่ฝ็จๅจๆไปฃ็ ไปฃ็ๅฏน่ฑก็็ๆ๏ผๆฏๅฉ็จJDK็API๏ผๅจๆ็ๅจๅ
ๅญไธญๆๅปบไปฃ็ๅฏน่ฑก ๅจๆไปฃ็ไนๅซๅ๏ผJDKไปฃ็ใๆฅๅฃไปฃ็ JDKไธญ็ๆไปฃ็ๅฏน่ฑก็API ไปฃ็็ฑปๆๅจๅ
๏ผjava.lang.reflect.Proxy JDKๅฎ็ฐไปฃ็ๅช้่ฆไฝฟ็จnewProxyInstanceๆนๆณ๏ผไฝๆฏ่ฏฅๆนๆณ้่ฆๆฅๆถไธไธชๅๆฐ๏ผๅฎๆๅๆณๅฆไธ๏ผ static Object newProxyInstance(ClassLoader loader,Class\u003c?\u003e[] interfaces,InvocationHandler handler) ๅบ็จๅฎไพ ๅฐๅ้ข็้ๆไปฃ็่ฏฅ่ฟๆๅจๆไปฃ็ๆจกๅผ๏ผๅณ๏ผJDKไปฃ็ๆจกๅผ๏ผ ๅจๆไปฃ็ๅบ็จๅฎไพ็ฑปๅพ Cglibไปฃ็ๆจกๅผ ๅบๆฌไป็ป ้ๆไปฃ็ๅJDKไปฃ็ๆจกๅผ้ฝ่ฆๆฑ็ฎๆ ๅฏน่ฑกๆฏๅฎ็ฐไธไธชๆฅๅฃ๏ผไฝๆฏๆๆถๅ็ฎๆ ๅฏน่ฑกๅชๆฏไธไธชๅ็ฌ็ๅฏน่ฑก๏ผๅนถๆฒกๆๅฎ็ฐไปปไฝ็ๆฅๅฃ๏ผ่ฟไธชๆถๅๅฏไฝฟ็จ็ฎๆ ๅฏน่ฑกๅญ็ฑปๆฅๅฎ็ฐไปฃ็-\u003e่ฟๅฐฑๆฏCglibไปฃ็ Cglibไปฃ็ไนๅซไฝๅญ็ฑปไปฃ็๏ผๅฎๆฏๅจๅ
ๅญไธญๆๅปบไธไธชๅญ็ฑปๅฏน่ฑกไป่ๅฎ็ฐๅฏน็ฎๆ ๅฏน่ฑกๅ่ฝๆฉๅฑ๏ผๆไบไนฆไนๅฐCglibไปฃ็ๅฝๅฑๅฐๅจๆไปฃ็ Cglibๆฏไธไธชๅผบๅคง็้ซๆง่ฝ็ไปฃ็ ็ๆๅ
๏ผๅฎๅฏไปฅๅจ่ฟ่กๆๆฉๅฑJava็ฑปไธๅฎ็ฐJavaๆฅๅฃ๏ผๅฎๅนฟๆณ็่ขซ่ฎธๅคAOP็ๆกๆถไฝฟ็จ๏ผไพๅฆSpring AOP๏ผๅฎ็ฐๆนๆณๆฆๆช ๅจAOP็ผ็จไธญๅฆไฝ้ๆฉไปฃ็ๆจกๅผ ็ฎๆ ๅฏน่ฑก้่ฆๅฎ็ฐๆฅๅฃ๏ผ็จJDKไปฃ็ ็ฎๆ ๅฏน่ฑกไธ้่ฆๅฎ็ฐๆฅๅฃ๏ผ็จCglibไปฃ็ Cglibๅ
็ๅบๅฑๆฏ้่ฟไฝฟ็จๅญ่็ ๅค็ๆกๆถASMๆฅ่ฝฌๆขๅญ่็ ๅนถ็ๆๆฐ็็ฑป Cglibไปฃ็ๆจกๅผๅฎ็ฐๆญฅ้ชค ้่ฆๅผๅ
ฅcglib็jarๅ
ๅจๅ
ๅญไธญๅจๆๆๅปบๅญ็ฑป๏ผๆณจๆไปฃ็็็ฑปไธ่ฝไธบfinal๏ผๅฆๅๆฅ้๏ผjava.lang.IllegalArgumentException๏ผ ็ฎๆ ๅฏน่ฑก็ๆนๆณๅฆๆไธบfinal/static๏ผ้ฃไนๅฐฑไธไผ่ขซๆฆๆช๏ผๅณไธไผๆง่ก็ฎๆ ๅฏน่ฑก้ขๅค็ไธๅกๆนๆณ Cglibไปฃ็ๆจกๅผๅบ็จๅฎไพ ๅฐๅ้ขๆกไพ็จCglibไปฃ็ๆจกๅผๅฎ็ฐ Cglibไปฃ็ๆจกๅผๅบ็จๅฎไพ็ฑปๅพ import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class ProxyFactory implements MethodInterceptor { //็ปดๆคไธไธช็ฎๆ ๅฏน่ฑก private Object target; //ๆ้ ๅจ๏ผไผ ๅ
ฅไธไธช่ขซไปฃ็็ๅฏน่ฑก public ProxyFactory(Object target) { this.target = target; } //่ฟๅไธไธชไปฃ็ๅฏน่ฑก: ๆฏ target ๅฏน่ฑก็ไปฃ็ๅฏน่ฑก public Object getProxyInstance() { //1. ๅๅปบไธไธชๅทฅๅ
ท็ฑป Enhancer enhancer = new Enhancer(); //2. ่ฎพ็ฝฎ็ถ็ฑป enhancer.setSuperclass(target.getClass()); //3. ่ฎพ็ฝฎๅ่ฐๅฝๆฐ enhancer.setCallback(this); //4. ๅๅปบๅญ็ฑปๅฏน่ฑก๏ผๅณไปฃ็ๅฏน่ฑก return enhancer.create(); } //้ๅ intercept ๆนๆณ๏ผไผ่ฐ็จ็ฎๆ ๅฏน่ฑก็ๆนๆณ @Override public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable { // TODO Auto-generated method stub System.out.println(\"Cglibไปฃ็ๆจกๅผ ~~ ๅผๅง\"); Object returnVal = method.invoke(target, args); System.out.println(\"Cglibไปฃ็ๆจกๅผ ~~ ๆไบค\"); return returnVal; } } public class TeacherDao { public String teach() { System.out.println(\" ่ๅธๆ่ฏพไธญ ๏ผ ๆๆฏcglibไปฃ็๏ผไธ้่ฆๅฎ็ฐๆฅๅฃ \"); return \"hello\"; } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅๅปบ็ฎๆ ๅฏน่ฑก TeacherDao target = new TeacherDao(); //่ทๅๅฐไปฃ็ๅฏน่ฑก๏ผๅนถไธๅฐ็ฎๆ ๅฏน่ฑกไผ ้็ปไปฃ็ๅฏน่ฑก TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance(); //ๆง่กไปฃ็ๅฏน่ฑก็ๆนๆณ๏ผ่งฆๅintecept ๆนๆณ๏ผไป่ๅฎ็ฐ ๅฏน็ฎๆ ๅฏน่ฑก็่ฐ็จ String res = proxyInstance.teach(); System.out.println(\"res=\" + res); } } ไปฃ็ๆจกๅผ๏ผProxy๏ผ็ๅไฝ ้ฒ็ซๅขไปฃ็ ๅ
็ฝ้่ฟไปฃ็็ฉฟ้้ฒ็ซๅข๏ผๅฎ็ฐๅฏนๅ
ฌ็ฝ็่ฎฟ้ฎ ็ผๅญไปฃ็ ๆฏๅฆ๏ผๅฝ่ฏทๆฑๅพ็ๆไปถ็ญ่ตๆบๆถ๏ผๅ
ๅฐ็ผๅญไปฃ็ๅ๏ผๅฆๆๅๅฐ่ตๆบๅOK๏ผๅฆๆๅไธๅฐ่ตๆบ๏ผๅๅฐๅ
ฌ็ฝๆ่
ๆฐๆฎๅบไธญๅ๏ผ็ถๅ็ผๅญ ่ฟ็จไปฃ็ ่ฟ็จๅฏน่ฑก็ๆฌๅฐไปฃ่กจ๏ผ้่ฟๅฎๅฏไปฅๆ่ฟ็จๅฏน่ฑกๅฝๆฌๅฐๅฏน่ฑกๆฅ่ฐ็จใ่ฟ็จไปฃ็้่ฟ็ฝ็ปๅ็ๆญฃ็่ฟ็จๅฏน่ฑกๆฒ้ไฟกๆฏ ๅๆญฅไปฃ็ ไธป่ฆไฝฟ็จๅจๅค็บฟ็จ็ผ็จไธญ๏ผๅฎๆๅค็บฟ็จ้ดๅๆญฅๅทฅไฝ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:13","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๆจก็ๆนๆณๆจกๅผ ่ฑๆตๅถไฝ้ฎ้ข ็ผๅๅถไฝ่ฑๆต็็จๅบ๏ผ่ฏดๆๅฆไธ๏ผ ๅถไฝ่ฑๆต็ๆต็จ ้ๆ-\u003eๆทปๅ ้
ๆ-\u003eๆตธๆณก-\u003eๆพๅฐ่ฑๆตๆบๆ็ข ้่ฟๆทปๅ ไธๅ็้
ๆ๏ผๅฏไปฅๅถไฝๅบไธๅๅฃๅณ็่ฑๆต ้ๆใๆตธๆณกๅๆพๅฐ่ฑๆตๆบๆ็ข่ฟๅ ไธชๆญฅ้ชคๅฏนไบๅถไฝๆฏ็งๅฃๅณ็่ฑๆต้ฝๆฏไธๆ ท็ ่ฏทไฝฟ็จๆจก็ๆนๆณๆจกๅผๅฎๆ๏ผ่ฏดๆ๏ผๅ ไธบๆจก็ๆนๆณๆจกๅผ๏ผๆฏ่พ็ฎๅ๏ผๅพๅฎนๆๅฐฑๆณๅฐ่ฟไธชๆนๆก๏ผๅ ๆญคๅฐฑ็ดๆฅไฝฟ็จ๏ผไธๅไฝฟ็จไผ ็ปๆนๆกๅผๅบๆจก็ๆนๆณๆจกๅผ๏ผ ๆจก็ๆนๆณๆจกๅผๅบๆฌไป็ป ๆจก็ๆนๆณๆจกๅผ๏ผTemplate Method Pattern๏ผ๏ผๅๅซๆจก็ๆจกๅผ๏ผTemplate Pattern๏ผ๏ผๅจไธไธชๆฝ่ฑก็ฑปๅ
ฌๅผๅฎไนไบๆง่กๅฎ็ๆนๆณ็ๆจก็ใๅฎ็ๅญ็ฑปๅฏไปฅๆ้่ฆ้ๅๆนๆณๅฎ็ฐ๏ผไฝ่ฐ็จๅฐไปฅๆฝ่ฑก็ฑปไธญๅฎไน็ๆนๅผ่ฟ่กใ ็ฎๅ่ฏด๏ผๆจก็ๆนๆณๆจกๅผๅฎไนไบไธไธชๆไฝไธญ็็ฎๆณ้ชจๆถ๏ผ่ๅฐไธไบๆญฅ้ชคๅปถ่ฟๅฐๅญ็ฑปไธญ๏ผไฝฟๅพๅญ็ฑปๅฏไปฅไธๆนๅไธไธช็ฎๆณ็็ปๆ๏ผๅฐฑๅฏไปฅ้ๅฎไน่ฏฅ็ฎๆณ็ๆไบ็นๅฎๆญฅ้ชค ่ฟ็ง็ฑปๅ็่ฎพ่ฎกๆจกๅผๅฑไบ-\u003e่กไธบๅๆจกๅผ ๆจก็ๆนๆณๆจกๅผๅ็็ฑปๅพ ๆจก็ๆนๆณๆจกๅผๅ็็ฑปๅพ ๆจก็ๆนๆณๆจกๅผ็่ง่ฒๅ่่ดฃ AbstractClass ๆฝ่ฑก็ฑป๏ผ็ฑปไธญๅฎ็ฐไบๆจก็ๆนๆณ๏ผTemplate๏ผ๏ผๅฎไนไบ็ฎๆณ็้ชจๆถ๏ผๅ
ทไฝๅญ็ฑป้่ฆๅปๅฎ็ฐๅ
ถๅฎ็ๆฝ่ฑกๆนๆณ operation2๏ผ3๏ผ4 ConcreteClassๅฎ็ฐๆฝ่ฑกๆนๆณoperation2๏ผ3๏ผ4๏ผไปฅๅฎๆ็ฎๆณไธญ็นๅฎๅญ็ฑป็ๆญฅ้ชค ๆจก็ๆนๆณๆจกๅผ่งฃๅณ่ฑๆตๅถไฝ้ฎ้ข ๆจก็ๆนๆณๆจกๅผ่งฃๅณ่ฑๆตๅถไฝ้ฎ้ข็ฑปๅพ //ๆฝ่ฑก็ฑป๏ผ่กจ็คบ่ฑๆต public abstract class SoyaMilk { //ๆจกๆฟๆนๆณ, make , ๆจกๆฟๆนๆณๅฏไปฅๅๆfinal , ไธ่ฎฉๅญ็ฑปๅป่ฆ็. final void make() { select(); addCondiments(); soak(); beat(); } //้ๆๆ void select() { System.out.println(\"็ฌฌไธๆญฅ๏ผ้ๆฉๅฅฝ็ๆฐ้ฒ้ป่ฑ \"); } //ๆทปๅ ไธๅ็้
ๆ๏ผ ๆฝ่ฑกๆนๆณ, ๅญ็ฑปๅ
ทไฝๅฎ็ฐ abstract void addCondiments(); //ๆตธๆณก void soak() { System.out.println(\"็ฌฌไธๆญฅ๏ผ ้ป่ฑๅ้
ๆๅผๅงๆตธๆณก๏ผ ้่ฆ3ๅฐๆถ \"); } void beat() { System.out.println(\"็ฌฌๅๆญฅ๏ผ้ป่ฑๅ้
ๆๆพๅฐ่ฑๆตๆบๅปๆ็ข \"); } } public class RedBeanSoyaMilk extends SoyaMilk { @Override void addCondiments() { // TODO Auto-generated method stub System.out.println(\" ๅ ๅ
ฅไธๅฅฝ็็บข่ฑ \"); } } public class PeanutSoyaMilk extends SoyaMilk { @Override void addCondiments() { // TODO Auto-generated method stub System.out.println(\" ๅ ๅ
ฅไธๅฅฝ็่ฑ็ \"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅถไฝ็บข่ฑ่ฑๆต System.out.println(\"----ๅถไฝ็บข่ฑ่ฑๆต----\"); SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk(); redBeanSoyaMilk.make(); System.out.println(\"----ๅถไฝ่ฑ็่ฑๆต----\"); SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk(); peanutSoyaMilk.make(); } } ๆจก็ๆนๆณๆจกๅผ็้ฉๅญๆนๆณ ๅจๆจก็ๆนๆณๆจกๅผ็็ถ็ฑปไธญ๏ผๆไปฌๅฎไนไธไธชๆนๆณ๏ผๅฎ้ป่ฎคไธๅไปปไฝไบ๏ผๅญ็ฑปๅฏไปฅ่งๆ
ๅต่ฆไธ่ฆ่ฆ็ๅฎ๏ผ่ฏฅๆนๆณ็งฐไธบโ้ฉๅญโ ่ฟๆฏ็จไธ้ขๅ่ฑๆต็ไพๅญๆฅ่ฎฒ่งฃ๏ผๆฏๅฆ๏ผๆไปฌ่ฟๅธๆๅถไฝ็บฏ่ฑๆต๏ผไธๆทปๅ ไปปไฝ็้
ๆ๏ผ่ฏทไฝฟ็จ้ฉๅญๆนๆณๅฏนๅ้ข็ๆจก็ๆนๆณ่ฟ่กๆน้ //ๆฝ่ฑก็ฑป๏ผ่กจ็คบ่ฑๆต public abstract class SoyaMilk { //ๆจกๆฟๆนๆณ, make , ๆจกๆฟๆนๆณๅฏไปฅๅๆfinal , ไธ่ฎฉๅญ็ฑปๅป่ฆ็. final void make() { select(); if(customerWantCondiments()) { addCondiments(); } soak(); beat(); } //้ๆๆ void select() { System.out.println(\"็ฌฌไธๆญฅ๏ผ้ๆฉๅฅฝ็ๆฐ้ฒ้ป่ฑ \"); } //ๆทปๅ ไธๅ็้
ๆ๏ผ ๆฝ่ฑกๆนๆณ, ๅญ็ฑปๅ
ทไฝๅฎ็ฐ abstract void addCondiments(); //ๆตธๆณก void soak() { System.out.println(\"็ฌฌไธๆญฅ๏ผ ้ป่ฑๅ้
ๆๅผๅงๆตธๆณก๏ผ ้่ฆ3ๅฐๆถ \"); } void beat() { System.out.println(\"็ฌฌๅๆญฅ๏ผ้ป่ฑๅ้
ๆๆพๅฐ่ฑๆตๆบๅปๆ็ข \"); } //้ฉๅญๆนๆณ๏ผๅณๅฎๆฏๅฆ้่ฆๆทปๅ ้
ๆ boolean customerWantCondiments() { return true; } } public class RedBeanSoyaMilk extends SoyaMilk { @Override void addCondiments() { // TODO Auto-generated method stub System.out.println(\" ๅ ๅ
ฅไธๅฅฝ็็บข่ฑ \"); } } public class PureSoyaMilk extends SoyaMilk{ @Override void addCondiments() { // TODO Auto-generated method stub //็ฉบๅฎ็ฐ } @Override boolean customerWantCondiments() { // TODO Auto-generated method stub return false; } } public class PeanutSoyaMilk extends SoyaMilk { @Override void addCondiments() { // TODO Auto-generated method stub System.out.println(\" ๅ ๅ
ฅไธๅฅฝ็่ฑ็ \"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅถไฝ็บข่ฑ่ฑๆต System.out.println(\"----ๅถไฝ็บข่ฑ่ฑๆต----\"); SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk(); redBeanSoyaMilk.make(); System.out.println(\"----ๅถไฝ่ฑ็่ฑๆต----\"); SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk(); peanutSoyaMilk.make(); System.out.println(\"----ๅถไฝ็บฏ่ฑๆต----\"); SoyaMilk pureSoyaMilk = new PureSoyaMilk(); pureSoyaMilk.make(); } } ๆจก็ๆนๆณๆจกๅผๅจSpringๆกๆถๅบ็จ็ๆบ็ ๅๆ Spring IOCๅฎนๅจๅๅงๅๆถ่ฟ็จๅฐ็ๆจก็ๆนๆณๆจกๅผ Springๆบ็ ไฝฟ็จๆจก็ๆนๆณๆจกๅผ็ฑปๅพ ๆจก็ๆนๆณๆจกๅผๆณจๆไบ้กนๅ็ป่ ๆจก็ๆนๆณๆจกๅผ ๅบๆฌๆๆณ๏ผ็ฎๆณๅชๅญๅจไบไธไธชๅฐๆน๏ผไนๅฐฑๆฏๅจ็ถ็ฑปไธญ๏ผๅฎนๆไฟฎๆนใ้่ฆไฟฎๆน็ฎๆณๆถ๏ผๅช่ฆไฟฎๆน็ถ็ฑป็ๆจก็ๆนๆณๆ่
ๅทฒ็ปๅฎ็ฐ็ๆไบๆญฅ้ชค๏ผๅญ็ฑปๅฐฑไผ็ปงๆฟ่ฟไบไฟฎๆน ๅฎ็ฐไบๆๅคงๅไปฃ็ ๅค็จใ็ถ็ฑป็ๆจก็ๆนๆณๅๅทฒ็ปๅฎ็ฐ็ๆไบๆญฅ้ชคไผ่ขซๅญ็ฑป็ปงๆฟ่็ดๆฅไฝฟ็จ ๅณ็ปไธไบ็ฎๆณ๏ผไนๆไพไบๅพๅคง็็ตๆดปๆงใ็ถ็ฑป็ๆจก็ๆนๆณ็กฎไฟไบ็ฎๆณ็็ปๆไฟๆไธๅ๏ผๅๆถ็ฑๅญ็ฑปๆไพ้จๅๆญฅ้ชค็ๅฎ็ฐ ่ฏฅๆจกๅผ็ไธ่ถณไนๅค๏ผๆฏไธไธชไธๅ็ๅฎ็ฐ้ฝ้่ฆไธไธชๅญ็ฑปๅฎ็ฐ๏ผๅฏผ่ด็ฑป็ไธชๆฐๅขๅ ๏ผไฝฟๅพ็ณป็ปๆดๅ ๅบๅคง ไธ่ฌๆจก็ๆนๆณ้ฝๅ ไธfinalๅ
ณ้ฎๅญ๏ผ้ฒๆญขๅญ็ฑป้ๅๆจก็ๆนๆณ ๆจก็ๆนๆณๆจกๅผไฝฟ็จๅบๆฏ๏ผๅฝ่ฆๅฎๆๅจๆไธช่ฟ็จ๏ผ่ฏฅ่ฟ็จ่ฆๆง่กไธ็ณปๅๆญฅ้ชค๏ผ่ฟไธ็ณปๅ็ๆญฅ้ชคๅบๆฌ็ธๅ๏ผไฝๅ
ถไธชๅซๆญฅ้ชคๅจๅฎ็ฐๆถๅฏ่ฝไธๅ๏ผ้ๅธธ่่็จๆจก็ๆนๆณๆจกๅผๆฅๅค็ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:14","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅฝไปคๆจกๅผ ๆบ่ฝ็ๆดป้กน็ฎ ๆบ่ฝ็ๆดป้กน็ฎๅ
ทไฝ้ๆฑ ๆไปฌไนฐไบไธๅฅๆบ่ฝๅฎถ็ต๏ผๆ็
งๆ็ฏใ้ฃๆๅฐ็ฎฑใๆด่กฃๆบ๏ผๆไปฌๅช่ฆๅจๆๆบไธๅฎ่ฃ
appๅฐฑๅฏไปฅๆงๅถๅฏน่ฟไบๅฎถ็ตๅทฅไฝ ่ฟไบ่่ฝๅฎถ็ตๆฅ่ชไธๅ็ๅๅฎถ๏ผๆไปฌไธๆณ้ๅฏนๆฏไธ็งๅฎถ็ต้ฝๅฎ่ฃ
ไธไธชApp๏ผๅๅซๆงๅถ๏ผๆไปฌๅธๆๅช่ฆไธไธชappๅฐฑๅฏไปฅๆงๅถๅ
จ้จ่่ฝๅฎถ็ต ่ฆๅฎ็ฐไธไธชappๆงๅถๆๆๆบ่ฝๅฎถ็ต็้ๆฑ๏ผๅๆฏไธชๆบ่ฝๅฎถ็ตๅๅฎถ้ฝ่ฆๆไพไธไธช็ปไธ็ๆฅๅฃ็ปapp่ฐ็จ๏ผ่ฟๆถๅฐฑๅฏไปฅ่่ไฝฟ็จๅฝไปคๆจกๅผ ๅฝไปคๆจกๅผๅฏๅฐโๅจไฝ็่ฏทๆฑ่
โไปโๅจไฝ็ๆง่ก่
โๅฏน่ฑกไธญ่งฃ่ฆๅบๆฅ ๅจไธ้ขไพๅญไธญ๏ผๅจไฝ็่ฏทๆฑ่
ๆฏๆๆบapp๏ผๅจไฝ็ๆง่ก่
ๆฏๆฏไธชๅๅ็ไธไธชๅฎถ็ตไบงๅ ๅฝไปคๆจกๅผๅบๆฌไป็ป ๅฝไปคๆจกๅผ๏ผCommand Pattern๏ผ๏ผๅจ่ฝฏไปถ่ฎพ่ฎกไธญ๏ผๆไปฌ็ปๅธธ้่ฆๅๆไบๅฏน่ฑกๅ้่ฏทๆฑ๏ผไฝๆฏๅนถไธ็ฅ้่ฏทๆฑ็ๆฅๆถ่
ๆฏ่ฐ๏ผไนไธ็ฅ้่ขซ่ฏทๆฑ็ๆไฝๆฏๅชไธช๏ผๆไปฌๅช้ๅจ็จๅบ่ฟ่กๆถๆๅฎๅ
ทไฝ็่ฏทๆฑๆฅๆถ่
ๅณๅฏ๏ผๆญคๆถ๏ผๅฏไปฅไฝฟ็จๅฝไปคๆจกๅผๆฅ่ฟ่ก่ฎพ่ฎก ๅฝไปคๆจกๅผไฝฟๅพ่ฏทๆฑๅ้่
ไธ่ฏทๆฑๆฅๆถ่
ๆถ้คๅฝผๆญคไน้ด็่ฆๅ๏ผ่ฎฉๅฏน่ฑกไน้ด็่ฐ็จๅ
ณ็ณปๆดๅ ็ตๆดป๏ผๅฎ็ฐ่งฃ่ฆ ๅจๅฝไปคๆจกๅผไธญ๏ผไผๅฐไธไธช่ฏทๆฑๅฐ่ฃ
ไธบไธไธชๅฏน่ฑก๏ผไปฅไพฟไฝฟ็จไธๅๅๆฐๆฅ่กจ็คบไธๅ็่ฏทๆฑ๏ผๅณๅฝๅ๏ผ๏ผๅๆถๅฝไปคๆจกๅผไนๆฏๆๅฏๆค้็ๆไฝ ้ไฟๆๆ็็่งฃ๏ผๅฐๅๅๅธๅฝไปค๏ผๅฃซๅ
ตๅปๆง่กใๅ
ถไธญๆๅ ไธช่ง่ฒ๏ผๅฐๅ๏ผๅฝไปคๅๅธ่
๏ผใๅฃซๅ
ต๏ผๅฝไปค็ๅ
ทไฝๆง่ก่
๏ผใๅฝไปค๏ผ่ฟๆฅๅฐๅๅๅฃซๅ
ต๏ผใInvokerๆฏ่ฐ็จ่
๏ผๅฐๅ๏ผ๏ผReceiverๆฏ่ขซ่ฐ็จ่
๏ผๅฃซๅ
ต๏ผ๏ผMyCommandๆฏๅฝไปค๏ผๅฎ็ฐไบCommandๆฅๅฃ๏ผๆๆๆฅๆถๅฏน่ฑก ๅฝไปคๆจกๅผ็ๅ็็ฑปๅพ ๅฝไปคๆจกๅผ็ๅ็็ฑปๅพ ๅฝไปคๆจกๅผ็่ง่ฒๅ่่ดฃ Invoker๏ผๆฏ่ฐ็จ่
่ง่ฒ Command๏ผๆฏๅฝไปค่ง่ฒ๏ผ้่ฆๆง่ก็ๆๆๅฝไปค้ฝๅจ่ฟ้๏ผๅฏไปฅๆฏๆฅๅฃๆๆฝ่ฑก็ฑป Receiver๏ผๆฏๆฅๆถ่
่ง่ฒ๏ผ็ฅ้ๅฆไฝๅฎๆฝๅๆง่กไธไธช่ฏทๆฑ็ธๅ
ณ็ๆไฝ ConcreteCommand๏ผๅฐไธไธชๆฅๆถ่
ๅฏน่ฑกไธไธไธชๅจไฝ็ปๅฎ๏ผ่ฐ็จๆฅๆถ่
็ธๅบ็ๆไฝ๏ผๅฎ็ฐexecute ๅฝไปคๆจกๅผ่งฃๅณๆบ่ฝ็ๆดป้กน็ฎ ๅฝไปคๆจกๅผ่งฃๅณๆบ่ฝ็ๆดป้กน็ฎ็ฑปๅพ //ๅๅปบๅฝไปคๆฅๅฃ public interface Command { //ๆง่กๅจไฝ(ๆไฝ) public void execute(); //ๆค้ๅจไฝ(ๆไฝ) public void undo(); } /** * ๆฒกๆไปปไฝๅฝไปค๏ผๅณ็ฉบๆง่ก: ็จไบๅๅงๅๆฏไธชๆ้ฎ, ๅฝ่ฐ็จ็ฉบๅฝไปคๆถ๏ผๅฏน่ฑกไปไน้ฝไธๅ * ๅ
ถๅฎ๏ผ่ฟๆ ทๆฏไธ็ง่ฎพ่ฎกๆจกๅผ, ๅฏไปฅ็ๆๅฏน็ฉบๅคๆญ * @author Administrator * */ public class NoCommand implements Command { @Override public void execute() { // TODO Auto-generated method stub } @Override public void undo() { // TODO Auto-generated method stub } } public class LightOffCommand implements Command { // ่ๅLightReceiver LightReceiver light; // ๆ้ ๅจ public LightOffCommand(LightReceiver light) { super(); this.light = light; } @Override public void execute() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ light.off(); } @Override public void undo() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ light.on(); } } public class LightOnCommand implements Command { //่ๅLightReceiver LightReceiver light; //ๆ้ ๅจ public LightOnCommand(LightReceiver light) { super(); this.light = light; } @Override public void execute() { // TODO Auto-generated method stub //่ฐ็จๆฅๆถ่
็ๆนๆณ light.on(); } @Override public void undo() { // TODO Auto-generated method stub //่ฐ็จๆฅๆถ่
็ๆนๆณ light.off(); } } public class LightReceiver { public void on() { System.out.println(\" ็ต็ฏๆๅผไบ.. \"); } public void off() { System.out.println(\" ็ต็ฏๅ
ณ้ญไบ.. \"); } } public class RemoteController { // ๅผ ๆ้ฎ็ๅฝไปคๆฐ็ป Command[] onCommands; Command[] offCommands; // ๆง่กๆค้็ๅฝไปค Command undoCommand; // ๆ้ ๅจ๏ผๅฎๆๅฏนๆ้ฎๅๅงๅ public RemoteController() { onCommands = new Command[5]; offCommands = new Command[5]; for (int i = 0; i \u003c 5; i++) { onCommands[i] = new NoCommand(); offCommands[i] = new NoCommand(); } } // ็ปๆไปฌ็ๆ้ฎ่ฎพ็ฝฎไฝ ้่ฆ็ๅฝไปค public void setCommand(int no, Command onCommand, Command offCommand) { onCommands[no] = onCommand; offCommands[no] = offCommand; } // ๆไธๅผๆ้ฎ public void onButtonWasPushed(int no) { // no 0 // ๆพๅฐไฝ ๆไธ็ๅผ็ๆ้ฎ๏ผ ๅนถ่ฐ็จๅฏนๅบๆนๆณ onCommands[no].execute(); // ่ฎฐๅฝ่ฟๆฌก็ๆไฝ๏ผ็จไบๆค้ undoCommand = onCommands[no]; } // ๆไธๅผๆ้ฎ public void offButtonWasPushed(int no) { // no 0 // ๆพๅฐไฝ ๆไธ็ๅ
ณ็ๆ้ฎ๏ผ ๅนถ่ฐ็จๅฏนๅบๆนๆณ offCommands[no].execute(); // ่ฎฐๅฝ่ฟๆฌก็ๆไฝ๏ผ็จไบๆค้ undoCommand = offCommands[no]; } // ๆไธๆค้ๆ้ฎ public void undoButtonWasPushed() { undoCommand.undo(); } } public class TVOffCommand implements Command { // ่ๅTVReceiver TVReceiver tv; // ๆ้ ๅจ public TVOffCommand(TVReceiver tv) { super(); this.tv = tv; } @Override public void execute() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ tv.off(); } @Override public void undo() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ tv.on(); } } public class TVOnCommand implements Command { // ่ๅTVReceiver TVReceiver tv; // ๆ้ ๅจ public TVOnCommand(TVReceiver tv) { super(); this.tv = tv; } @Override public void execute() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ tv.on(); } @Override public void undo() { // TODO Auto-generated method stub // ่ฐ็จๆฅๆถ่
็ๆนๆณ tv.off(); } } public class TVReceiver { public void on() { System.out.println(\" ็ต่งๆบๆๅผไบ.. \"); } public void off() { System.out.println(\" ็ต่งๆบๅ
ณ้ญไบ.. \"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ไฝฟ็จๅฝไปค่ฎพ่ฎกๆจกๅผ๏ผๅฎๆ้่ฟ้ฅๆงๅจ๏ผๅฏน็ต็ฏ็ๆไฝ //ๅๅปบ็ต็ฏ็ๅฏน่ฑก(ๆฅๅ่
) LightReceiver lightReceiver = new LightReceiver(); //ๅๅปบ็ต็ฏ็ธๅ
ณ็ๅผๅ
ณๅฝไปค LightOnCommand lightOnCommand = new LightOnCommand(lightReceive","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:15","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฎฟ้ฎ่
ๆจกๅผ ่ฏๆต็ณป็ป ่ฏๆต็ณป็ป้ๆฑ ๅฐ่งไผๅไธบ็ทไบบๅๅฅณไบบ๏ผๅฏนๆญๆ่ฟ่ก่ฏๆต๏ผๅฝ็ๅฎๆไธชๆญๆ่กจๆผๅ๏ผๅพๅฐไปไปฌๅฏน่ฏฅๆญๆไธๅ็่ฏไปท๏ผ่ฏไปทๆไธๅ็็ง็ฑป๏ผๆฏๅฆๆๅใๅคฑ่ดฅ็ญ๏ผ ไผ ็ปๆนๆณ ไผ ็ปๆนๅผ็้ฎ้ขๅๆ ่ฏๆต็ณป็ปไผ ็ปๆนๅผ่งฃๅณ ๅฆๆ็ณป็ปๆฏ่พๅฐ๏ผ่ฟๆฏOK็๏ผไฝๆฏ่่็ณป็ปๅขๅ ่ถๆฅ่ถๅคๆฐ็ๅ่ฝๆถ๏ผๅฏนไปฃ็ ๆนๅจๆฏ่พๅคง๏ผ่ฟๅไบOCPๅๅ๏ผไธๅฉไบ็ปดๆค ๆฉๅฑๆงไธๅฅฝ๏ผๆฏๅฆๅขๅ ไบๆฐ็ไบบๅ็ฑปๅ๏ผๆ่
็ฎก็ๆนๆณ๏ผ้ฝไธๅฅฝๅ ๅผๅบๆไปฌไผไฝฟ็จๆฐ็่ฎพ่ฎกๆจกๅผ-\u003e่ฎฟ้ฎ่
ๆจกๅผ ่ฎฟ้ฎ่
ๆจกๅผ ๅบๆฌไป็ป ่ฎฟ้ฎ่
ๆจกๅผ๏ผVisitor Patter๏ผ๏ผๅฐ่ฃ
ไธไบไฝ็จไบๆ็งๆฐๆฎ็ปๆ็ๅๅ
็ด ็ๆไฝ๏ผๅฎๅฏไปฅๅจไธๆนๅๆฐๆฎ็ปๆ็ๅๆไธๅฎไนไฝ็จไบ่ฟไบๅ
็ด ็ๆฐ็ๆไฝ ไธป่ฆๅฐๆฐๆฎ็ปๆไธๆฐๆฎๆไฝๅ็ฆป๏ผ่งฃๅณๆฐๆฎ็ปๆๅๆไฝ่ฆๅๆง้ฎ้ข ่ฎฟ้ฎ่
ๆจกๅผ็ๅบๆฌๅทฅไฝๅ็ๆฏ๏ผๅจ่ขซ่ฎฟ้ฎ็็ฑป้้ขๅ ไธไธชๅฏนๅคๆไพๆฅๅพ
่ฎฟ้ฎ่
็ๆฅๅฃ ่ฎฟ้ฎ่
ๆจกๅผๅบ็จๅบๆฏๆฏ๏ผ้่ฆๅฏนไธไธชๅฏน่ฑก็ปๆไธญ็ๅฏน่ฑก่ฟ่กๅพๅคไธๅๆไฝ๏ผ่ฟไบๆไฝๅฝผๆญคๆฒกๆๅ
ณ่๏ผ๏ผๅๆถ้่ฆ้ฟๅ
่ฎฉ่ฟไบๆไฝโๆฑกๆโ่ฟไบๅฏน่ฑก็็ฑป๏ผๅฏไปฅ้็จ่ฎฟ้ฎ่
ๆจกๅผ่งฃๅณ ่ฎฟ้ฎ่
ๆจกๅผ็ๅ็็ฑปๅพ ่ฎฟ้ฎ่
ๆจกๅผ็ๅ็็ฑปๅพ ่ฎฟ้ฎ่
ๆจกๅผ็่ง่ฒๅ่่ดฃ Visitor๏ผๆฏๆฝ่ฑก่ฎฟ้ฎ่
๏ผไธบ่ฏฅๅฏน่ฑก็ปๆไธญ็ConcreteElement็ๆฏไธไธช็ฑปๅฃฐๆไธไธชvisitๆไฝ ConcreteVisitor๏ผๆฏไธไธชๅ
ทไฝ็่ฎฟ้ฎๅผ๏ผๅฎ็ฐๆฏไธไธชๆVisitorๅฃฐๆ็ๆไฝ๏ผๆฏๆฏไธชๆไฝๅฎ็ฐ็้จๅ ObjectStructure๏ผ่ฝๆไธพๅฎ็ๅ
็ด ๏ผๅฏไปฅๆไพไธไธช้ซๅฑ็ๆฅๅฃ๏ผ็จๆฅๅ
่ฎธ่ฎฟ้ฎ่
่ฎฟ้ฎๅ
็ด Element๏ผๅฎไนไธไธชacceptๆนๆณ๏ผๆฅๆถไธไธช่ฎฟ้ฎ่
ๅฏน่ฑก ConcreteElementไธบๅ
ทไฝๅ
็ด ๏ผๅฎ็ฐไบacceptๆนๆณ ่ฎฟ้ฎ่
ๆจกๅผๅบ็จๅฎไพ ่ฎฟ้ฎ่
ๆจกๅผๅบ็จๅฎไพ public abstract class Action { //ๅพๅฐ็ทๆง ็ๆต่ฏ public abstract void getManResult(Man man); //ๅพๅฐๅฅณ็ ๆต่ฏ public abstract void getWomanResult(Woman woman); } public class Fail extends Action { @Override public void getManResult(Man man) { // TODO Auto-generated method stub System.out.println(\" ็ทไบบ็ป็่ฏไปท่ฏฅๆญๆๅคฑ่ดฅ !\"); } @Override public void getWomanResult(Woman woman) { // TODO Auto-generated method stub System.out.println(\" ๅฅณไบบ็ป็่ฏไปท่ฏฅๆญๆๅคฑ่ดฅ !\"); } } public abstract class Person { //ๆไพไธไธชๆนๆณ๏ผ่ฎฉ่ฎฟ้ฎ่
ๅฏไปฅ่ฎฟ้ฎ public abstract void accept(Action action); } public class Man extends Person { @Override public void accept(Action action) { // TODO Auto-generated method stub action.getManResult(this); } } //่ฏดๆ //1. ่ฟ้ๆไปฌไฝฟ็จๅฐไบๅๅๆดพ, ๅณ้ฆๅ
ๅจๅฎขๆท็ซฏ็จๅบไธญ๏ผๅฐๅ
ทไฝ็ถๆไฝไธบๅๆฐไผ ้Womanไธญ(็ฌฌไธๆฌกๅๆดพ) //2. ็ถๅWoman ็ฑป่ฐ็จไฝไธบๅๆฐ็ \"ๅ
ทไฝๆนๆณ\" ไธญๆนๆณgetWomanResult, ๅๆถๅฐ่ชๅทฑ(this)ไฝไธบๅๆฐ // ไผ ๅ
ฅ๏ผๅฎๆ็ฌฌไบๆฌก็ๅๆดพ public class Woman extends Person{ @Override public void accept(Action action) { // TODO Auto-generated method stub action.getWomanResult(this); } } public class Success extends Action { @Override public void getManResult(Man man) { // TODO Auto-generated method stub System.out.println(\" ็ทไบบ็ป็่ฏไปท่ฏฅๆญๆๅพๆๅ !\"); } @Override public void getWomanResult(Woman woman) { // TODO Auto-generated method stub System.out.println(\" ๅฅณไบบ็ป็่ฏไปท่ฏฅๆญๆๅพๆๅ !\"); } } import java.util.LinkedList; import java.util.List; //ๆฐๆฎ็ปๆ๏ผ็ฎก็ๅพๅคไบบ๏ผMan , Woman๏ผ public class ObjectStructure { //็ปดๆคไบไธไธช้ๅ private List\u003cPerson\u003e persons = new LinkedList\u003c\u003e(); //ๅขๅ ๅฐlist public void attach(Person p) { persons.add(p); } //็งป้ค public void detach(Person p) { persons.remove(p); } //ๆพ็คบๆต่ฏๆ
ๅต public void display(Action action) { for(Person p: persons) { p.accept(action); } } } public class Wait extends Action { @Override public void getManResult(Man man) { // TODO Auto-generated method stub System.out.println(\" ็ทไบบ็ป็่ฏไปทๆฏ่ฏฅๆญๆๅพ
ๅฎ ..\"); } @Override public void getWomanResult(Woman woman) { // TODO Auto-generated method stub System.out.println(\" ๅฅณไบบ็ป็่ฏไปทๆฏ่ฏฅๆญๆๅพ
ๅฎ ..\"); } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅๅปบObjectStructure ObjectStructure objectStructure = new ObjectStructure(); objectStructure.attach(new Man()); objectStructure.attach(new Woman()); //ๆๅ Success success = new Success(); objectStructure.display(success); System.out.println(\"===============\"); Fail fail = new Fail(); objectStructure.display(fail); System.out.println(\"=======็ป็ๆฏๅพ
ๅฎ็ๆต่ฏ========\"); Wait wait = new Wait(); objectStructure.display(wait); } } ๅบ็จๅฎไพๅฐ็ป ไธ้ขๆๅฐไบๅๅๆดพ๏ผๆ่ฐๅๅๆดพๆฏๆไธ็ฎก็ฑปๆไนๅๅ๏ผๆไปฌ้ฝ่ฝๆพๅฐๆๆ็ๆนๆณ่ฟ่กใ ๅๅๆดพๆๅณ็ๅพๅฐๆง่ก็ๆไฝๅๅณไบ่ฏทๆฑ็็ง็ฑปๅไธคไธชๆฅๆถ่
็็ฑปๅ ๅฏนไบไปฅไธๅฎไพไธบไพ๏ผๅ่ฎพๆไปฌ่ฆๆทปๅ ไธไธชWait็็ถๆ็ฑป๏ผ่ๅฏMan็ฑปๅWoman็ฑป็ๅๅบ๏ผ็ฑไบไฝฟ็จไบๅๅๆดพ๏ผๅช้ๅขๅ ไธไธชActionๅญ็ฑปๅณๅฏๅจๅฎขๆท็ซฏ่ฐ็จๅณๅฏ๏ผไธ้่ฆๆนๅจไปปไฝๅ
ถไป็ฑป็ไปฃ็ ใ ่ฎฟ้ฎ่
ๆจกๅผ็ๆณจๆไบ้กนๅ็ป่ ่ฎฟ้ฎ่
ๆจกๅผ ไผ็น ่ฎฟ้ฎ่
ๆจกๅผ็ฌฆๅๅไธ่่ดฃๅๅ๏ผ่ฎฉ็จๅบๅ
ทๆไผ็ง็ๆฉๅฑๆงใ็ตๆดปๆง้ๅธธ้ซ ่ฎฟ้ฎ่
ๆจกๅผๅฏไปฅๅฏนๅ่ฝ่ฟ่ก็ปไธ๏ผๅฏไปฅๅๆฅ่กจใUIใๆฆๆชๅจไธ่ฟๆปคๅจ๏ผ้็จไบๆฐๆฎ็ปๆ็ธๅฏน็จณๅฎ็็ณป็ป ็ผบ็น ๅ
ทไฝๅ
็ด ๅฏน่ฎฟ้ฎ่
ๅ
ฌๅธ็ป่๏ผไนๅฐฑๆฏ่ฏด่ฎฟ้ฎ่
ๅ
ณๆณจไบๅ
ถไป็ฑป็ๅ
้จ็ป่๏ผ่ฟๆฏ่ฟช็ฑณ็นๆณๅๆไธๅปบ่ฎฎ็๏ผ่ฟๆ ทๅฐฑ้ ๆไบๅ
ทไฝๅ
็ด ๅๆดๆฏ่พๅฐ้พ ่ฟ่ไบไพ่ตๅ่ฝฌๅๅใ่ฎฟ้ฎ่
ไพ่ต็ๆฏๅ
ทไฝๅ
็ด ๏ผ่ไธๆฏๆฝ่ฑกๅ
็ด ๅ ๆญค๏ผๅฆๆไธไธช็ณป็ปๆๆฏ่พ็จณๅฎ็ๆฐๆฎ็ปๆ๏ผๅๆ็ปๅธธๅๅ็ๅ่ฝ้ๆฑ๏ผ้ฃไน่ฎฟ้ฎ่
ๆจกๅผๅฐฑๆฏๆฏ่พๅ้็ ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:16","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่ฟญไปฃๅจๆจกๅผ ๅญฆๆ ก้ข็ณปๅฑ็คบ็ณป็ป ็ผๅ็จๅบๅฑ็คบไธไธชๅญฆๆ ก้ข็ณป็ปๆ๏ผ่ฆๆฑๅจไธไธช้กต้ขไธญๅฑ็คบๅบๅญฆๆ ก็้ข็ณป็ปๆ๏ผไธไธชๅญฆๆ กๆๅคไธชๅญฆ้ข๏ผไธไธชๅญฆ้ขๆๅคไธช็ณปใๅ่ฝๅฑ็คบๅฆไธๆ็คบใ ๅญฆๆ ก้ข็ณปๆๆ ไผ ็ป็่ฎพ่ฎกๆนๆก ๅญฆๆ ก้ข็ณปๆๆไผ ็ป่ฎพ่ฎกๆนๆก ไผ ็ปๆนๅผ็้ฎ้ขๅๆ ๅฐๅญฆ้ข็ๅๆฏๅญฆๆ ก็ๅญ็ฑป๏ผ็ณปๆฏๅญฆ้ข็ๅญ็ฑป๏ผ่ฟๆ ทๅฎ้
ไธๆฏ็ซๅจ็ป็ปๅคงๅฐๆฅ่ฟ่กๅๅฑๆฌก็ ๅฎ้
ไธๆไปฌ็้ๆฑๆฏ๏ผๅจไธไธช้กต้ขไธญๅฑ็คบๅบๅญฆๆ ก็้ข็ณป็ปๆ๏ผไธไธชๅญฆๆ กๆๅคไธชๅญฆ้ข๏ผไธไธชๅญฆ้ขๆๅคไธช็ณป๏ผๅ ๆญค่ฟ็งๆนๆก๏ผไธ่ฝๅพๅฅฝๅฎ็ฐ้ๅ็ๆไฝ ่งฃๅณๆนๆก -\u003e ่ฟญไปฃๅจๆจกๅผ ่ฟญไปฃๅจๆจกๅผ ๅบๆฌไป็ป ่ฟญไปฃๅจๆจกๅผ๏ผIterator Pattern๏ผๆฏๅธธ็จ็่ฎพ่ฎกๆจกๅผ๏ผๅฑไบ่กไธบๅๆจกๅผ ๅฆๆๆไปฌ็้ๅๅ
็ด ไฝฟ็จไธๅ็ๆนๅผๅฎ็ฐ๏ผๆๆฐ็ป๏ผ่ฟๆJava็้ๅ็ฑป๏ผๆ่
่ฟๆๅ
ถไปๆนๅผ๏ผๅฝๅฎขๆท็ซฏ่ฆ้ๅ่ฟไบ้ๅๅ
็ด ็ๆถๅๅฐฑ่ฆไฝฟ็จๅค็ง้ๅๆนๅผ๏ผ่ไธ่ฟไผๆด้ฒๅ
็ด ็ๅ
้จ็ปๆ๏ผๅฏไปฅ่่ไฝฟ็จ่ฟญไปฃๅจๆจกๅผ่งฃๅณ ่ฟญไปฃๅจๆจกๅผ๏ผๆไพไธ็ง้ๅ้ๅๅ
็ด ็็ปไธๆฅๅฃ๏ผ็จไธ่ด็ๆนๅผ้ๅ้ๅๅ
็ด ๏ผไธ้่ฆ็ฅ้้ๅๅฏน่ฑก็ๅบๅฑ่กจ็คบ๏ผๅณ๏ผไธๆด้ฒๅ
ถๅ
้จ็็ปๆ ่ฟญไปฃๅจๆจกๅผๅ็็ฑปๅพ ่ฟญไปฃๅจๆจกๅผ็่ง่ฒๅ่่ดฃ Iterator๏ผ่ฟญไปฃๅจๆฅๅฃ๏ผๆฏ็ณป็ปๆไพ๏ผๅซไน hasNext๏ผnext๏ผremove ConcreteIterator๏ผๅ
ทไฝ็่ฟญไปฃๅจ็ฑป๏ผ็ฎก็่ฟญไปฃ Aggregate๏ผไธไธช็ปไธ็่ๅๆฅๅฃ๏ผๅฐๅฎขๆท็ซฏๅๅ
ทไฝ่ๅ่งฃ่ฆ ConcreteAggreage๏ผๅ
ทไฝ็่ๅๆๆๅฏน่ฑก้ๅ๏ผๅนถๆไพไธไธชๆนๆณ๏ผ่ฟๅไธไธช่ฟญไปฃๅจ๏ผ่ฏฅ่ฟญไปฃๅจๅฏไปฅๆญฃ็กฎ้ๅ้ๅ Client๏ผๅฎขๆท็ซฏ๏ผ้่ฟ Iterator ๅ Aggregate ไพ่ตๅญ็ฑป ่ฟญไปฃๅจๆจกๅผๅบ็จๅฎไพ ่ฟญไปฃๅจๆจกๅผๅบ็จๅฎไพ import java.util.Iterator; public interface College { public String getName(); //ๅขๅ ็ณป็ๆนๆณ public void addDepartment(String name, String desc); //่ฟๅไธไธช่ฟญไปฃๅจ,้ๅ public Iterator createIterator(); } public class Department { private String name; private String desc; public Department(String name, String desc) { super(); this.name = name; this.desc = desc; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } import java.util.Iterator; import java.util.List; public class OutPutImpl { //ๅญฆ้ข้ๅ List\u003cCollege\u003e collegeList; public OutPutImpl(List\u003cCollege\u003e collegeList) { this.collegeList = collegeList; } //้ๅๆๆๅญฆ้ข,็ถๅ่ฐ็จprintDepartment ่พๅบๅไธชๅญฆ้ข็็ณป public void printCollege() { //ไปcollegeList ๅๅบๆๆๅญฆ้ข, Java ไธญ็ List ๅทฒ็ปๅฎ็ฐIterator Iterator\u003cCollege\u003e iterator = collegeList.iterator(); while(iterator.hasNext()) { //ๅๅบไธไธชๅญฆ้ข College college = iterator.next(); System.out.println(\"=== \"+college.getName() +\"=====\" ); printDepartment(college.createIterator()); //ๅพๅฐๅฏนๅบ่ฟญไปฃๅจ } } //่พๅบ ๅญฆ้ข่พๅบ ็ณป public void printDepartment(Iterator iterator) { while(iterator.hasNext()) { Department d = (Department)iterator.next(); System.out.println(d.getName()); } } } import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class InfoCollege implements College { List\u003cDepartment\u003e departmentList; public InfoCollege() { departmentList = new ArrayList\u003cDepartment\u003e(); addDepartment(\"ไฟกๆฏๅฎๅ
จไธไธ\", \" ไฟกๆฏๅฎๅ
จไธไธ \"); addDepartment(\"็ฝ็ปๅฎๅ
จไธไธ\", \" ็ฝ็ปๅฎๅ
จไธไธ \"); addDepartment(\"ๆๅกๅจๅฎๅ
จไธไธ\", \" ๆๅกๅจๅฎๅ
จไธไธ \"); } @Override public String getName() { // TODO Auto-generated method stub return \"ไฟกๆฏๅทฅ็จๅญฆ้ข\"; } @Override public void addDepartment(String name, String desc) { // TODO Auto-generated method stub Department department = new Department(name, desc); departmentList.add(department); } @Override public Iterator createIterator() { // TODO Auto-generated method stub return new InfoColleageIterator(departmentList); } } import java.util.Iterator; import java.util.List; public class InfoColleageIterator implements Iterator { List\u003cDepartment\u003e departmentList; // ไฟกๆฏๅทฅ็จๅญฆ้ขๆฏไปฅListๆนๅผๅญๆพ็ณป int index = -1;//็ดขๅผ public InfoColleageIterator(List\u003cDepartment\u003e departmentList) { this.departmentList = departmentList; } //ๅคๆญlistไธญ่ฟๆๆฒกๆไธไธไธชๅ
็ด @Override public boolean hasNext() { // TODO Auto-generated method stub if(index \u003e= departmentList.size() - 1) { return false; } else { index += 1; return true; } } @Override public Object next() { // TODO Auto-generated method stub return departmentList.get(index); } //็ฉบๅฎ็ฐremove public void remove() { } } import java.util.Iterator; public class ComputerCollege implements College { Department[] departments; int numOfDepartment = 0 ;// ไฟๅญๅฝๅๆฐ็ป็ๅฏน่ฑกไธชๆฐ public ComputerCollege() { departments = new Department[5]; addDepartment(\"Javaไธไธ\", \" Javaไธไธ \"); addDepartment(\"PHPไธไธ\", \" PHPไธไธ \"); addDepartment(\"ๅคงๆฐๆฎไธไธ\", \" ๅคงๆฐๆฎไธไธ \"); } @Override public String getName() { // TODO Auto-generated method stub return \"่ฎก็ฎๆบๅญฆ้ข\"; } @Override public void addDepartment(String name, String desc) { // TODO Auto-generated method stub Department department = new Department(name, desc); departments[numOfDepartment] = department; numOfDepartment += 1; } @Override public Iterator createIterator() { // TODO Auto-generated ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:17","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่งๅฏ่
ๆจกๅผ ๅคฉๆฐ้ขๆฅ้กน็ฎ ๅ
ทไฝ้ๆฑๅฆไธ๏ผ ๆฐ่ฑก็ซๅฏไปฅๅฐๆฏๅคฉๆต้ๅฐ็ๆธฉๅบฆใๆนฟๅบฆใๆฐๅ็ญ็ญไปฅๅ
ฌๅ็ๅฝขๅผๅๅธๅบๅป๏ผๆฏๅฆๅๅธๅฐ่ชๅทฑ็็ฝ็ซๆ็ฌฌไธๆน๏ผ ้่ฆ่ฎพ่ฎกๅผๆพๅAPI๏ผไพฟไบๅ
ถไป็ฌฌไธๆนไน่ฝๆฅๅ
ฅๆฐ่ฑก็ซ่ทๅๆฐๆฎ ๆไพๆธฉๅบฆใๆฐๅๅๆนฟๅบฆ็ๆฅๅฃ ๆต้ๆฐๆฎๆดๆฐๆถ๏ผ่ฆ่ฝๅฎๆถ็้็ฅ็ป็ฌฌไธๆน ไผ ็ปๆนๆก ้่ฟๅฏนๆฐ่ฑก็ซ้กน็ฎ็ๅๆ๏ผๆไปฌๅฏไปฅๅๆญฅ่ฎพ่ฎกๅบไธไธชWeatherData็ฑป weather ่ฏดๆ๏ผ ้่ฟgetXxxๆนๆณ๏ผๅฏไปฅ่ฎฉ็ฌฌไธๆนๆฅๅ
ฅ๏ผๅนถๅพๅฐ็ธๅ
ณไฟกๆฏ ๅฝๆฐๆฎๆๆดๆฐๆถ๏ผๆฐ่ฑก็ซ้่ฟ่ฐ็จ dataChange() ๅปไธชๆดๆฐๆฐๆฎ๏ผๅฝ็ฌฌไธๆนๅๆฌก่ทๅๆถ๏ผๅฐฑ่ฝๅพๅฐๆๆฐๆฐๆฎ๏ผๅฝ็ถไนๅฏไปฅๆจ้ ่งฃๅณ็คบๆๅพ๏ผ ่งฃๅณ็คบๆๅพ่งฃๅณ็คบๆๅพ CurrentConditions(ๅฝๅ็ๅคฉๆฐๆ
ๅต) ๅฏไปฅ็่งฃๆๆฏๆไปฌๆฐ่ฑกๅฑ็็ฝ็ซ // ๆจ้ /** * ๆพ็คบๅฝๅๅคฉๆฐๆ
ๅต๏ผๅฏไปฅ็่งฃๆๆฏๆฐ่ฑก็ซ่ชๅทฑ็็ฝ็ซ๏ผ * @author Administrator * */ public class CurrentConditions { // ๆธฉๅบฆ๏ผๆฐๅ๏ผๆนฟๅบฆ private float temperature; private float pressure; private float humidity; //ๆดๆฐ ๅคฉๆฐๆ
ๅต๏ผๆฏ็ฑ WeatherData ๆฅ่ฐ็จ๏ผๆไฝฟ็จๆจ้ๆจกๅผ public void update(float temperature, float pressure, float humidity) { this.temperature = temperature; this.pressure = pressure; this.humidity = humidity; display(); } //ๆพ็คบ public void display() { System.out.println(\"***Today mTemperature: \" + temperature + \"***\"); System.out.println(\"***Today mPressure: \" + pressure + \"***\"); System.out.println(\"***Today mHumidity: \" + humidity + \"***\"); } } /** * ็ฑปๆฏๆ ธๅฟ * 1. ๅ
ๅซๆๆฐ็ๅคฉๆฐๆ
ๅตไฟกๆฏ * 2. ๅซๆ CurrentConditions ๅฏน่ฑก * 3. ๅฝๆฐๆฎๆๆดๆฐๆถ๏ผๅฐฑไธปๅจ็่ฐ็จ CurrentConditionsๅฏน่ฑกupdateๆนๆณ(ๅซ display), ่ฟๆ ทไปไปฌ๏ผๆฅๅ
ฅๆน๏ผๅฐฑ็ๅฐๆๆฐ็ไฟกๆฏ * @author Administrator * */ public class WeatherData { private float temperatrue; private float pressure; private float humidity; private CurrentConditions currentConditions; //ๅ ๅ
ฅๆฐ็็ฌฌไธๆน public WeatherData(CurrentConditions currentConditions) { this.currentConditions = currentConditions; } public float getTemperature() { return temperatrue; } public float getPressure() { return pressure; } public float getHumidity() { return humidity; } public void dataChange() { //่ฐ็จ ๆฅๅ
ฅๆน็ update currentConditions.update(getTemperature(), getPressure(), getHumidity()); } //ๅฝๆฐๆฎๆๆดๆฐๆถ๏ผๅฐฑ่ฐ็จ setData public void setData(float temperature, float pressure, float humidity) { this.temperatrue = temperature; this.pressure = pressure; this.humidity = humidity; //่ฐ็จdataChange๏ผ ๅฐๆๆฐ็ไฟกๆฏ ๆจ้็ป ๆฅๅ
ฅๆน currentConditions dataChange(); } } public class Client { public static void main(String[] args) { //ๅๅปบๆฅๅ
ฅๆน currentConditions CurrentConditions currentConditions = new CurrentConditions(); //ๅๅปบ WeatherData ๅนถๅฐ ๆฅๅ
ฅๆน currentConditions ไผ ้ๅฐ WeatherDataไธญ WeatherData weatherData = new WeatherData(currentConditions); //ๆดๆฐๅคฉๆฐๆ
ๅต weatherData.setData(30, 150, 40); //ๅคฉๆฐๆ
ๅตๅๅ System.out.println(\"============ๅคฉๆฐๆ
ๅตๅๅ=============\"); weatherData.setData(40, 160, 20); } } ไผ ็ปๆนๆก้ฎ้ขๅๆ ๅ
ถไป็ฌฌไธๆนๆฅๅ
ฅๆฐ่ฑก็ซ่ทๅๆฐๆฎ็้ฎ้ข ๆ ๆณๅจ่ฟ่กๆถๅจๆ็ๆทปๅ ็ฌฌไธๆน๏ผๆฐๆตช็ฝ็ซ๏ผ ่ฟๅ OCP ๅๅ -\u003e ่งๅฏ่
ๆจกๅผ // ๅจWeatherDataไธญ๏ผๅฝๅขๅ ไธไธช็ฌฌไธๆน๏ผ้ฝ้่ฆๅๅปบไธไธชๅฏนๅบ็็ฌฌไธๆน็ๅ
ฌๅๆฟๅฏน่ฑก๏ผๅนถๅ ๅ
ฅๅฐdataChange๏ผไธๅฉไบ็ปดๆคไนไธๆฏๅจๆๅ ๅ
ฅ public void dataChange(){ currentConditions.update(getTemperature,getPressure,getHumidity()); } ่งๅฏ่
ๆจกๅผ ๅบๆฌไป็ป ่งๅฏ่
ๆจกๅผ๏ผObserver Pattern๏ผ๏ผๆๅคไธชๅฏน่ฑก้ดๅญๅจไธๅฏนๅค็ไพ่ตๅ
ณ็ณป๏ผๅฝไธไธชๅฏน่ฑก็็ถๆๅ็ๆนๅๆถ๏ผๆๆไพ่ตไบๅฎ็ๅฏน่ฑก้ฝๅพๅฐ้็ฅๅนถ่ขซ่ชๅจๆดๆฐใ่ฟ็งๆจกๅผๆๆถๅ็งฐไฝๅๅธ-่ฎข้
ๆจกๅผใๆจกๅ-่งๅพๆจกๅผ๏ผๅฎๆฏๅฏน่ฑก่กไธบๅๆจกๅผใ ่งๅฏ่
ๆจกๅผๅ็ ่งๅฏ่
ๆจกๅผๅ็-Subject ่งๅฏ่
ๆจกๅผ็่ง่ฒๅ่่ดฃ ่งๅฏ่
ๆจกๅผ็ฑปไผผ็จๆท่ฎข่ดญ็ๅฅถไธๅก ๅฅถ็ซ๏ผSubject ็จๆท๏ผObserver Subject๏ผ็ป่ฎฐๆณจๅใ็งป้คๅ้็ฅ registerObserver ๆณจๅ removeObserver ็งป้ค notifyObserver ้็ฅๆๆ็ๆณจๅ็จๆท๏ผๆ นๆฎไธๅ็้ๆฑ๏ผๅฏไปฅๆฏๆดๆฐๆฐๆฎ๏ผ่ฎฉ็จๆทๆฅๅ๏ผไนๅฏ่ฝๆฏๅฎๆฝๆจ้๏ผๆ นๆฎๅ
ทไฝ้ๆฑๅฎ Observer๏ผๆฅๆถ่พๅ
ฅ ่งๅฏ่
ๆจกๅผ๏ผๅฏน่ฑกไน้ดๅคๅฏนไธไพ่ต็ไธ็ง่ฎพ่ฎกๆนๆก๏ผ่ขซไพ่ต็ๅฏน่ฑกไธบ Subject๏ผไพ่ต็ๅฏน่ฑกไธบ Observer๏ผSubject ้็ฅ Observer ๅๅ๏ผๆฏๅฆ่ฟ้็ๅฅถ็ซๆฏ Subject๏ผๆฏโ1โ็ไธๆน๏ผ็จๆทๆฏ Observer๏ผๆฏโๅคโ็ไธๆน ่งๅฏ่
ๆจกๅผๅบ็จๅฎไพ ่งๅฏ่
ๆจกๅผ่งฃๅณๅคฉๆฐ้ขๆฅ้ๆฑ ่งๅฏ่
ๆจกๅผ่งฃๅณๅคฉๆฐ้ขๆฅ้ๆฑ็ฑปๅพ //่งๅฏ่
ๆฅๅฃ๏ผๆ่งๅฏ่
ๆฅๅฎ็ฐ public interface Observer { public void update(float temperature, float pressure, float humidity); } //ๆฅๅฃ, ่ฎฉWeatherData ๆฅๅฎ็ฐ public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObservers(); } import java.util.ArrayList; /** * ็ฑปๆฏๆ ธๅฟ * 1. ๅ
ๅซๆๆฐ็ๅคฉๆฐๆ
ๅตไฟกๆฏ * 2. ๅซๆ ่งๅฏ่
้ๅ๏ผไฝฟ็จArrayList็ฎก็ * 3. ๅฝๆฐๆฎๆๆดๆฐๆถ๏ผๅฐฑไธปๅจ็่ฐ็จ ArrayList, ้็ฅๆๆ็๏ผๆฅๅ
ฅๆน๏ผๅฐฑ็ๅฐๆๆฐ็ไฟกๆฏ * @author Administrator * */ public class WeatherData implements Subject { private float temperatrue; private float pressure; private float humidity; //่งๅฏ่
้ๅ private ArrayList\u003cObserver\u003e observers; //ๅ ๅ
ฅๆฐ็็ฌฌไธๆน public WeatherData() { observers = new ArrayList\u003cObserver\u003e(); } public float getTemperature() { return temperatrue; } public float getPressure() { return pressure; } public float getHumidity() { return humidity; } public void dataChange() { //่ฐ็จ ๆฅๅ
ฅๆน็ update notifyObservers(); } //ๅฝๆฐๆฎๆๆดๆฐๆถ๏ผๅฐฑ่ฐ็จ setData public void setData(float","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:18","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ไธญไป่
ๆจกๅผ ๆบ่ฝๅฎถๅบญ็ฎก็็ณป็ป ้กน็ฎ้ๆฑ๏ผ ๆบ่ฝๅฎถๅบญๅ
ๆฌๅ็ง่ฎพๅค๏ผ้น้ใๅๅกๆบใ็ต่งๆบใ็ชๅธ็ญ ไธปไบบ่ฆ็็ต่งๆถ๏ผๅไธช่ฎพๅคๅฏไปฅๅๅๅทฅไฝ๏ผ่ชๅจๅฎๆ็็ต่ง็ๅๅคๅทฅไฝ๏ผๆฏๅฆๆต็จไธบ๏ผ้น้ๅ่ตท -\u003e ๅๅกๆบๅผๅงๅๅๅก -\u003e ็ชๅธ่ชๅจ่ฝไธ -\u003e ็ต่งๆบๅผๅงๆญๆพ ไผ ็ปๆนๆก ไผ ็ป่ฎพ่ฎกๆนๆก็ฑปๅพ ไผ ็ป่ฎพ่ฎกๆนๆก้ฎ้ขๅๆ ๅฝๅ็ตๅจๅฏน่ฑกๆๅค็ง็ถๆๆนๅๆถ๏ผ็ธไบไน้ด็่ฐ็จๅ
ณ็ณปไผๆฏ่พๅคๆ ๅไธช็ตๅจๅฏน่ฑกๅฝผๆญค่็ณป๏ผไฝ ไธญๆๆ๏ผๆไธญๆไฝ ๏ผไธๅฉไบๆพ่ฆๅ ๅไธช็ตๅจๅฏน่ฑกไน้ดๆไผ ้็ๆถๆฏ๏ผๅๆฐ๏ผ๏ผๅฎนๆๆททไนฑ ๅฝ็ณป็ปๅขๅ ไธไธชๆฐ็็ตๅจๅฏน่ฑกๆถ๏ผๆ่
ๆง่กๆต็จๆนๅๆถ๏ผไปฃ็ ็ๅฏ็ปดๆคๆงใๆฉๅฑๆง้ฝไธ็ๆณ -\u003e ่ฟๆถๅฏไปฅ่่ไธญไป่
ๆจกๅผ ไธญไป่
ๆจกๅผ ๅบๆฌไป็ป ไธญไป่
ๆจกๅผ๏ผMediator Pattern๏ผ๏ผ็จไธไธชไธญไป่
ๅฏน่ฑกๅฐ่ฃ
ไธ็ณปๅ็ๅฏน่ฑกไบคไบใไธญไป่
ไฝฟๅไธชๅฏน่ฑกไธ้่ฆๆพๅผๅฐ็ธไบๅผ็จ๏ผไป่ไฝฟๅ
ถ่ฆๅๆพๆฃ๏ผ่ไธๅฏไปฅ็ฌ็ซๅฐๆนๅๅฎไปฌไน้ด็ไบคไบ ไธญไป่
ๆจกๅผๅฑไบ่กไธบๅๆจกๅผ๏ผไฝฟไปฃ็ ๆไบ็ปดๆค ๆฏๅฆ MVC ๆจกๅผ๏ผC๏ผController ๆงๅถๅจ๏ผๆฏ M๏ผModel ๆจกๅ๏ผๅ V๏ผView ่งๅพ๏ผ็ไธญไป่
๏ผๅจๅๅ็ซฏไบคไบๆถ่ตทๅฐไบไธญ้ดไบบ็ไฝ็จ ไธญไป่
ๆจกๅผๅ็็ฑปๅพ ไธญไป่
ๆจกๅผๅ็็ฑปๅพ ไธญไป่
ๆจกๅผไธญ่ง่ฒๅ่่ดฃ Mediator ๅฐฑๆฏๆฝ่ฑกไธญไป่
๏ผๅฎไนไบๅไบๅฏน่ฑกๅฐไธญไป่
ๅฏน่ฑก็ๆฅๅฃ Colleague ๆฏๆฝ่ฑกๅไบ็ฑป ConcreteMediator ๅ
ทไฝ็ไธญไป่
ๅฏน่ฑก๏ผๅฎ็ฐๆฝ่ฑกๆนๆณ๏ผๅฎ้่ฆ็ฅ้ๆๆ็ๅ
ทไฝๅไบ็ฑป๏ผๅณไปฅไธไธช้ๅๆฅ็ฎก็HashMap๏ผๅนถๆฅๅๆไธชๅไบๅฏน่ฑกๆถๆฏ๏ผๅฎๆ็ธๅบ็ไปปๅก ConcreteColleague ๅ
ทไฝ็ๅไบ็ฑป๏ผไผๆๅพๅค๏ผๆฏไธชๅไบๅช็ฅ้่ชๅทฑ็่กไธบ๏ผ่ไธไบ่งฃๅ
ถไปๅไบ็ฑป็่กไธบ๏ผๆนๆณ๏ผ๏ผไฝๆฏๅฎไปฌ้ฝไพ่ตไธญไป่
ๅฏน่ฑก ไธญไป่
ๆจกๅผๅบ็จๅฎไพ ไธญไป่
ๆจกๅผ่งฃๅณๆบ่ฝๅฎถๅบญ็ฎก็็ฑปๅพ public abstract class Mediator { //ๅฐ็ปไธญไป่
ๅฏน่ฑก๏ผๅ ๅ
ฅๅฐ้ๅไธญ public abstract void Register(String colleagueName, Colleague colleague); //ๆฅๆถๆถๆฏ, ๅ
ทไฝ็ๅไบๅฏน่ฑกๅๅบ public abstract void GetMessage(int stateChange, String colleagueName); public abstract void SendMessage(); } //ๅไบๆฝ่ฑก็ฑป public abstract class Colleague { private Mediator mediator; public String name; public Colleague(Mediator mediator, String name) { this.mediator = mediator; this.name = name; } public Mediator GetMediator() { return this.mediator; } public abstract void SendMessage(int stateChange); } //ๅ
ทไฝ็ๅไบ็ฑป public class Alarm extends Colleague { //ๆ้ ๅจ public Alarm(Mediator mediator, String name) { super(mediator, name); // TODO Auto-generated constructor stub //ๅจๅๅปบAlarm ๅไบๅฏน่ฑกๆถ๏ผๅฐ่ชๅทฑๆพๅ
ฅๅฐConcreteMediator ๅฏน่ฑกไธญ[้ๅ] mediator.Register(name, this); } public void SendAlarm(int stateChange) { SendMessage(stateChange); } @Override public void SendMessage(int stateChange) { // TODO Auto-generated method stub //่ฐ็จ็ไธญไป่
ๅฏน่ฑก็getMessage this.GetMediator().GetMessage(stateChange, this.name); } } public class TV extends Colleague { public TV(Mediator mediator, String name) { super(mediator, name); // TODO Auto-generated constructor stub mediator.Register(name, this); } @Override public void SendMessage(int stateChange) { // TODO Auto-generated method stub this.GetMediator().GetMessage(stateChange, this.name); } public void StartTv() { // TODO Auto-generated method stub System.out.println(\"It's time to StartTv!\"); } public void StopTv() { // TODO Auto-generated method stub System.out.println(\"StopTv!\"); } } public class Curtains extends Colleague { public Curtains(Mediator mediator, String name) { super(mediator, name); // TODO Auto-generated constructor stub mediator.Register(name, this); } @Override public void SendMessage(int stateChange) { // TODO Auto-generated method stub this.GetMediator().GetMessage(stateChange, this.name); } public void UpCurtains() { System.out.println(\"I am holding Up Curtains!\"); } } import java.util.HashMap; //ๅ
ทไฝ็ไธญไป่
็ฑป public class ConcreteMediator extends Mediator { //้ๅ๏ผๆพๅ
ฅๆๆ็ๅไบๅฏน่ฑก private HashMap\u003cString, Colleague\u003e colleagueMap; private HashMap\u003cString, String\u003e interMap; public ConcreteMediator() { colleagueMap = new HashMap\u003cString, Colleague\u003e(); interMap = new HashMap\u003cString, String\u003e(); } @Override public void Register(String colleagueName, Colleague colleague) { // TODO Auto-generated method stub colleagueMap.put(colleagueName, colleague); // TODO Auto-generated method stub if (colleague instanceof Alarm) { interMap.put(\"Alarm\", colleagueName); } else if (colleague instanceof CoffeeMachine) { interMap.put(\"CoffeeMachine\", colleagueName); } else if (colleague instanceof TV) { interMap.put(\"TV\", colleagueName); } else if (colleague instanceof Curtains) { interMap.put(\"Curtains\", colleagueName); } } //ๅ
ทไฝไธญไป่
็ๆ ธๅฟๆนๆณ //1. ๆ นๆฎๅพๅฐๆถๆฏ๏ผๅฎๆๅฏนๅบไปปๅก //2. ไธญไป่
ๅจ่ฟไธชๆนๆณ๏ผๅ่ฐๅไธชๅ
ทไฝ็ๅไบๅฏน่ฑก๏ผๅฎๆไปปๅก @Override public void GetMessage(int stateChange, String colleagueName) { // TODO Auto-generated method stub //ๅค็้น้ๅๅบ็ๆถๆฏ if (colleagueMap.get(colleagueName) instanceof Alarm) { if (stateChange == 0) { ((CoffeeMachine) (colleagueMap.get(interMap .get(\"CoffeeMachine\")))).StartCoffee(); ((TV) (colleagueMap.get(interMap.get(\"TV\")))).StartTv(); } else if (stateChange == 1) { ((TV) (colleagueMap.get(","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:19","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"ๅคๅฟๅฝๆจกๅผ ๆธธๆ่ง่ฒ็ถๆๆขๅค้ฎ้ข ๆธธๆ่ง่ฒๆๆปๅปๅๅ้ฒๅพกๅ๏ผๅจๅคงๆBossๅไฟๅญ่ช่บซ็็ถๆ๏ผๆปๅปๅๅ้ฒๅพกๅ๏ผ๏ผๅฝๅคงๆBossๅๆปๅปๅๅ้ฒๅพกๅไธ้๏ผไปๅคๅฟๅฝๅฏน่ฑกๆขๅคๅฐๅคงๆๅ็็ถๆ ไผ ็ปๆนๆก ไผ ็ป็่ฎพ่ฎกๆนๆก๏ผ็ฑปๅพ๏ผ ไผ ็ปๆนๆก็้ฎ้ขๅๆ ไธไธชๅฏน่ฑก๏ผๅฐฑๅฏนๅบไธไธชไฟๅญๅฏน่ฑก็ถๆ็ๅฏน่ฑก๏ผ่ฟๆ ทๅฝๆไปฌๆธธๆ็ๅฏน่ฑกๅพๅคๆถ๏ผไธๅฉไบ็ฎก็๏ผๅผ้ไนๅพๅคง ไผ ็ป็ๆนๅผๆฏ็ฎๅๅฐๅๅคไปฝ๏ผnewๅบๅฆไธไธชๅฏน่ฑกๅบๆฅ๏ผๅๆ้่ฆๅคไปฝ็ๆฐๆฎๆพๅฐ่ฟไธชๆฐๅฏน่ฑก๏ผไฝ่ฟๅฐฑๆด้ฒไบๅฏน่ฑกๅ
้จ็็ป่ ่งฃๅณๆนๆก -\u003e ๅคๅฟๅฝๆจกๅผ ๅคๅฟๅฝๆจกๅผ ๅบๆฌไป็ป ๅคๅฟๅฝๆจกๅผ๏ผMemento Pattern๏ผๅจไธ็ ดๅๅฐ่ฃ
ๆง็ๅๆไธ๏ผๆ่ทไธไธชๅฏน่ฑก็ๅ
้จ็ถๆ๏ผๅนถๅจ่ฏฅๅฏน่ฑกไนๅคไฟๅญ่ฟไธช็ถๆใ่ฟๆ ทไปฅๅๅฐฑๅฏๅฐ่ฏฅๅฏน่ฑกๆขๅคๅฐๅๅ
ไฟๅญ็็ถๆ ๅฏไปฅ่ฟๆ ท็่งฃๅคๅฟๅฝๆจกๅผ๏ผๆพ็คบ็ๆดปไธญ็ๅคๅฟๅฝๆฏ็จๆฅ่ฎฐๅฝๆไบ่ฆๅปๅ็ไบๆ
๏ผๆ่
ๆฏ่ฎฐๅฝๅทฒ็ป่พพๅฐ็ๅ
ฑๅๆ่ง็ไบๆ
๏ผไปฅ้ฒๅฟ่ฎฐไบใ่ๅจ่ฝฏไปถๅฑ้ข๏ผๅคๅฟๅฝๆจกๅผๆ็็ธๅ็ๅซไน๏ผๅคๅฟๅฝๅฏน่ฑกไธป่ฆ็จๆฅ่ฎฐๅฝไธไธชๅฏน่ฑก็ๆ็ง็ถๆ๏ผๆ่
ๆไบๆฐๆฎ๏ผๅฝ่ฆๅๅ้ๆถ๏ผๅฏไปฅไปๅคๅฟๅฝๅฏน่ฑก้่ทๅๅๆฅ็ๆฐๆฎ่ฟ่กๆขๅคๆไฝ ๅคๅฟๅฝๆจกๅผๅฑไบ่กไธบๅๆจกๅผ ๅคๅฟๅฝๆจกๅผๅ็ ๅคๅฟๅฝๆจกๅผๅ็็ฑปๅพ ๅคๅฟๅฝๆจกๅผไธญ่ง่ฒๅ่่ดฃ Originator๏ผๅฏน่ฑก๏ผ้่ฆไฟๅญ็ถๆ็ๅฏน่ฑก๏ผ Memento๏ผๅคๅฟๅฝๅฏน่ฑก๏ผ่ด่ดฃไฟๅญๅฅฝ่ฎฐๅฝใๅณ Originator ๅ
้จ็ถๆ Caretaker๏ผๅฎๆค่
ๅฏน่ฑก๏ผ่ด่ดฃไฟๅญๅคไธชๅคๅฟๅฝๅฏน่ฑก๏ผไฝฟ็จ้ๅ็ฎก็๏ผๆ้ซๆ็ ่ฏดๆ๏ผๅฆๆๅธๆไฟๅญๅคไธช Orifginator ๅฏน่ฑก็ไธๅๆถ้ด็็ถๆ๏ผไนๅฏไปฅ๏ผๅช้่ฆ HashMap\u003cString,้ๅ\u003e ้ๅฏนไธ้ข็ๅคๅฟๅฝๆจกๅผๅ็็ปๆๅพ๏ผๆไปฌไฝฟ็จไปฃ็ ็ฎๅๅฎ็ฐ๏ผๆณจๆไฝไผไฝ็ฐๅบ Caretaker ๅฏไปฅไฟๅญๅคไธชๅคๅฟๅฝๅฏน่ฑก๏ผๆนไพฟ็ฎก็๏ผๆ้ซๆ็ public class Originator { private String state;//็ถๆไฟกๆฏ public String getState() { return state; } public void setState(String state) { this.state = state; } //็ผๅไธไธชๆนๆณ๏ผๅฏไปฅไฟๅญไธไธช็ถๆๅฏน่ฑก Memento //ๅ ๆญค็ผๅไธไธชๆนๆณ๏ผ่ฟๅ Memento public Memento saveStateMemento() { return new Memento(state); } //้่ฟๅคๅฟๅฝๅฏน่ฑก๏ผๆขๅค็ถๆ public void getStateFromMemento(Memento memento) { state = memento.getState(); } } public class Memento { private String state; //ๆ้ ๅจ public Memento(String state) { super(); this.state = state; } public String getState() { return state; } } import java.util.ArrayList; import java.util.List; public class Caretaker { //ๅจList ้ๅไธญไผๆๅพๅค็ๅคๅฟๅฝๅฏน่ฑก private List\u003cMemento\u003e mementoList = new ArrayList\u003cMemento\u003e(); public void add(Memento memento) { mementoList.add(memento); } //่ทๅๅฐ็ฌฌindexไธชOriginator ็ ๅคๅฟๅฝๅฏน่ฑก(ๅณไฟๅญ็ถๆ) public Memento get(int index) { return mementoList.get(index); } } import java.util.ArrayList; import java.util.HashMap; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Originator originator = new Originator(); Caretaker caretaker = new Caretaker(); originator.setState(\" ็ถๆ#1 ๆปๅปๅ 100 \"); //ไฟๅญไบๅฝๅ็็ถๆ caretaker.add(originator.saveStateMemento()); originator.setState(\" ็ถๆ#2 ๆปๅปๅ 80 \"); caretaker.add(originator.saveStateMemento()); originator.setState(\" ็ถๆ#3 ๆปๅปๅ 50 \"); caretaker.add(originator.saveStateMemento()); System.out.println(\"ๅฝๅ็็ถๆๆฏ =\" + originator.getState()); //ๅธๆๅพๅฐ็ถๆ 1, ๅฐ originator ๆขๅคๅฐ็ถๆ1 originator.getStateFromMemento(caretaker.get(0)); System.out.println(\"ๆขๅคๅฐ็ถๆ1 , ๅฝๅ็็ถๆๆฏ\"); System.out.println(\"ๅฝๅ็็ถๆๆฏ =\" + originator.getState()); } } ๅคๅฟๅฝๆจกๅผๅบ็จๅฎไพ ๅคๅฟๅฝๆจกๅผๅบ็จๅฎไพ็ฑปๅพ public class Memento { //ๆปๅปๅ private int vit; //้ฒๅพกๅ private int def; public Memento(int vit, int def) { super(); this.vit = vit; this.def = def; } public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } } public class GameRole { private int vit; private int def; //ๅๅปบMemento ,ๅณๆ นๆฎๅฝๅ็็ถๆๅพๅฐMemento public Memento createMemento() { return new Memento(vit, def); } //ไปๅคๅฟๅฝๅฏน่ฑก๏ผๆขๅคGameRole็็ถๆ public void recoverGameRoleFromMemento(Memento memento) { this.vit = memento.getVit(); this.def = memento.getDef(); } //ๆพ็คบๅฝๅๆธธๆ่ง่ฒ็็ถๆ public void display() { System.out.println(\"ๆธธๆ่ง่ฒๅฝๅ็ๆปๅปๅ๏ผ\" + this.vit + \" ้ฒๅพกๅ: \" + this.def); } public int getVit() { return vit; } public void setVit(int vit) { this.vit = vit; } public int getDef() { return def; } public void setDef(int def) { this.def = def; } } import java.util.ArrayList; import java.util.HashMap; //ๅฎๆค่
ๅฏน่ฑก, ไฟๅญๆธธๆ่ง่ฒ็็ถๆ public class Caretaker { //ๅฆๆๅชไฟๅญไธๆฌก็ถๆ private Memento memento; //ๅฏนGameRole ไฟๅญๅคๆฌก็ถๆ //private ArrayList\u003cMemento\u003e mementos; //ๅฏนๅคไธชๆธธๆ่ง่ฒไฟๅญๅคไธช็ถๆ //private HashMap\u003cString, ArrayList\u003cMemento\u003e\u003e rolesMementos; public Memento getMemento() { return memento; } public void setMemento(Memento memento) { this.memento = memento; } } public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //ๅๅปบๆธธๆ่ง่ฒ GameRole gameRole = new GameRole(); gameRole.setVit(100); gameRole.setDef(100); System.out.println(\"ๅbossๅคงๆๅ็็ถๆ\"); gameRole.display(); //ๆๅฝๅ็ถๆไฟๅญcaretaker Caretaker caretaker = new Caretaker(); caretaker.setMemento(gameRole.createMemento()); System.out.println(\"ๅboss","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:20","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Technology"],"content":"่งฃ้ๅจๆจกๅผ ๆชๅฎๅพ
็ปญยทยทยท ","date":"2022-12-05","objectID":"/blog/20221205_designpatterns/:4:21","tags":["Java","coding","principle"],"title":"่ฎพ่ฎกๆจกๅผ","uri":"/blog/20221205_designpatterns/"},{"categories":["Hugo"],"content":"ๅบๆฌ Markdown ่ฏญๆณ. ๆณจๆ ่ฟ็ฏๆ็ซ ๅ้ดไบไธ็ฏๅพๆฃ็ๆฅ่ช Grav ็ๆ็ซ . ๆไปฌ้ฝ็ฅ้็ผๅ Web ๅ
ๅฎนๅพ้บป็ฆ.ไฝๅธ้ขไธๆไธ็ง WYSIWYGๆ่งๅณๆๅพ ็ผ่พๅจๅฏไปฅๅธฎๅฉๆไปฌๅ่ฝปไบ่ฟไธไปปๅก. ไฝ้ๅธธไผๅฏผ่ดไปฃ็ ๅคช็ณ, ไฝๆๆถๆด็ณ็ณ็ๆฏ, ็ฝ้กตไนไผๅพไธ๏ผๆฏ็ซไปฃ็ ไธๆฏๆไปฌไบฒๆๆๅ๏ผ่ฎฒ็ฉถ็ๅฐฑๆฏไธคๅญโโ็ไบ๏ผไปฅ่ณไบๅ
ถไป้ฝไธๆๆ ๅ
ณ. ๅฏนไบ้ๅธธไผด้็ๆๆๅคๆๅไธ้็้ฎ้ข, Markdown ็ๆ HTML ๅ
ๅฎน็ๆนๅผๆฏไธ็งๆดๅฅฝ็้ๆฉ. ไธไบไธป่ฆๅฅฝๅคๆฏ: Markdown ็ฎๅๆๅญฆ, ๅ ไนๆฒกๆๅคไฝ็ๅญ็ฌฆ, ๅ ๆญค็ผๅๅ
ๅฎนไนๆดๅฟซ. ็จ Markdown ไนฆๅๆถๅบ้็ๆบไผๆดๅฐ. ๅฏไปฅไบง็ๆๆ็ XHTML ่พๅบ. ๅฐๅ
ๅฎนๅ่ง่งๆพ็คบไฟๆๅๅผ, ่ฟๆ ทๅฐฑไธไผๆไนฑ็ฝ็ซ็ๅค่ง. ๅฏไปฅๅจไฝ ๅๆฌข็ไปปไฝๆๆฌ็ผ่พๅจๆ Markdown ๅบ็จ็จๅบไธญ็ผๅๅ
ๅฎน. Markdown ไฝฟ็จ่ตทๆฅๅพๆ่ถฃ! John Gruber, Markdown ็ไฝ่
่ฏด: Markdown ๆ ผๅผ็้ฆ่ฆ่ฎพ่ฎก็ฎๆ ๆฏๆดๅ
ทๅฏ่ฏปๆง. ๆๅ็ๆณๆณๆฏ Markdown ๆ ผๅผ็ๆๆกฃๅบๅฝไปฅ็บฏๆๆฌๅฝขๅผๅๅธ, ่ไธไผ็่ตทๆฅๅ่ขซๆ ็ญพๆๆ ผๅผ่ฏดๆๆๆ ่ฎฐ. ่ฝ็ถ Markdown ็่ฏญๆณๅๅฐๅ ็ง็ฐๆ็ๆๆฌๅฐ HTML ่ฝฌๆขๅทฅๅ
ท็ๅฝฑๅ, ไฝ Markdown ่ฏญๆณ็ๆๅคง็ตๆๆฅๆบๆฏ็บฏๆๆฌ็ตๅญ้ฎไปถ็ๆ ผๅผ. โ John Gruber ่ฏไธๅค่ฏด, ๆไปฌๆฅๅ้กพไธไธ Markdown ็ไธป่ฆ่ฏญๆณไปฅๅ็ๆ็ HTML ๆ ทๅผ! ๆๅทง ย ๅฐๆญค้กตไฟๅญไธบไนฆ็ญพ๏ผไปฅๅคๅฐๆฅๅ่! ","date":"2022-09-19","objectID":"/blog/markdown/:0:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"1 ๆ ้ข ไป h2 ๅฐ h6 ็ๆ ้ขๅจๆฏไธช็บงๅซไธ้ฝๅ ไธไธไธช ๏ผ: ## h2 ๆ ้ข ### h3 ๆ ้ข #### h4 ๆ ้ข ##### h5 ๆ ้ข ###### h6 ๆ ้ข ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003ch2\u003eh2 ๆ ้ข\u003c/h2\u003e \u003ch3\u003eh3 ๆ ้ข\u003c/h3\u003e \u003ch4\u003eh4 ๆ ้ข\u003c/h4\u003e \u003ch5\u003eh5 ๆ ้ข\u003c/h5\u003e \u003ch6\u003eh6 ๆ ้ข\u003c/h6\u003e ๆ ้ข ID ่ฆๆทปๅ ่ชๅฎไนๆ ้ข ID, ่ฏทๅจไธๆ ้ข็ธๅ็่กไธญๅฐ่ชๅฎไน ID ๆพๅจ่ฑๆฌๅทไธญ: ### ไธไธชๅพๆฃ็ๆ ้ข {#custom-id} ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003ch3 id=\"custom-id\"\u003eไธไธชๅพๆฃ็ๆ ้ข\u003c/h3\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:1:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"2 ๆณจ้ ๆณจ้ๆฏๅ HTML ๅ
ผๅฎน็๏ผ \u003c!-- ่ฟๆฏไธๆฎตๆณจ้ --\u003e ไธ่ฝ็ๅฐไปฅไธ็ๆณจ้: ","date":"2022-09-19","objectID":"/blog/markdown/:2:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"3 ๆฐดๅนณ็บฟ HTML ไธญ็ \u003chr\u003e ๆ ็ญพๆฏ็จๆฅๅจๆฎต่ฝๅ
็ด ไน้ดๅๅปบไธไธช โไธ้ข้ด้โ ็. ไฝฟ็จ Markdown, ไฝ ๅฏไปฅ็จไปฅไธๆนๅผๅๅปบไธไธช \u003chr\u003e ๆ ็ญพ: ___: ไธไธช่ฟ็ปญ็ไธๅ็บฟ ---: ไธไธช่ฟ็ปญ็็ ดๆๅท ***: ไธไธช่ฟ็ปญ็ๆๅท ๅ็ฐ็่พๅบๆๆๅฆไธ: ","date":"2022-09-19","objectID":"/blog/markdown/:3:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"4 ๆฎต่ฝ ๆ็
ง็บฏๆๆฌ็ๆนๅผไนฆๅๆฎต่ฝ, ็บฏๆๆฌๅจๅ็ฐ็ HTML ไธญๅฐ็จ \u003cp\u003e/\u003c/p\u003e ๆ ็ญพๅ
่ฃน. ๅฆไธๆฎต่ฝ: Lorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad. ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cp\u003eLorem ipsum dolor sit amet, graecis denique ei vel, at duo primis mandamus. Et legere ocurreret pri, animal tacimates complectitur ad cum. Cu eum inermis inimicus efficiendi. Labore officiis his ex, soluta officiis concludaturque ei qui, vide sensibus vim ad.\u003c/p\u003e ๅฏไปฅไฝฟ็จไธไธช็ฉบ็ฝ่ก่ฟ่กๆข่ก. ","date":"2022-09-19","objectID":"/blog/markdown/:4:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"5 ๅ
่ HTML ๅ
็ด ๅฆๆไฝ ้่ฆๆไธช HTML ๆ ็ญพ (ๅธฆๆไธไธช็ฑป), ๅๅฏไปฅ็ฎๅๅฐๅ่ฟๆ ทไฝฟ็จ: Markdown ๆ ผๅผ็ๆฎต่ฝ. \u003cdiv class=\"class\"\u003e ่ฟๆฏ \u003cb\u003eHTML\u003c/b\u003e \u003c/div\u003e Markdown ๆ ผๅผ็ๆฎต่ฝ. ","date":"2022-09-19","objectID":"/blog/markdown/:5:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"6 ๅผบ่ฐ ","date":"2022-09-19","objectID":"/blog/markdown/:6:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๅ ็ฒ ็จไบๅผบ่ฐๅธฆๆ่พ็ฒๅญไฝ็ๆๆฌ็ๆฎต. ไปฅไธๆๆฌ็ๆฎตไผ่ขซ ๆธฒๆไธบ็ฒไฝ. **ๆธฒๆไธบ็ฒไฝ** __ๆธฒๆไธบ็ฒไฝ__ ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cstrong\u003eๆธฒๆไธบ็ฒไฝ\u003c/strong\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:6:1","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๆไฝ ็จไบๅผบ่ฐๅธฆๆๆไฝ็ๆๆฌ็ๆฎต. ไปฅไธๆๆฌ็ๆฎต่ขซ ๆธฒๆไธบๆไฝ. *ๆธฒๆไธบๆไฝ* _ๆธฒๆไธบๆไฝ_ ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cem\u003eๆธฒๆไธบๆไฝ\u003c/em\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:6:2","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๅ ้ค็บฟ ๆ็
ง GFMGitHub flavored Markdown ไฝ ๅฏไปฅไฝฟ็จๅ ้ค็บฟ. ~~่ฟๆฎตๆๆฌๅธฆๆๅ ้ค็บฟ.~~ ๅ็ฐ็่พๅบๆๆๅฆไธ: ่ฟๆฎตๆๆฌๅธฆๆๅ ้ค็บฟ. ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cdel\u003e่ฟๆฎตๆๆฌๅธฆๆๅ ้ค็บฟ.\u003c/del\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:6:3","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"็ปๅ ๅ ็ฒ, ๆไฝ, ๅๅ ้ค็บฟๅฏไปฅ ็ปๅไฝฟ็จ. ***ๅ ็ฒๅๆไฝ*** ~~**ๅ ้ค็บฟๅๅ ็ฒ**~~ ~~*ๅ ้ค็บฟๅๆไฝ*~~ ~~***ๅ ็ฒ, ๆไฝๅๅ ้ค็บฟ***~~ ๅ็ฐ็่พๅบๆๆๅฆไธ: ๅ ็ฒๅๆไฝ ๅ ้ค็บฟๅๅ ็ฒ ๅ ้ค็บฟๅๆไฝ ๅ ็ฒ, ๆไฝๅๅ ้ค็บฟ ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cem\u003e\u003cstrong\u003eๅ ็ฒๅๆไฝ\u003c/strong\u003e\u003c/em\u003e \u003cdel\u003e\u003cstrong\u003eๅ ้ค็บฟๅๅ ็ฒ\u003c/strong\u003e\u003c/del\u003e \u003cdel\u003e\u003cem\u003eๅ ้ค็บฟๅๆไฝ\u003c/em\u003e\u003c/del\u003e \u003cdel\u003e\u003cem\u003e\u003cstrong\u003eๅ ็ฒ, ๆไฝๅๅ ้ค็บฟ\u003c/strong\u003e\u003c/em\u003e\u003c/del\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:6:4","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"7 ๅผ็จ ็จไบๅจๆๆกฃไธญๅผ็จๅ
ถไปๆฅๆบ็ๅ
ๅฎนๅ. ๅจ่ฆๅผ็จ็ไปปไฝๆๆฌไนๅๆทปๅ \u003e: \u003e **Fusion Drive** combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. ๅ็ฐ็่พๅบๆๆๅฆไธ: Fusion Drive combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cblockquote\u003e \u003cp\u003e \u003cstrong\u003eFusion Drive\u003c/strong\u003e combines a hard drive with a flash storage (solid-state drive) and presents it as a single logical volume with the space of both drives combined. \u003c/p\u003e \u003c/blockquote\u003e ๅผ็จไนๅฏไปฅๅตๅฅ: \u003e Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. \u003e\u003e Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. ๅ็ฐ็่พๅบๆๆๅฆไธ: Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. ","date":"2022-09-19","objectID":"/blog/markdown/:7:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"8 ๅ่กจ ","date":"2022-09-19","objectID":"/blog/markdown/:8:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๆ ๅบๅ่กจ ไธ็ณปๅ้กน็ๅ่กจ, ๅ
ถไธญ้กน็้กบๅบๆฒกๆๆๆพๅ
ณ็ณป. ไฝ ๅฏไปฅไฝฟ็จไปฅไธไปปไฝ็ฌฆๅทๆฅ่กจ็คบๆ ๅบๅ่กจไธญ็้กน: * ไธ้กนๅ
ๅฎน - ไธ้กนๅ
ๅฎน + ไธ้กนๅ
ๅฎน ไพๅฆ: * Lorem ipsum dolor sit amet * Consectetur adipiscing elit * Integer molestie lorem at massa * Facilisis in pretium nisl aliquet * Nulla volutpat aliquam velit * Phasellus iaculis neque * Purus sodales ultricies * Vestibulum laoreet porttitor sem * Ac tristique libero volutpat at * Faucibus porta lacus fringilla vel * Aenean sit amet erat nunc * Eget porttitor lorem ๅ็ฐ็่พๅบๆๆๅฆไธ: Lorem ipsum dolor sit amet Consectetur adipiscing elit Integer molestie lorem at massa Facilisis in pretium nisl aliquet Nulla volutpat aliquam velit Phasellus iaculis neque Purus sodales ultricies Vestibulum laoreet porttitor sem Ac tristique libero volutpat at Faucibus porta lacus fringilla vel Aenean sit amet erat nunc Eget porttitor lorem ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cul\u003e \u003cli\u003eLorem ipsum dolor sit amet\u003c/li\u003e \u003cli\u003eConsectetur adipiscing elit\u003c/li\u003e \u003cli\u003eInteger molestie lorem at massa\u003c/li\u003e \u003cli\u003eFacilisis in pretium nisl aliquet\u003c/li\u003e \u003cli\u003eNulla volutpat aliquam velit \u003cul\u003e \u003cli\u003ePhasellus iaculis neque\u003c/li\u003e \u003cli\u003ePurus sodales ultricies\u003c/li\u003e \u003cli\u003eVestibulum laoreet porttitor sem\u003c/li\u003e \u003cli\u003eAc tristique libero volutpat at\u003c/li\u003e \u003c/ul\u003e \u003c/li\u003e \u003cli\u003eFaucibus porta lacus fringilla vel\u003c/li\u003e \u003cli\u003eAenean sit amet erat nunc\u003c/li\u003e \u003cli\u003eEget porttitor lorem\u003c/li\u003e \u003c/ul\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:8:1","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๆๅบๅ่กจ ไธ็ณปๅ้กน็ๅ่กจ, ๅ
ถไธญ้กน็้กบๅบ็กฎๅฎๅพ้่ฆ. 1. Lorem ipsum dolor sit amet 2. Consectetur adipiscing elit 3. Integer molestie lorem at massa 4. Facilisis in pretium nisl aliquet 5. Nulla volutpat aliquam velit 6. Faucibus porta lacus fringilla vel 7. Aenean sit amet erat nunc 8. Eget porttitor lorem ๅ็ฐ็่พๅบๆๆๅฆไธ: Lorem ipsum dolor sit amet Consectetur adipiscing elit Integer molestie lorem at massa Facilisis in pretium nisl aliquet Nulla volutpat aliquam velit Faucibus porta lacus fringilla vel Aenean sit amet erat nunc Eget porttitor lorem ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003col\u003e \u003cli\u003eLorem ipsum dolor sit amet\u003c/li\u003e \u003cli\u003eConsectetur adipiscing elit\u003c/li\u003e \u003cli\u003eInteger molestie lorem at massa\u003c/li\u003e \u003cli\u003eFacilisis in pretium nisl aliquet\u003c/li\u003e \u003cli\u003eNulla volutpat aliquam velit\u003c/li\u003e \u003cli\u003eFaucibus porta lacus fringilla vel\u003c/li\u003e \u003cli\u003eAenean sit amet erat nunc\u003c/li\u003e \u003cli\u003eEget porttitor lorem\u003c/li\u003e \u003c/ol\u003e ๆๅทง ๅฆๆไฝ ๅฏนๆฏไธ้กนไฝฟ็จ 1., Markdown ๅฐ่ชๅจไธบๆฏไธ้กน็ผๅท. ไพๅฆ: 1. Lorem ipsum dolor sit amet 1. Consectetur adipiscing elit 1. Integer molestie lorem at massa 1. Facilisis in pretium nisl aliquet 1. Nulla volutpat aliquam velit 1. Faucibus porta lacus fringilla vel 1. Aenean sit amet erat nunc 1. Eget porttitor lorem ๅ็ฐ็่พๅบๆๆๅฆไธ: Lorem ipsum dolor sit amet Consectetur adipiscing elit Integer molestie lorem at massa Facilisis in pretium nisl aliquet Nulla volutpat aliquam velit Faucibus porta lacus fringilla vel Aenean sit amet erat nunc Eget porttitor lorem ","date":"2022-09-19","objectID":"/blog/markdown/:8:2","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ไปปๅกๅ่กจ ไปปๅกๅ่กจไฝฟไฝ ๅฏไปฅๅๅปบๅธฆๆๅค้ๆก็ๅ่กจ. ่ฆๅๅปบไปปๅกๅ่กจ, ่ฏทๅจไปปๅกๅ่กจ้กนไนๅๆทปๅ ็ ดๆๅท (-) ๅๅธฆๆ็ฉบๆ ผ็ๆนๆฌๅท ([ ]). ่ฆ้ๆฉไธไธชๅค้ๆก๏ผ่ฏทๅจๆนๆฌๅทไน้ดๆทปๅ x ([x]). - [x] Write the press release - [ ] Update the website - [ ] Contact the media ๅ็ฐ็่พๅบๆๆๅฆไธ: Write the press release Update the website Contact the media ","date":"2022-09-19","objectID":"/blog/markdown/:8:3","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"9 ไปฃ็ ","date":"2022-09-19","objectID":"/blog/markdown/:9:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"่กๅ
ไปฃ็ ็จ ` ๅ
่ฃ
่กๅ
ไปฃ็ ๆฎต. ๅจ่ฟไธชไพๅญไธญ, `\u003csection\u003e\u003c/section\u003e` ไผ่ขซๅ
่ฃนๆ **ไปฃ็ **. ๅ็ฐ็่พๅบๆๆๅฆไธ: ๅจ่ฟไธชไพๅญไธญ, \u003csection\u003e\u003c/section\u003e ไผ่ขซๅ
่ฃนๆ ไปฃ็ . ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cp\u003e ๅจ่ฟไธชไพๅญไธญ, \u003ccode\u003e\u0026lt;section\u0026gt;\u0026lt;/section\u0026gt;\u003c/code\u003e ไผ่ขซๅ
่ฃนๆ \u003cstrong\u003eไปฃ็ \u003c/strong\u003e. \u003c/p\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:9:1","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"็ผฉ่ฟไปฃ็ ๅฐๅ ่กไปฃ็ ็ผฉ่ฟ่ณๅฐๅไธช็ฉบๆ ผ๏ผไพๅฆ: // Some comments line 1 of code line 2 of code line 3 of code ๅ็ฐ็่พๅบๆๆๅฆไธ: // Some comments line 1 of code line 2 of code line 3 of code ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cpre\u003e \u003ccode\u003e // Some comments line 1 of code line 2 of code line 3 of code \u003c/code\u003e \u003c/pre\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:9:2","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๅดๆ ไปฃ็ ๅ ไฝฟ็จ โๅดๆ โ ``` ๆฅ็ๆไธๆฎตๅธฆๆ่ฏญ่จๅฑๆง็ไปฃ็ ๅ. ```markdown Sample text here... ``` ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003cpre language-html\u003e \u003ccode\u003eSample text here...\u003c/code\u003e \u003c/pre\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:9:3","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"่ฏญๆณ้ซไบฎ GFMGitHub Flavored Markdown ไนๆฏๆ่ฏญๆณ้ซไบฎ. ่ฆๆฟๆดปๅฎ๏ผๅช้ๅจ็ฌฌไธไธชไปฃ็ โๅดๆ โ ไนๅ็ดๆฅๆทปๅ ไฝ ่ฆไฝฟ็จ็่ฏญ่จ็ๆไปถๆฉๅฑๅ, ```js, ่ฏญๆณ้ซไบฎๆพ็คบๅฐ่ชๅจๅบ็จไบๆธฒๆ็ HTML ไธญ. ไพๅฆ, ๅจไปฅไธ JavaScript ไปฃ็ ไธญๅบ็จ่ฏญๆณ้ซไบฎ: ```js grunt.initConfig({ assemble: { options: { assets: 'docs/assets', data: 'src/data/*.{json,yml}', helpers: 'src/custom-helpers.js', partials: ['src/partials/**/*.{hbs,md}'] }, pages: { options: { layout: 'default.hbs' }, files: { './': ['src/templates/pages/index.hbs'] } } } }; ``` ๅ็ฐ็่พๅบๆๆๅฆไธ: grunt.initConfig({ assemble: { options: { assets: 'docs/assets', data: 'src/data/*.{json,yml}', helpers: 'src/custom-helpers.js', partials: ['src/partials/**/*.{hbs,md}'] }, pages: { options: { layout: 'default.hbs' }, files: { './': ['src/templates/pages/index.hbs'] } } } }; ๆณจๆ Hugo ๆๆกฃไธญ็ ่ฏญๆณ้ซไบฎ้กต้ข ไป็ปไบๆๅ
ณ่ฏญๆณ้ซไบฎ็ๆดๅคไฟกๆฏ, ๅ
ๆฌ่ฏญๆณ้ซไบฎ็ shortcode. ","date":"2022-09-19","objectID":"/blog/markdown/:9:4","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"10 ่กจๆ ผ ้่ฟๅจๆฏไธชๅๅ
ๆ ผไน้ดๆทปๅ ็ซ็บฟไฝไธบๅ้็บฟ, ๅนถๅจๆ ้ขไธๆทปๅ ไธ่ก็ ดๆๅท (ไน็ฑ็ซ็บฟๅ้) ๆฅๅๅปบ่กจๆ ผ. ๆณจๆ, ็ซ็บฟไธ้่ฆๅ็ดๅฏน้ฝ. | Option | Description | | ------ | ----------- | | data | path to data files to supply the data that will be passed into templates. | | engine | engine to be used for processing templates. Handlebars is the default. | | ext | extension to be used for dest files. | ๅ็ฐ็่พๅบๆๆๅฆไธ: Option Description data path to data files to supply the data that will be passed into templates. engine engine to be used for processing templates. Handlebars is the default. ext extension to be used for dest files. ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003ctable\u003e \u003cthead\u003e \u003ctr\u003e \u003cth\u003eOption\u003c/th\u003e \u003cth\u003eDescription\u003c/th\u003e \u003c/tr\u003e \u003c/thead\u003e \u003ctbody\u003e \u003ctr\u003e \u003ctd\u003edata\u003c/td\u003e \u003ctd\u003epath to data files to supply the data that will be passed into templates.\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003eengine\u003c/td\u003e \u003ctd\u003eengine to be used for processing templates. Handlebars is the default.\u003c/td\u003e \u003c/tr\u003e \u003ctr\u003e \u003ctd\u003eext\u003c/td\u003e \u003ctd\u003eextension to be used for dest files.\u003c/td\u003e \u003c/tr\u003e \u003c/tbody\u003e \u003c/table\u003e ๆๆฌๅณๅฏน้ฝๆๅฑ
ไธญๅฏน้ฝ ๅจไปปไฝๆ ้ขไธๆน็็ ดๆๅทๅณไพงๆทปๅ ๅๅทๅฐไฝฟ่ฏฅๅ็ๆๆฌๅณๅฏน้ฝ. ๅจไปปไฝๆ ้ขไธๆน็็ ดๆๅทไธค่พนๆทปๅ ๅๅทๅฐไฝฟ่ฏฅๅ็ๅฏน้ฝๆๆฌๅฑ
ไธญ. | Option | Description | |:------:| -----------:| | data | path to data files to supply the data that will be passed into templates. | | engine | engine to be used for processing templates. Handlebars is the default. | | ext | extension to be used for dest files. | ๅ็ฐ็่พๅบๆๆๅฆไธ: Option Description data path to data files to supply the data that will be passed into templates. engine engine to be used for processing templates. Handlebars is the default. ext extension to be used for dest files. ","date":"2022-09-19","objectID":"/blog/markdown/:10:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"11 ้พๆฅ ","date":"2022-09-19","objectID":"/blog/markdown/:11:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๅบๆฌ้พๆฅ \u003chttps://assemble.io\u003e \u003ccontact@revolunet.com\u003e [Assemble](https://assemble.io) ๅ็ฐ็่พๅบๆๆๅฆไธ (ๅฐ้ผ ๆ ๆฌๅๅจ้พๆฅไธ๏ผๆฒกๆๆ็คบ): https://assemble.io contact@revolunet.com Assemble ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003ca href=\"https://assemble.io\"\u003ehttps://assemble.io\u003c/a\u003e \u003ca href=\"mailto:contact@revolunet.com\"\u003econtact@revolunet.com\u003c/a\u003e \u003ca href=\"https://assemble.io\"\u003eAssemble\u003c/a\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:11:1","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๆทปๅ ไธไธชๆ ้ข [Upstage](https://github.com/upstage/ \"Visit Upstage!\") ๅ็ฐ็่พๅบๆๆๅฆไธ (ๅฐ้ผ ๆ ๆฌๅๅจ้พๆฅไธ๏ผไผๆไธ่กๆ็คบ): Upstage ่พๅบ็ HTML ็่ตทๆฅๅ่ฟๆ ท: \u003ca href=\"https://github.com/upstage/\" title=\"Visit Upstage!\"\u003eUpstage\u003c/a\u003e ","date":"2022-09-19","objectID":"/blog/markdown/:11:2","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"ๅฎไฝๆ ่ฎฐ ๅฎไฝๆ ่ฎฐไฝฟไฝ ๅฏไปฅ่ทณ่ณๅไธ้กต้ขไธ็ๆๅฎ้็น. ไพๅฆ, ๆฏไธช็ซ ่: ## Table of Contents * [Chapter 1](#chapter-1) * [Chapter 2](#chapter-2) * [Chapter 3](#chapter-3) ๅฐ่ทณ่ฝฌๅฐ่ฟไบ้จๅ: ## Chapter 1 \u003ca id=\"chapter-1\"\u003e\u003c/a\u003e Content for chapter one. ## Chapter 2 \u003ca id=\"chapter-2\"\u003e\u003c/a\u003e Content for chapter one. ## Chapter 3 \u003ca id=\"chapter-3\"\u003e\u003c/a\u003e Content for chapter one. ๆณจๆ ๅฎไฝๆ ่ฎฐ็ไฝ็ฝฎๅ ไนๆฏไปปๆ็. ๅ ไธบๅฎไปฌๅนถไธๅผไบบๆณจ็ฎ, ๆไปฅๅฎไปฌ้ๅธธ่ขซๆพๅจๅไธ่กไบ. ","date":"2022-09-19","objectID":"/blog/markdown/:11:3","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"12 ่ๆณจ ่ๆณจไฝฟไฝ ๅฏไปฅๆทปๅ ๆณจ้ๅๅ่, ่ไธไผไฝฟๆๆกฃๆญฃๆๆททไนฑ. ๅฝไฝ ๅๅปบ่ๆณจๆถ, ไผๅจๆทปๅ ่ๆณจๅผ็จ็ไฝ็ฝฎๅบ็ฐๅธฆๆ้พๆฅ็ไธๆ ็ผๅท. ่ฏป่
ๅฏไปฅๅๅป้พๆฅไปฅ่ทณ่ณ้กต้ขๅบ้จ็่ๆณจๅ
ๅฎน. ่ฆๅๅปบ่ๆณจๅผ็จ, ่ฏทๅจๆนๆฌๅทไธญๆทปๅ ๆๅ
ฅ็ฌฆๅทๅๆ ่ฏ็ฌฆ ([^1]). ๆ ่ฏ็ฌฆๅฏไปฅๆฏๆฐๅญๆๅ่ฏ, ไฝไธ่ฝๅ
ๅซ็ฉบๆ ผๆๅถ่กจ็ฌฆ. ๆ ่ฏ็ฌฆไป
ๅฐ่ๆณจๅผ็จไธ่ๆณจๆฌ่บซ็ธๅ
ณ่ - ๅจ่ๆณจ่พๅบไธญ, ่ๆณจๆ้กบๅบ็ผๅท. ๅจไธญๆฌๅทๅ
ไฝฟ็จๆๅ
ฅ็ฌฆๅทๅๆฐๅญไปฅๅ็จๅๅทๅๆๆฌๆฅๆทปๅ ่ๆณจๅ
ๅฎน ([^1]๏ผ่ฟๆฏไธๆฎต่ๆณจ). ไฝ ไธไธๅฎ่ฆๅจๆๆกฃๆซๅฐพๆทปๅ ่ๆณจ. ๅฏไปฅๅฐๅฎไปฌๆพๅจ้คๅ่กจ, ๅผ็จๅ่กจๆ ผ็ญๅ
็ด ไนๅค็ไปปไฝไฝ็ฝฎ. ่ฟๆฏไธไธชๆฐๅญ่ๆณจ[^1]. ่ฟๆฏไธไธชๅธฆๆ ็ญพ็่ๆณจ[^label] [^1]: ่ฟๆฏไธไธชๆฐๅญ่ๆณจ [^label]: ่ฟๆฏไธไธชๅธฆๆ ็ญพ็่ๆณจ ่ฟๆฏไธไธชๆฐๅญ่ๆณจ1. ่ฟๆฏไธไธชๅธฆๆ ็ญพ็่ๆณจ2 ","date":"2022-09-19","objectID":"/blog/markdown/:12:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Hugo"],"content":"13 ๅพ็ ๅพ็็่ฏญๆณไธ้พๆฅ็ธไผผ, ไฝๅ
ๅซไธไธชๅจๅ้ข็ๆๅนๅท.  ๆ่
:  The Stormtroopocat ๅ้พๆฅไธๆ ท, ๅพ็ไนๅ
ทๆ่ๆณจๆ ทๅผ็่ฏญๆณ: ![Alt text][id] The Dojocat ่ฟๆฏไธไธชๆฐๅญ่ๆณจย โฉ๏ธ ่ฟๆฏไธไธชๅธฆๆ ็ญพ็่ๆณจย โฉ๏ธ ","date":"2022-09-19","objectID":"/blog/markdown/:13:0","tags":["Markdown","HTML","Posts","grammar"],"title":"Markdown ๅบๆฌ่ฏญๆณ","uri":"/blog/markdown/"},{"categories":["Technology"],"content":"Dockerๅฎ่ฃ
SQLServer","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"Mac ๅฎ่ฃ
SQL Server ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:0","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"ๅ่จ ็ฑไบๆ่ฟๅญฆไน ้่ฆไฝฟ็จๅฐ SQL Server ๆฐๆฎๅบ๏ผไฝๆๆฌไบบไฝฟ็จ็ๆไฝ็ณป็ปๆฏ Mac ๏ผไผๆๅจ็ฅ๏ผ SQL Server ๆฏๅพฎ่ฝฏๆไธ็ๅ
ณ็ณปๅๆฐๆฎๅบ๏ผๅ
ทไฝๆๅ
ณSQL Serverไผ็น่ช่กๅปๅพฎ่ฝฏๅฎๆนๆฅ็๐ Microsoft - SQL Server | Microsoft Docs ๏ผ๏ผๆไปฅๅพฎ่ฝฏ่ฏๅฎๆดๅ ไบฒ่ฟ่ชๅทฑ็ไบฒๅฟๅญ Windows ๆไฝ็ณป็ป๏ผไปฅ่ณไบๅฐ็ฐๅจ SQL Server ๅนถไธๆฏๆ Mac๏ผ้ฃๆไนๅๅข๏ผๆปไธ่ฝๅฎ่ฃ
่ๆๆบไฝฟ็จๅง๏ผๅฏนไบๆไปฌๅฆๆญค็ๆๅ
ๅญไฝฟ็จ็็จๅบ็ฟ้ฃๆฏไธๅฏ่ฝ็๐๏ผ็ป่ฟๆๆฅ้
่ตๆ๏ผๆๅ็ฐๅพฎ่ฝฏๅฝๅๆฏๆ Ubuntu 16.04๏ผๅ RHEL 7.2๏ผ็บขๅธฝๅญไผไธ็ Linux ๏ผ๏ผๆข็ถๆฏๆ Linux ้ฃๅฐฑๅฅฝๅไบ๏ผๆไปฌๅฏไปฅไฝฟ็จDocker๐คๅบ็จๅป่ๆๅๅฎไพใ ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:1","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"Docker ไป็ป Docker ๆฏไธไธชๅผๆบ็ๅบ็จๅฎนๅจๅผๆ๏ผๅบไบ Go ่ฏญ่จ ๅนถ้ตไป Apache2.0 ๅ่ฎฎๅผๆบใ Docker ๅฏไปฅ่ฎฉๅผๅ่
ๆๅ
ไปไปฌ็ๅบ็จไปฅๅไพ่ตๅ
ๅฐไธไธช่ฝป้็บงใๅฏ็งปๆค็ๅฎนๅจไธญ๏ผ็ถๅๅๅธๅฐไปปไฝๆต่ก็ Linux ๆบๅจไธ๏ผไนๅฏไปฅๅฎ็ฐ่ๆๅใๅฎนๅจๆฏๅฎๅ
จไฝฟ็จๆฒ็ฎฑๆบๅถ๏ผ็ธไบไน้ดไธไผๆไปปไฝๆฅๅฃ๏ผ็ฑปไผผ iPhone ็ app๏ผ,ๆด้่ฆ็ๆฏๅฎนๅจๆง่ฝๅผ้ๆไฝใ Docker ๆๅฅฝ็ไธ็นๅจไบไฝ ้่ฆไปไน็ฏๅขๅฐฑๅฏไปฅไธ่ฝฝไป
ๆฅๆ่ฏฅ็ฏๅข็ Linux ็ณป็ป๏ผๅณ็ผฉๅฐไบไฝฟ็จ็ไฝ็งฏ๏ผไนๆฅๆไบ้่ฆไฝฟ็จ็็ฏๅข๏ผ่ฝปไพฟๅ้ซๆใ ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:2","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"Mac ๅฎ่ฃ
Docker Docker ๅฎ็ฝๆๅจๅฎ่ฃ
Docker HomeBrew ๆ็ฎกๅฎ่ฃ
brew cask install docker ๅฏนไบ่ฝๅทๆๅฐฑๅทๆ็ๆๆฅ่ฏด๐๏ผ่ฏๅฎ้ๆฉๅ่
ไธๆกๅฝไปค่งฃๅณไบ๏ผๅฎ็ฝๅฎ่ฃ
ไธ่ฝฝ่ฟ้่ฆๅปๅฏปๆพ็นๅปไธ่ฝฝ๏ผๅฏนไบ็จๅบ็ฟๆฅ่ฏดๅคไธไผ้
ๅ๐ค๏ผๆณ่ฆไบ่งฃ macOS๏ผๆ Linux๏ผ็ผบๅคฑ็่ฝฏไปถๅ
็็ฎก็ๅจ โ Homebrew ็ๅฏไปฅ่ช่กๅปไบ่งฃไธไธ๏ผ็ๆฏๅฏไปฅๅคงๅคงๆ้ซๆ็๏ผ่ฎฉไฝ ๅฎ่ฃ
็จๅบๅๅพๅฆๆญคไผ้
ใ ==\u003e Downloading https://download.docker.com/mac/stable/42716/Docker.dmg ######################################################################## 100.0% ==\u003e Verifying SHA-256 checksum for Cask 'docker'. ==\u003e Installing Cask docker ==\u003e Moving App 'Docker.app' to '/Applications/Docker.app'. docker was successfully installed! ๆพ็คบ successfully ไพฟๅทฒ็ปๆๅไธ่ฝฝ ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:3","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"Docker ้
็ฝฎๅนถๆๅๅฎนๅจ้ๅ ๅบๆฌ็ฏๅข้
็ฝฎ ๆ นๆฎ่ชๅทฑ็ต่็ธๅบ้
็ฝฎ๏ผ่ชๅทฑๅ้
Dockerๅ ็จ่ตๆบๅคงๅฐ๏ผๅ
ๅญไธๅฎ่ฆๅคงไบ2G๏ผๆ่ฎฐๅพๅฅฝๅSQL Serverๆๅบๆฌ่ฆไฟ่ฏๅ
ๅญ2Gๆ่ฝๆๅๅฏๅจ๏ผไปฅไธๆฏๆ็Docker่ตๆบๅ้
้
็ฝฎ๏ผใ Docker็ฏๅข้
็ฝฎ ้ๅๅ ้ ้ดไบๅฝๅ
็ฝ็ป้ฎ้ข๏ผๅ็ปญๆๅ Docker ้ๅๅๅ็ผๆ
ข๏ผๆไปฌๅฏไปฅ้่ฆ้
็ฝฎๅ ้ๅจๆฅ่งฃๅณ๏ผๆไฝฟ็จ็ๆฏ็ฝๆ็้ๅๅฐๅ๏ผhttp://hub-mirror.c.163.comใ Docker้ๅๅ ้ ้
็ฝฎๅฎๆๅ้ๅฏ Docker ๅบ็จ๏ผๆๅผ Terminal ่พๅ
ฅ docker info ๆฅ็้
็ฝฎๆฏๅฆๆๅใ docker info .... Registry Mirrors: http://hub-mirror.c.163.com/ Live Restore Enabled: false Product License: Community Engine ๆๅๅนถ่ฟ่ก SQL Server ๅฎนๅจ้ๅ ๆๅๅนถ่ฟ่ก SQL Server ๅฎนๅจๆ ๅ๏ผๅ่ไบDocker: Install containers for SQL Server on Linux - SQL Server | Microsoft Docs ไป Microsoft ๅฎนๅจๆณจๅ่กจไธญๆๅ SQL Server 2017 Linux ๅฎนๅจๆ ๅ๏ผๆๅผๆไปฌ็็ป็ซฏ๏ผ่พๅ
ฅๅฝไปค๏ผ sudo docker pull mcr.microsoft.com/mssql/server:2017-latest ่ฟ้ไผๅฐsql server for linux dockerไธ่ฝฝๅฐๆไปฌ่ฎก็ฎๆบไธใ ไฝฟ็จ Docker ่ฟ่กๅฎนๅจ้ๅ ่ฆไฝฟ็จ Docker ่ฟ่กๅฎนๅจๆ ๅ๏ผๅฏไปฅไป Terminal (Linux/macOS) ไฝฟ็จไปฅไธๅฝไปคใ(ไนๅฐฑๆฏ็ป็ซฏ)ใ sudo docker run -e \"ACCEPT_EULA=Y\" -e \"SA_PASSWORD=\u003cYourStrong@Passw0rd\u003e\" \\ -p 1433:1433 --name sqlserver \\ -d mcr.microsoft.com/mssql/server:2017-latest ๅคๆณจ: ๅฏ็ ๅบ็ฌฆๅ SQL Server ้ป่ฎคๅฏ็ ็ญ็ฅ๏ผๅฆๅๅฎนๅจๆ ๆณ่ฎพ็ฝฎ SQL Server๏ผๅฐๅๆญขๅทฅไฝใ ้ป่ฎคๆ
ๅตไธ๏ผๅฏ็ ็้ฟๅบฆๅฟ
้กป่ณๅฐไธบ 8 ไธชๅญ็ฌฆ๏ผๅนถไธๅฟ
้กปๅ
ๅซไปฅไธๅ็งๅญ็ฌฆไธญ็ไธ็ง๏ผๅคงๅๅญๆฏใๅฐๅๅญๆฏใๅ่ฟๅถๆฐๅญๅ็ฌฆๅทใ ไฝ ๅฏไปฅ้่ฟๆง่ก docker logs ๅฝไปคๆฃๆฅ้่ฏฏๆฅๅฟใ ๅๆฐ่ฏดๆ: -e \"ACCEPT_EULA=Y\" ๅฐ ACCEPT_EULA ๅ้่ฎพ็ฝฎไธบไปปๆๅผ๏ผไปฅ็กฎ่ฎคๆฅๅๆ็ป็จๆท่ฎธๅฏๅ่ฎฎใ SQL Server ๆ ๅ็ๅฟ
้กป่ฎพ็ฝฎใ \"SA_PASSWORD=\u003cYourStrong@Passw0rd\u003e\" ๆๅฎ่ณๅฐๅ
ๅซ 8 ไธชๅญ็ฌฆไธ็ฌฆๅ SQL Server ๅฏ็ ่ฆๆฑ็ๅผบๅฏ็ ใ SQL Server ๆ ๅ็ๅฟ
้่ฎพ็ฝฎใ -p 1433:1433 ๅฐไธปๆบ็ฏๅขไธญ็ TCP ็ซฏๅฃ๏ผ็ฌฌไธไธชๅผ๏ผๆ ๅฐๅฐๅฎนๅจไธญ็ TCP ็ซฏๅฃ๏ผ็ฌฌไบไธชๅผ๏ผใ ๅจๆญค็คบไพไธญ๏ผSQL Server ไพฆๅฌๅฎนๅจไธญ็ TCP 1433๏ผๅนถๅฏนไธปๆบไธ็็ซฏๅฃ 1433 ๅ
ฌๅผใ name sqlserver ไธบๅฎนๅจๆๅฎไธไธช่ชๅฎไนๅ็งฐ๏ผ่ไธๆฏไฝฟ็จ้ๆบ็ๆ็ๅ็งฐใ ๅฆๆ่ฟ่กๅคไธชๅฎนๅจ๏ผๅๆ ๆณ้ๅคไฝฟ็จ็ธๅ็ๅ็งฐใ mcr.microsoft.com/mssql/server:2017-latest SQL Server 2017 Linux ๅฎนๅจๆ ๅ ๆฅ็ Docker ๅฎนๅจ ่ฆๆฅ็ Docker ๅฎนๅจ๏ผ่ฏทๅจ Terminal ไธญไฝฟ็จ docker ps ๅฝไปคใ sudo docker ps -a ๆพ็คบ็ปๆๅฆไธ๏ผ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 78c2deca0bd6 mcr.microsoft.com/mssql/server:2017-latest \"/opt/mssql/bin/nonrโฆ\" 30 minutes ago Exited (0) 2 minutes ago sqlserver ๅฆๆโ็ถๆโๅๆพ็คบโๆญฃๅธธ่ฟ่กโ๏ผๅ SQL Server ๅฐๅจๅฎนๅจไธญ่ฟ่ก๏ผๅนถไพฆๅฌโ็ซฏๅฃโๅไธญๆๅฎ็็ซฏๅฃ๏ผๆ็ฐๅจๆฏๅ
ณ้ญ็ถๆ๏ผๅฏไปฅไฝฟ็จ docker start CONTAINER ID ้ๆฐๅฏๅจ ๏ผ ใ ๆดๆน SA ๅฏ็ SA ๅธๆทๆฏๅฎ่ฃ
่ฟ็จไธญๅจ SQL Server ๅฎไพไธๅๅปบ็็ณป็ป็ฎก็ๅใ ๅๅปบ SQL Server ๅฎนๅจๅ๏ผ้่ฟๅจๅฎนๅจไธญ่ฟ่ก echo $SA_PASSWORD๏ผๅฏๅ็ฐๆๅฎ็ SA_PASSWORD ็ฏๅขๅ้ใ ๅบไบๅฎๅ
จ่่๏ผ่ฏท่่ๆดๆน SA ๅฏ็ ใ ้ๆฉ SA ็จๆท่ฆไฝฟ็จ็ๅผบๅฏ็ ใ ไฝฟ็จ docker exec ่ฟ่กsqlcmd ๏ผไปฅไฝฟ็จ Transact-SQL ๆดๆนๅฏ็ ใ ๅจไธ้ข็็คบไพไธญ๏ผๅฐๆงๅฏ็ \u003cYourStrong!Passw0rd\u003eๅๆฐๅฏ็ \u003cYourNewStrong!Passw0rd\u003e ๆฟๆขไธบไฝ ่ชๅทฑ็ๅฏ็ ๅผใ sudo docker exec -it sqlserver /opt/mssql-tools/bin/sqlcmd \\ -S localhost -U SA -P \"\u003cYourStrong@Passw0rd\u003e\" \\ -Q 'ALTER LOGIN SA WITH PASSWORD=\"\u003cYourNewStrong@Passw0rd\u003e\"' ่ฟๆฅ SQL Server ไธๅๆญฅ้ชคๅจๅฎนๅจๅ
้จไฝฟ็จ SQL Server ๅฝไปค่กๅทฅๅ
ท sqlcmd ๆฅ่ฟๆฅ SQL Serverใ ไฝฟ็จ docker exec -it ๅฝไปคๅจ่ฟ่ก็ๅฎนๅจๅ
้จๅฏๅจไบคไบๅผ Bash Shellใ ๅจไธ้ข็็คบไพไธญ๏ผsqlserver ๆฏๅจๅๅปบๅฎนๅจๆถ็ฑ โname ๅๆฐๆๅฎ็ๅ็งฐใ sudo docker exec -it sql1 \"bash\" ๅจๅฎนๅจๅ
้จไฝฟ็จ sqlcmd ่ฟ่กๆฌๅฐ่ฟๆฅใ ้ป่ฎคๆ
ๅตไธ๏ผsqlcmd ไธๅจ่ทฏๅพไนไธญ๏ผๅ ๆญค้่ฆๆๅฎๅฎๆด่ทฏๅพใ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P \"\u003cYourNewStrong@Passw0rd\u003e\" ๅฆๆๆๅ๏ผๅบไผๆพ็คบ sqlcmd ๅฝไปคๆ็คบ็ฌฆ๏ผ1\u003e ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:4","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"ๅฉ็จNavicatๅฏ่งๅๅทฅๅ
ท่ฟๆฅSql Server ไธ่ฝฝ navicat ๅบ็จ้ๆฉSQL Serverๆๅก๏ผ่พๅ
ฅ่ฟๆฅๅใไธปๆบใ็จๆทๅใๅฏ็ ่ฟ่ก่ฟๆฅใ Navicat่ฟๆฅSQLServer ๆ็คบ๏ผ ๅฏ็ ไธๅฎไธ่ฆๅกซ้๏ผๅฆๆๅฏ็ ๅกซ้๏ผไผๅบ็ฐไปฅไธ้่ฏฏ(ไธๅฎ่ฆๅญฆไผๅปDocker้้ขๆฅ็LOG): DockerๆฅๅฟLOG ๆณจๆ๏ผ ๅๅปบsa่ดฆๅทๆถๅ็ๅฏ็ ็ๅทฆๅณ\u003c\u003eไธคไธชๅฐๆฌๅทไนๆฏๅฑไบๅฏ็ ็ ๆๅฐฑๆฏๅจๅฎ้
ๆไฝไธญ็ฏไบๅฆๆญคไฝ็บง็้่ฏฏ๏ผๆไปฅ้ด๏ผ ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:5","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Technology"],"content":"ๆป็ป ่ถๅชๅ่ถๅนธ่ฟ! ไปฅไธๅฐฑๆฏๆฌๆฌกๅไบซ็ๅจMacไธๅฆไฝไฝฟ็จ SQL Server ็่ฏฆ็ปๆ็จ,ๆไปฌไธ่ตท่ฎจ่ฎบ๏ผๅฆๆๅช้ๆๅ็ไธๅฅฝ็ๅฐๆน๏ผ่ฟๅธๆๅคงๅฎถๆๅบๆฅ๏ผๅจไธๆน่ฏ่ฎบๅบ็่จ๏ผๆๅ ไปฅไฟฎๆญฃ๏ผ ","date":"2022-08-31","objectID":"/blog/20220831_sqlserver/:0:6","tags":["study","Docker","SQLServer","Mac"],"title":"Macไฝฟ็จSQLServerๆฐๆฎๅบ","uri":"/blog/20220831_sqlserver/"},{"categories":["Java"],"content":"Javaๅญฆไน ่ทฏ็บฟ","date":"2022-08-13","objectID":"/blog/20220813_route/","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Java ๅญฆไน ่ทฏ็บฟ ","date":"2022-08-13","objectID":"/blog/20220813_route/:0:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅ่จ ้ฆๅ
ๅข๏ผๆไปฌ่ฆไบ่งฃ Java ็ๅบ็จๅบๆฏๅๅฐฑไธๆนๅ๏ผ็็ๅ่ชๅทฑ็ๅญฆไน ็ฎ็ๆฏๅฆไธ่ด๏ผ็ฎๅ๏ผJava ็ๅฒไฝ้ๆฑๅค๏ผๆฏๅๅฐๅผๅ็ไธปๆต็ผ็จ่ฏญ่จ๏ผๅ่ฝๅผบๅคง๏ผ่ฟๆฏๅพๅผๅพๅญฆไน ็ใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:1:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 1๏ผJava ๅ
ฅ้จ ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ๅนๅ
ปๅ
ด่ถฃใๅฟซ้ไธๆ ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅๆๅๅค ๅๅคๅฅฝไธๆฌพๅจ็บฟใ้ๆถ้ๅฐๅไปฃ็ ็ๅทฅๅ
ท๏ผไธ็จๅจๆฌๅฐๅปๅฎ่ฃ
ๅ้
็ฝฎ๏ผๆฏๅๅญฆ่
็ๅฅฝๅธฎๆ ๆจ่็ฝ็ซ - ่้ธๅทฅๅ
ท ๅๅคไธๆฌพ่ฎฐ็ฌ่ฎฐ็่ฝฏไปถ๏ผๅญฆ็ผ็จ็่ฟ็จไธญ่ๅธ็ๆ่ทฏใ่ชๅทฑ้ๅฐ็้ฎ้ขใ่งฃๅณ้ฎ้ข็ๆนๆณใๅฟๅพๆๆใ้ๅฐ็ๅฅฝ่ตๆ๏ผ้ฝ่ฆ่ฎฐไธๆฅๅฆ๏ผๅฅฝ่ฎฐๆงไธๅฆ็็ฌๅคด๏ผๅฏไปฅๅธฎๅฉไฝ ไบๅๅๅใ ๆจ่่ฝฏไปถ - Typora ๆจ่ไฝฟ็จ Markdown ่ฏญๆณ็ผๅ๏ผๆ็ๆ็จๆ็ซ ๏ผ ๆณๅญฆๅฅฝ็ผ็จ๏ผๅซ่ไปฃ็ ๏ผ่ฆๅคๅ๏ผๆ่ฟๅฅ่ฏๅปๅฐ่ๅญ้ใ ้่ง้ขๅๆพ่ตๆ็ๅฐๆๅทง๏ผๅค็่ฏ่ฎบๅบใๅค็้ๅฃ่ฏ่ฎบๅบ๏ผไธ่ฆ็่ฟๆ็่ง้ขใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Java ็ผ็จๅบ็ก๏ผ45 ๅคฉ๏ผ ็ฅ่ฏ Java ็น็น๏ผ็ไธๆๆฒกไบ๏ผๅซ่๏ผ๏ผ ็ฏๅขๆญๅปบ Java ๅบ็ก่ฏญๆณ ๆฐๆฎ็ฑปๅ ๆต็จๆงๅถ ๆฐ็ป ้ขๅๅฏน่ฑก ๆนๆณ ้่ฝฝ ๅฐ่ฃ
็ปงๆฟ ๅคๆ ๆฝ่ฑก็ฑป ๆฅๅฃ ๆไธพ ๅธธ็จ็ฑป String ๆฅๆๆถ้ด ้ๅ็ฑป ๆณๅ ๆณจ่งฃ ๅผๅธธๅค็ ๅค็บฟ็จ IO ๆต ๅๅฐ ๅญฆไน ๅปบ่ฎฎ ไธๅฎ่ฆๆ็ปญๅญฆไน ๏ผไธ่ฝๆญ๏ผ ่ท็ไนฆไธ็ไพๅญๆฒไปฃ็ ๅ๏ผ่ชไธป็ผๅไปฃ็ ๏ผๅนถๅฎๆ่ฏพๅ็ปไน ใ ่ตๆบ ่ง้ข โญ ้ฉ้กบๅนณ - ้ถๅบ็ก 30 ๅคฉๅญฆไผ Java๏ผ900 ๅค้๏ผ้กบๅบๅฎๆๅพๅ็๏ผๆฏไธช็ฅ่ฏ็ๆญฃ็ๆ็ขไบ๏ผ้ไฟใๆ็คบไพใๆๅฎๆใๆๆๆณ๏ผ ๆๆกฃ โญ ่้ธๆ็จ๏ผๅฏไปฅๅจ็บฟ็ปไน ๏ผ ๅป้ชๅณฐ Java ๆ็จ ไนฆ็ฑ ใHead First Javaใ ๅจ็บฟๆธธๆ Codegym๏ผ็ฉ็ฉๅๅ ๅ
ณๅนๅ
ปๅ
ด่ถฃไธ้๏ผไฝๅ้ขๆถ่ดนไบ๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Java 8๏ผ3 ๅคฉ๏ผ ็ฅ่ฏ Stream API Lambda ่กจ่พพๅผ ๆฐๆฅๆๆถ้ด API ๆฅๅฃ้ป่ฎคๆนๆณ ่ตๆบ ่ง้ข โญ ๅฎ็บขๅบท - ๅ
จ็ฝๆๅ
จJava้ถๅบ็กๅ
ฅ้จๆ็จ๏ผๅช็ Java 8 ้จๅๅณๅฏ๏ผ ๆๆกฃ โญ ่้ธๆ็จ ไนฆ็ฑ ใJava 8 ๅฎๆใ ๅทฅๅ
ท โญ ๅจ็บฟ็ผๅ่ฟ่ก Java 8 ้กน็ฎ Java 8 ๅฐไปฃ็ ็ๆฎต ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅฐพๅฃฐ ๅญฆๅฎไบ Java ๅบ็กๅ๏ผๆไบๅๅญฆไผๆๅฐ่ฟท่ซไบๅ๏ผๆ่งๅฅฝๅๅฅไนๅไธๅบๆฅ๏ผไธ็ฅ้ไธไธๆญฅๅไปไน๏ผๆ่ฟไธ่บซ็ๆฌ้ข่ฏฅๅฆไฝๆฝๅฑๅ๏ผ ไธ่ฆๆ
๏ผไนไธ่ฆๆฅ็ๅปๅญฆๆฐๆๆฏ๏ผๆฅไธๆฅๆไปฌ่ฆๅค็จ Java ๆฅๅไปฃ็ ไบ๏ผๅทฉๅบๅบ็ก๏ผไฝๆฏๅไปไนๅข๏ผ ๅฝ็ถๆฏๆฐๆฎ็ปๆๅ็ฎๆณ๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:2:5","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 2๏ผๅทฉๅบๅบ็ก ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ๆณๅญฆๅฅฝ็ผ็จ๏ผ่ฎก็ฎๆบๅบ็ก็ฅ่ฏ่ฆๅญฆๅฅฝใ ๆฏๅฆ็ฎๆณ๏ผๆฏ็จๅบๅ็็ต้ญใๅญฆๅฅฝ็ฎๆณๆๅฉไบๆไปฌ็่งฃ็จๅบใๅผๆๆ่ทฏ๏ผๅ ๆญคไนๆฏๅพๅคๅ
ฌๅธ้ข่ฏๆถ่ๅฏ็ๅ
ณ้ฎ๏ผๅจๆพๅทฅไฝๅ๏ผ่ฟๆฏ่ฆๅทไธชไธ็พ้็ฎๆณ้ข็ฎ็ใ ๆไปฌ่ฟไธช้ถๆฎต็็ฎๆ ๆฏ๏ผ็็ปไฝฟ็จ Java ่ฏญ่จๆฅ็ผๅ็จๅบ๏ผๅทฉๅบ Java ็ๅบ็กใ ้ฃ็ดๆฅ็จ Java ๆฅๅ็ฎๆณ้ข็ฎ๏ผไธไธพไธคๅพ๏ผๅฒไธ็พๅ๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Java ๅบ็ก๏ผ30 ๅคฉ๏ผ ๅญฆไน ๅปบ่ฎฎ ๅปบ่ฎฎๅคงๅฎถๅป้
่ฏป ใJava ๆ ธๅฟๆๆฏๅท 1ใ๏ผ่ฟๆฌไนฆๅ ช็งฐ็ปๅ
ธ๏ผๆฏๅธฎๅฉไฝ ๅคไน ๅทฉๅบ Java ็ไธไบไน้๏ผๅ
ถไธญๅพๅฝข็้ข็ซ ่ๅฏไปฅ้ๆฉไธ็ใ ไนๅๅฏไปฅๅท็ๅฎข็ Java ็ปไน ้ข๏ผๆฃ้ช่ชๅทฑ็ๆฐดๅนณ๏ผๆๅฝๆถๅทไบไธค้ใ ่ตๆบ ไนฆ็ฑ โญใJava ๆ ธๅฟๆๆฏๅท 1ใ ็ปไน โญ ็ๅฎข้ขๅบ ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๆฐๆฎ็ปๆไธ็ฎๆณ ็ฅ่ฏ ๆถ้ด / ็ฉบ้ดๅคๆๅบฆๅๆ ๆฐๆฎ็ปๆ ๆฐ็ป ๅญ็ฌฆไธฒ ้ๅ ๆ ้พ่กจ ้ๅ ๅๅธ่กจ ไบๅๆ ็ฎๆณ ๆๅบ ๅๆ้ ๆฅๆพ ๅๆฒป ๅจๆ่งๅ ้ๅฝ ๅๆบฏ ่ดชๅฟ ไฝ่ฟ็ฎ DFS BFS ๅพ ๅญฆไน ๅปบ่ฎฎ ๅญฆ็ฎๆณไธๅฎ่ฆๅคๆ่ใๅค็ปไน ๏ผ๏ผ๏ผ ๅจๅคไน Javaใๅทฉๅบๅบ็ก็่ฟ็จไธญ๏ผๆฏๅคฉๅฏไปฅๅๆ็จ Java ๅ 2 - 3 ้็ฎๆณ้ข็ฎใ ไธ็จๆ
ๅฟ็ไธๆ๏ผ็ดๆฅ่ฟๅ
ฅ LeetCode ๅญฆไน ๆฟๅ LeetBook๏ผๆไพไบๅ
่ดน็ๆ็จ๏ผๆๅญใๅพ่งฃใๅจ็ป่ฎฒ็ฎๆณใๅจ็บฟ็ปไน ๅบๆๅฐฝๆ๏ผไป 0 ๅผๅง๏ผ่ท็ๅญฆไน ๅบ็ก็ฅ่ฏใ่ท็ๆ็จๅทไธไบๅ็ฑป้ข็ฎ๏ผๅนๅ
ป็ฎๆณๆ่ทฏใ ไนๅๅ็ฑ็ฎๅๅฐๅคๆใ็ฑ้่ฟ็้ซๅฐไฝ๏ผ่ชไธปๅท้ข๏ผๅค็้ข่งฃ๏ผไธพไธๅไธใ ๆๆกไปถ็ๆๅไนๅฏไปฅ่ฏ็ๅไธ็ซ่ต๏ผๆฒกไปไน้จๆง๏ผๅฏไปฅๅธฎๅฉไฝ ้ไธญ็ฒพ็ฅ๏ผ่ไธๅจ่ต็้ข็ฎ่ฟๆฏๆบๅๅฅฝ็~ ่ตๆบ ๆ็ซ โญ ๅทไบ 1000 ๅค้็ฎๆณ้ข๏ผไธ็นๅฟๅพ๏ผ้ฑผ็ฎๅๅ ๅจ็บฟๆ็จ โญ LeetCode LeetBook ๅจ็บฟๅท้ข โญ LeetCode ไนฆ็ฑ โญใๅฐ็ฐ็ๆผซ็ป็ฎๆณใ โญใๅๆ Offerใ ใ็จๅบๅไปฃ็ ้ข่ฏๆๅใ ๅพ่งฃ็ฎๆณๆฐๆฎ็ปๆ LeetCode 101๏ผC++๏ผ LeetCode ้ข่งฃ๏ผC++๏ผ LeetCode Cookbook๏ผGo ่ฏญ่จ๏ผ ่ง้ข ๅฐ็ก
่ฐท Java ๆฐๆฎ็ปๆไธ็ฎๆณ๏ผ้พๅบฆๆฏ้ข่ฏ็่ฆๆฑๅคงไธไบ๏ผ้ๅๅธๆๆดๅ
จ้ขๅญฆไน ็ๆๅ๏ผ Leetcode ็้ข่งฃๆ ๅทฅๅ
ท VisuAlgo ๆฐๆฎ็ปๆๅ็ฎๆณๅจๆๅฏ่งๅ ๆฐๆฎ็ปๆๅฏ่งๅ ็ฝ็ซ ไบๅ้ๅญฆ็ฎๆณ ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"่ฎก็ฎๆบๅบ็ก ็ฅ่ฏ ่ฎก็ฎๆบ็ฝ็ป HTTP / HTTPS ๅ่ฎฎ ็ฝ็ปๆจกๅ UDP / TCP ๅ่ฎฎ ็ฝ็ปๅฎๅ
จ ๅๅ่งฃๆ ๆไฝ็ณป็ป ่ฟ็จใ็บฟ็จ ่ฟ็จ / ็บฟ็จ้ด้่ฎฏๆนๅผ ่ฟ็จ่ฐๅบฆ็ฎๆณ ่ฟ็จ / ็บฟ็จ็ถๆ ๆญป้ ๅ
ๅญ็ฎก็ ๅญฆไน ๅปบ่ฎฎ ๅจๅทฉๅบๅบ็กๆ้ด๏ผๆๅปบ่ฎฎๅคงๅฎถๅคๅปไบ่งฃ่ฎก็ฎๆบๅบ็ก็ฅ่ฏ๏ผๆฏๅฆๆไฝ็ณป็ปใ่ฎก็ฎๆบ็ฝ็ปใ ไฝ่ฟไธๅ็ฅ่ฏ่ฏดๅฎ่ฏๆบๆฏ็ฅ็๏ผๅฏนๅง๏ผไฝ ่ฏด่ฏดๆ็ฐๅจ้กน็ฎ้ฝไธไผๅ๏ผไฝ ๅ่ฎฉๆ็่ฟไบ็่ฎบ๏ผๆฏไธๆฏๆณ่ฎฉๆๅคด็งใ ๆ็ๅปบ่ฎฎๆฏ๏ผๅฏไปฅๅ
็ๆ่ถฃ็่ฏพๅคไนฆ๏ผๆฏๅฆใๅพ่งฃ HTTPใ็ญ็ญ๏ผๅฏนๅบ็ก็ฅ่ฏๅ
ๆไธชๅคง่ด็ๅฐ่ฑก๏ผ็ญๅ้ขๆๆถ้ดไบๅ็ณป็ปๅญฆไน ใ ๆฏๅฆ่ฟๅจๆ กๅญๅฐฑ่ท็ๅญฆๆ ก็่ฟๅบฆๅญฆไน ๅฐฑๆ๏ผ่ชๅญฆ็่ฏๅฏไปฅ็ไธ ใ่ฎก็ฎๆบ็ฝ็ปๅพฎ่ฏพๅ ใใ ใๆธ
ๅๆไฝ็ณป็ปๅ็ใ่ง้ข๏ผๆๅฎๅ็ๅฐไผไผด๏ผ่ฝ็ๆๅคง้ปไนฆๅฐฑๆดๅฅฝไบใ ่ตๆบ ่ง้ข ใ่ฎก็ฎๆบ็ฝ็ปๅพฎ่ฏพๅ ใ ใๆธ
ๅๆไฝ็ณป็ปๅ็ใ ไนฆ็ฑ โญใๅพ่งฃ HTTPใ ใ็ฝ็ปๆฏๆๆ ท่ฟๆฅ็ใ โญใๅพ่งฃ TCP / IPใ ใ็ผ็ ใ ใ30ๅคฉ่ชๅถๆไฝ็ณป็ปใ ใ่ฎก็ฎๆบ็ฝ็ป-่ช้กถๅไธๆนๆณใ๏ผ้พๅบฆ่พๅคง๏ผไธๆจ่ๆฐๆ็๏ผ ใ็ฐไปฃๆไฝ็ณป็ปใ๏ผ้พๅบฆ่พๅคง๏ผไธๆจ่ๆฐๆ็๏ผ ใๆทฑๅ
ฅ็่งฃ่ฎก็ฎๆบ็ณป็ปใ๏ผ้พๅบฆ่พๅคง๏ผไธๆจ่ๆฐๆ็๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅฐพๅฃฐ ๅทฉๅบๅบ็ก่ฆ่ฑ่ณๅฐ 1 ไธชๆ็ๆถ้ด๏ผๅฝไฝ ่ฏปๅฎใJava ๆ ธๅฟๆๆฏๅท1ใๅนถไธไธ็จๆฅ่ฏขๆๆกฃไน่ฝ็็ปๅฐ็จ Java ๅ้ขๆถ๏ผๅฐฑๅฏไปฅๆฅ็ๅพไธไบใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:3:5","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 3๏ผJava ไผไธๅผๅๅบ็ก ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ้ขๅ่ช่ต็ผ็จ๏ผๅญฆไน ๅฎ้
ๅทฅไฝ่ฆ็จ็ๆๆฏ๏ผๅนถ่ฝ ็ฌ็ซ ๅๅบไธไธชๅ
ทๆๅฎๆดๅ่ฝ็ Java Web ้กน็ฎใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"MySQL ๆฐๆฎๅบ๏ผ7 ๅคฉ๏ผ ไผไธไธญๅคง้จๅไธๅกๆฐๆฎ้ฝๆฏ็จๅ
ณ็ณปๅๆฐๆฎๅบๅญๅจ็๏ผๅ ๆญคๆฐๆฎๅบๆฏๅๅฐๅผๅๅๅญฆ็ๅฟ
ๅคๆ่ฝ๏ผๅ
ถไธญ MySQL ๆฐๆฎๅบๆฏ็ฎๅ็ไธปๆต๏ผไนๆฏ้ข่ฏๆถ็้็นใ ็ฅ่ฏ ๅบๆฌๆฆๅฟต MySQL ๆญๅปบ SQL ่ฏญๅฅ็ผๅ ็บฆๆ ็ดขๅผ ไบๅก ่ฎพ่ฎกๆฐๆฎๅบ่กจ ๆง่ฝไผๅ ๅญฆไน ๅปบ่ฎฎ ๅ
ถไธญ๏ผSQL ่ฏญๅฅ็ผๅ ๅ ่ฎพ่ฎกๆฐๆฎๅบ่กจ ่ฟไธคไธช่ฝๅไธๅฎ่ฆๆ๏ผ ๆฏๅฆ่ฎฉไฝ ๅไธไธชๅญฆ็็ฎก็็ณป็ป๏ผไฝ ่ฆ่ฝๆณๅฐ้่ฆๅชไบ่กจ๏ผๆฏๅฆๅญฆ็่กจใ็ญ็บง่กจ๏ผๆฏไธช่กจ้่ฆๅชไบๅญๆฎตใๅญๆฎต็ฑปๅใ ่ฟๅฐฑ่ฆๆฑๅคงๅฎถๅคๅ SQLใๅคๆ นๆฎๅฎ้
็ไธๅกๅบๆฏๅป็ปไน ่ฎพ่ฎก่ฝๅใ ่ตๆบ ่ง้ข โญ ่ๆ - mysqlๅ
ฅ้จๅบ็ก + ๆฐๆฎๅบๅฎๆ๏ผ่พๆฐใๅ
ๅฎน็ธๅฏน็ฒพ็ผ๏ผๆไน ้ข๏ผ ๅฐ็ก
่ฐท - MySQLๅบ็กๆ็จ๏ผๅฐๅงๅง่ฎฒ่ฏพ๏ผไฝๆ่ง้ณ่ดจไธ่ฌ๏ผ ๅจ็บฟ็ปไน โญ SQL ่ชๅญฆ็ฝ โญ SQL ๅจ็บฟ่ฟ่ก ๆๆกฃ SQL - ่้ธๆ็จ MySQL - ่้ธๆ็จ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅผๅๆกๆถ๏ผ60 ๅคฉ๏ผ Java ไนๆไปฅ่ฝๆไธบไธปๆต็ไผไธๅผๅ่ฏญ่จ๏ผๅพๅคงไธ้จๅๅๅ ๆฏๅฎๅฎๅ็ๆกๆถ็ๆ๏ผ็จๅฅฝๆกๆถ๏ผไธไป
่ฝๅคๅคงๅคงๆๅๅผๅๆ็๏ผ่ฟ่ฝๆ้ซ้กน็ฎ็็จณๅฎๆงใๅๅฐ็ปดๆคๆๆฌใ ๅผๅๆกๆถๆฏๅๅฐๅผๅๅทฅไฝไธญไธๅฏๆ็ผบ็๏ผไนๆฏ้ข่ฏ่ๅฏ็้็น๏ผไธๅฎ่ฆๅฅฝๅฅฝๅญฆ๏ผ ไธ็ฅ้ Java ่ฝๅไปไน็ๆๅไปฌ๏ผๅญฆๅฎๅผๅๆกๆถ๏ผๅฐฑไผๆ็ญๆกๅฆใ ไธ้ข็ปๅคงๅฎถๆจ่็้ฝๆฏไผไธไธญๅบ็จๆๅค็ไธปๆตๅผๅๆกๆถ๏ผ็ฅ่ฏ็นๆฏ่พ้ถ็ข๏ผๅฐฑๆพๅจไธ่ตท่ฎฒไบใ ็ฅ่ฏ Java Web ๆ่ฟฐ๏ผJava ็ฝ้กตๅบ็จๅผๅๅบ็ก ๅ็ซฏๅบ็ก XML JSON Servlet Filter Listener JSP JSTL Cookie Session Spring 5 ๆ่ฟฐ๏ผJava ่ฝป้็บงๅบ็จๆกๆถ IOC AOP ไบๅก SpringMVC ๆ่ฟฐ๏ผJava ่ฝป้็บง web ๅผๅๆกๆถ ไปไนๆฏ MVC๏ผ ่ฏทๆฑไธๅๅบ Restful API ๆฆๆชๅจ ้
็ฝฎ ๆง่ก่ฟ็จ MyBatis ๆ่ฟฐ๏ผๆฐๆฎ่ฎฟ้ฎๆกๆถ๏ผๆไฝๆฐๆฎๅบ่ฟ่กๅขๅ ๆนๆฅ็ญๆไฝ ๅขๅ ๆนๆฅ ๅ
จๅฑ้
็ฝฎ ๅจๆ SQL ็ผๅญ ๅๅ
ถไปๆกๆถ็ๆดๅ ้ๅๅทฅ็จ MyBatis Plus ๆ่ฟฐ๏ผMybatis ็ๅขๅผบๅทฅๅ
ท๏ผ่ฝๅค็ฎๅๅผๅใๆ้ซๆ็ ๅผๅ
ฅ ้็จ CRUD ๆกไปถๆ้ ๅจ ไปฃ็ ็ๆๅจ ๆไปถๆฉๅฑ ่ชๅฎไนๅ
จๅฑๆไฝ SpringBoot 2 ๆ่ฟฐ๏ผ็ฎๅ Spring ๅบ็จ็ๅๅงๆญๅปบไปฅๅๅผๅ่ฟ็จ๏ผๆ้ซๆ็ ๅธธ็จๆณจ่งฃ ่ตๆบๆดๅ ้ซ็บง็นๆง ๆฌๅฐ็ญ้จ็ฝฒ Spring Security ๆ่ฟฐ๏ผSpring ็ๅฎๅ
จ็ฎก็ๆกๆถ ็จๆท่ฎค่ฏ ๆ้็ฎก็ Maven / Gradle ๆ่ฟฐ๏ผ้กน็ฎ็ฎก็ๅทฅๅ
ท ๆๅปบ ไพ่ต็ฎก็ ๆไปถ ้
็ฝฎ ๅญ็ถๅทฅ็จ ๅญฆไน ๅปบ่ฎฎ ็ฑไบๆๆฏ่พๅค๏ผไธๆกๆถไน้ดๅญๅจไธๅฎ็่็ณป๏ผๅ ๆญคๅปบ่ฎฎๅคงๅฎถ็ๅไธ็ณปๅ็่ง้ขๆ็จ๏ผๅฐ็ก
่ฐทใ็็ฅ่ฏด็ญ็ญ้ฝๅฏไปฅ๏ผ๏ผไปฅไฟ่ฏๅญฆไน ๅ
ๅฎน็่ฟ็ปญไปฅๅไฝ้ชไธ็ไธ่ดใ ๅญฆ่ฟไบๆๆฏ็ๆถๅ๏ผๅไธไธ่ฝๆ ๏ผไธๅฎ่ฆๅค่ฎฐ็ฌ่ฎฐ๏ผๅนถไธ่ท็่ๅธๅไปฃ็ ใๅ็้จๅไธ่ฆๅคช่ฟ็บ ็ป๏ผๅ
ไปฅ่ฝ่ท็ๆฒๅบไปฃ็ ใๅๅบๅฏ่ฟ่ก็้กน็ฎไธบไธป๏ผๆไบไธ่ฅฟๅๅบๆฅไน่ฝๅธฎๅฉไฝ ๆดๅฅฝๅฐ็่งฃ็่ฎบใ ๅญฆไน ้กบๅบๆบ้่ฆ็๏ผๅปบ่ฎฎๆๆๆจ่็้กบๅบๅญฆ๏ผไธ่ฆไธไธๆๅฐฑๅญฆ SpringBootใๅชๆๅ
ๅญฆไน ไธ่ชๅทฑๆดๅๆกๆถ็ๆนๆณ๏ผๆ่ฝๅธฎไฝ ็่งฃ SpringBoot ่งฃๅณ็้ฎ้ข๏ผๆๅๅฐๅฎ็ๆนไพฟๅ้ซๆใ Maven / Gradle ๅฝๅทฅๅ
ท็จๅฐฑๅฅฝ๏ผ้ข่ฏๅบๆฌไธ้ฎ๏ผ่ท็ๆกๆถๆ็จๅป็จๅฐฑ่กไบ๏ผๅ
ไธ็จ่ฑๅคชๅคๆถ้ดๅปๆทฑๅ
ฅๅญฆใ ่ตๆบ ่ง้ข๏ผๆ้กบๅบ็๏ผ โญ ๅฐ็ก
่ฐทๆๆฐ็ JavaWeb ๅ
จๅฅๆ็จ๏ผๅ็ซฏ้จๅๆๅฅฝไน็ไธ๏ผ โญ ๅฐ็ก
่ฐท - Spring 5 ๆกๆถๆๆฐ็ๆ็จ๏ผidea็๏ผ โญ ๅฐ็ก
่ฐท - SpringMVC 2021 ๆๆฐๆ็จ โญ ๅฐ็ก
่ฐท - MyBatis ๅฎๆๆ็จๅ
จๅฅๅฎๆด็ โญ ๅฐ็ก
่ฐท - MyBatisPlus ๆ็จ Maven ้ถๅบ็กๅ
ฅ้จๆ็จ๏ผๆไธๆ Maven ๅฏไปฅ็็๏ผ โญ ้ทไธฐ้ณ 2021 ็ SpringBoot2 ้ถๅบ็กๅ
ฅ้จ ๅฐ็ก
่ฐท - SpringSecurity ๆกๆถๆ็จ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅผๅ่ง่๏ผ3 ๅคฉ๏ผ ๅผๅไธ่ง่๏ผๅไบไธค่กๆณชใ ๅผๅ่ง่ๆฏๅข้ๅผๅไธญๅฟ
้กป้ตๅฎ็๏ผๆๅฉไบๆ้ซ้กน็ฎ็ๅผๅๆ็ใ้ไฝ็ปดๆคๆๆฌใ ็ฅ่ฏ ไปฃ็ ่ง่ ไปฃ็ ้ฃๆ ผ ๅฝๅ ๅ
ถไป่งๅ ๆไบค่ง่ ๅญฆไน ๅปบ่ฎฎ ็ฎๅ่ฟไธ้ๅคงๅๅข้็่ง่ๆๅๅฐฑๅฅฝไบ๏ผไปฅๅๅ้กน็ฎ็ๆถๅ่ฝๆณ่ตทๆฅ็่ฏๅฐฑๅปไฝฟ็จ๏ผๆ่
ไปไนฆไธญใ็ฝไธๆฅ่ง่๏ผๅๅป้ตๅฎใ ้กน็ฎๅๅพๅคไบ๏ผ่ช็ถไผๅ
ปๆๅฅฝ็ไน ๆฏ๏ผไธ็จๅปๆๅป่ฎฐ๏ผๆฏ็ซๆฏไธชๅข้่ง่ไนไธๅฎๅ
จ็ธๅ๏ผ่ไบไนๆฒก็จ๏ผใ ่ตๆบ ไนฆ็ฑ โญ ้ฟ้ๅทดๅทด Java ๅผๅๆๅ๏ผๆ็ดขใJavaๅผๅๆๅใ๏ผ ่ง้ข ๅๅฑฑ็ใJavaๅผๅๆๅใ็ฌๅฎถ่ฎฒ่งฃ ๆๆกฃ Google Java Style Guide๏ผ่ฐทๆญ Java ไปฃ็ ่ง่๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Git๏ผ3 ๅคฉ๏ผ ๆญคๅๅคงๅฎถๅฏ่ฝๅฌ่ฏด่ฟ GitHub๏ผไธๆต็ไปฃ็ ๅผๆบๆ็ฎกๅนณๅฐใ Git ๅๅฎๅฏไธไธๆ ท๏ผๆฏไธไธช็ๆฌๆงๅถๅทฅๅ
ท๏ผๅฏไปฅๆดๅฅฝๅฐ็ฎก็ๅๅ
ฑไบซ้กน็ฎไปฃ็ ๏ผๆฏๅฆๆ่ชๅทฑ็ไปฃ็ ไผ ๅฐ GitHub ไธใๆ่
ไป่ฟ็จไธ่ฝฝใ ๆ ่ฎบ่ชๅทฑๅ้กน็ฎใ่ฟๆฏๅข้ๅผๅ๏ผGit ้ฝๆฏ็ฐๅจไธๅฏๆ็ผบ็็ฅๅจใ ็ฅ่ฏ ๅทฅไฝๅบ ๅๆฏ ไปฃ็ ๆไบคใๆจ้ใๆๅใๅ้ใ้็ฝฎ ๅๆฏๆไฝ ไปฃ็ ๅๅนถใ่งฃๅณๅฒ็ช ๆ ็ญพ cherry-pick ๅญฆไน ๅปบ่ฎฎ ๆฏไธชๅฝไปค่ท็ๆฒไธ้๏ผๆไธชๅคง่ด็ๅฐ่ฑก๏ผไผ็จๅณๅฏ๏ผ็จ็ๅคไบ่ช็ถ็ๆไบใ ่ตๆบ ่ง้ข โญใๅฐ็ก
่ฐทใ5hๆ้Gitๅ
จๅฅๆ็จไธจ2021ๆๆฐIDEA็ ไนฆ็ฑ ็ดๅญ้ฝ่ฝๆ็ Git ๅ
ฅ้จ โญ GitHub ๆผซๆธธๆๅ ๆๆกฃ GitHub ๅฎๆนๆๆกฃ ๆธธๆ Learning Git Branching ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:5","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Linux๏ผ10 ๅคฉ๏ผ ไผไธไธญ็ๅพๅคๅๅๅฐ้กน็ฎ้ฝๆฏ้จ็ฝฒๅจ Linux ๆๅกๅจไธ็๏ผๅ ๆญคๅพๆๅฟ
่ฆ็ๆ Linux ็ๆไฝๅ่ๆฌ็็ผๅใ ๅ้ขๅญฆๅพฎๆๅกใๅญฆๆถๆ้ฝๆฏๅจๅคๅฐๆๅกๅจๆไฝ๏ผๅฆๆไฝ ไธ็ๆ Linux๏ผไผๆ็นๅๅใ ็ฅ่ฏ Linux ็ณป็ปๅฎ่ฃ
็ฏๅขๅ้ ๆไปถ็ฎก็ ็จๆท็ฎก็ ๅ
ๅญ็ฎก็ ็ฃ็็ฎก็ ่ฟ็จ็ฎก็ ็ฝ็ป็ฎก็ ่ฝฏไปถๅ
็ฎก็ ๆๅก็ฎก็ ๆฅๅฟ็ฎก็ Linux ๅ
ๆ ธ ๅธธ็จๅฝไปค ๅธธ็จ็ฏๅขๆญๅปบ Shell ่ๆฌ็ผ็จ VIM ็ไฝฟ็จ ๅญฆไน ๅปบ่ฎฎ ๅคๅจๆๅฎ่ทต๏ผๅปบ่ฎฎ่ชๅทฑ่ดญไนฐไธๅฐไบๆๅกๅจ๏ผๅนถไธๅจๆฌๅฐๆญๅปบ Linux ่ๆๆบ็ฏๅขใ ไธๅฎ่ฆ่ชๅทฑไป 0 ๅผๅงๆๆฒๅฝไปคๅฎ่ฃ
่ฝฏไปถใ้จ็ฝฒๆๅก๏ผ็ๆๆดไธช้กน็ฎ็ไธ็บฟๆต็จใ ๆฏไธชๅฝไปค่ณๅฐ่ฆ่ท็ๆฒไธ้๏ผไบ่งฃๅฎไปฌ็ไฝ็จ๏ผๅนถ้่ฟ่ช็ถๅฐ็ปไน ๏ผ็ๆๅธธ็จ็ Linux ๅฝไปคใ ่ฎฐไธไฝๆฒกๅ
ณ็ณป๏ผ็จๆๆกฃๆฅๅฐฑ่กไบใ ๅ
ไผ็จ๏ผๅ็่งฃใ ่ตๆบ ่ง้ข โญ 2021 ้ฉ้กบๅนณ ไธๅจๅญฆไผLinux๏ผๅบไบ CentOS 7.6 ็ๆฌ่พๆฐ๏ผ ไนฆ็ฑ ใ้ธๅฅ็ Linux ็งๆฟ่ โโ ๅบ็ก็ฏใ๏ผ็ปๅ
ธ๏ผ ๆๆกฃ Linux ๅทฅๅ
ทๅฟซ้ๆ็จ๏ผๅบ็กใๅทฅๅ
ท่ฟ้ถใๅทฅๅ
ทๅ่๏ผ ๅฎๆ โญ ่ๆกฅไบ่ฏพ Linux ๅบ็กๅ
ฅ้จ ่
พ่ฎฏไบๅจๆๅฎ้ชๅฎค ้ฟ้ไบไฝ้ชๅฎ้ชๅฎค ้ฟ้ไบ็ฅ่กๅฎ้ชๅฎค ๅไธบไบๆฒ็ฎฑๅฎ้ชๅฎค ็คพๅบ Linux ไธญๅฝ ๅทฅๅ
ท โญ Linux ๅฝไปคๆ็ดข Linux ๅฝไปคๅคงๅ
จๆๅ Linux ๅฝไปค็คบไพ ๅฎๅก Linux ้ขๆฟ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:6","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅ็ซฏๅบ็ก๏ผ14 ๅคฉ๏ผ ่ฝ็ถ Java ็จๅบๅ้ข่ฏๆถๅบๆฌไธไผๅบ็ฐๅ็ซฏ็ธๅ
ณ้ฎ้ข๏ผไฝๆฏๅจไผไธไธญ๏ผๅพๅพ้่ฆๅๅ็ซฏ็จๅบๅ้
ๅๅฎๆๅทฅไฝใไผไธไบๅ็ซฏ๏ผไธไป
ๅฏไปฅๆ้ซไฝ ไปฌ็ๅไฝๆ็๏ผ่ฟ่ฝๆ้ซ่ชๅทฑๅฏนๆดไธช้กน็ฎ็ไบ่งฃๅๆๆงๅ๏ผ็่ณ่ฝ็ฌ็ซๅผๅๅบไธไธชๅฎๆด้กน็ฎ๏ผ่ฟ็นไนๆฏ่ฝ็ป้ข่ฏๅ ๅ็ใ ็ฅ่ฏ HTML CSS JavaScript Ajax Vue ๅญฆไน ๅปบ่ฎฎ ไธ้่ฆๅญฆไน ๅคชๅค็ๅ็ซฏๆๆฏ๏ผ็ๆไธๅบ็ก็ๅ็ซฏไธไปถๅฅ๏ผไบ่งฃๅ็ซฏๆฏๅฆไฝๅๅ็ซฏๅ้่ฏทๆฑๆฅๅๆฐๆฎไบคไบ็ไธ่ฌๅฐฑๅคไบใๆๆถ้ด็่ฏๅฏไปฅๅญฆไธ Vue ๏ผๆฏๆฏ่พๅฎนๆไธๆ็ไธปๆตๅ็ซฏๅผๅๆกๆถ๏ผVue + SpringBoot ่ฟๆฏๅพ้ฆ็ใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:4:7","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 4๏ผJava ไผไธๅผๅ่ฟ้ถ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ๅญฆไน ๆดๅคไผไธ็บงๅผๅๆๆฏๅ็ผ็จๆๆณ๏ผ่ฝๅค็ปๅๅค็งๆๆฏ๏ผ็ฌ็ซๅผๅๅบๆถๆๅ็็ๅฎๆด็ณป็ป๏ผ่งฃๅณๅฎ้
้ฎ้ข ใ ่ฆไบ่งฃไธบไปไน้่ฆ่ฟไธชๆๆฏ๏ผไปไนๆถๅ็จๅชไบๆๆฏ๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"่ฎพ่ฎกๆจกๅผ๏ผ21 ๅคฉ๏ผ ่ฎพ่ฎกๆจกๅผๆฏ่ฝฏไปถๅผๅไธญ่งฃๅณไธ็ฑป้ฎ้ข็้็จๆนๆณใ ไฝฟ็จ่ฎพ่ฎกๆจกๅผ่ฝ่ฎฉไฝ ๅๅบๆดไผ้
ใๅฏ็ปดๆค็ไปฃ็ ๏ผไนๆญฃๅ ๅฆๆญค๏ผๅพๅคๆกๆถๆบ็ ้ฝ็จๅฐไบ่ฎพ่ฎกๆจกๅผ๏ผไฝ ไธๅญฆๅพ้พ็ๆใ ็ฅ่ฏ ๅๅปบๅๆจกๅผ๏ผๅฏน่ฑกๅฎไพๅ็ๆจกๅผ๏ผๅๅปบๅๆจกๅผ็จไบ่งฃ่ฆๅฏน่ฑก็ๅฎไพๅ่ฟ็จ ๅไพๆจกๅผ ๅทฅๅๆนๆณๆจกๅผ ๆฝ่ฑกๅทฅๅ ๅปบ้ ่
ๆจกๅผ ๅๅๆจกๅผ ็ปๆๅๆจกๅผ๏ผๆ็ฑปๆๅฏน่ฑก็ปๅๅจไธ่ตทๅฝขๆไธไธชๆดๅคง็็ปๆ ้้
ๅจๆจกๅผ ็ปๅๆจกๅผ ่ฃ
้ฅฐๅจๆจกๅผ ไปฃ็ๆจกๅผ ไบซๅ
ๆจกๅผ ๅค่งๆจกๅผ ๆกฅๆฅๆจกๅผ ่กไธบๅๆจกๅผ๏ผ็ฑปๅๅฏน่ฑกๅฆไฝไบคไบ๏ผๅๅๅ่ดฃไปปๅ็ฎๆณ ่ฟญไปฃๅจๆจกๅผ ๆจกๆฟๆนๆณๆจกๅผ ็ญ็ฅๆจกๅผ ๅฝไปคๆจกๅผ ็ถๆๆจกๅผ ่ดฃไปป้พๆจกๅผ ๅคๅฟๅฝๆจกๅผ ่งๅฏ่
ๆจกๅผ ่ฎฟ้ฎ่
ๆจกๅผ ไธญไป่
ๆจกๅผ ่งฃ้ๅจๆจกๅผ ๅญฆไน ๅปบ่ฎฎ ๅ
็่งฃๆฆๅฟต๏ผไบ่งฃๆฏไธช่ฎพ่ฎกๆจกๅผ็็น็นๅๅบ็จๅบๆฏ๏ผๅๅคๅ ็ปไน ๏ผ่ฟ็จๅฐๅฎ้
้กน็ฎใ ่ตๆบ ไนฆ็ฑ โญใๅพ่งฃ่ฎพ่ฎกๆจกๅผใ๏ผๅผบ็ๆจ่่ฟๆฌไนฆ๏ผๆญฃๆฏ็จ Java ่ฏญ่จๅฎ็ฐ๏ผๅพๅคใๆ็คบไพไปฃ็ ใๆไน ้ขๅ็ญๆก๏ผๅพไธ้๏ผ ใHead First ่ฎพ่ฎกๆจกๅผใ ใๅคง่ฏ่ฎพ่ฎกๆจกๅผใ ใ่ฎพ่ฎกๆจกๅผ๏ผๅฏๅค็จ้ขๅๅฏน่ฑก่ฝฏไปถ็ๅบ็กใ๏ผๅคง้ปไนฆ๏ผๆ่ฝๅ็่ฏไนๅฏไปฅๅป่ฏป๏ผ ่ง้ข ๅฐ็ก
่ฐทๅพ่งฃ Java ่ฎพ่ฎกๆจกๅผ ๆๆกฃ ่้ธๆ็จ ๅพ่ฏด่ฎพ่ฎกๆจกๅผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ไธญ้ดไปถ๏ผ14 ๅคฉ๏ผ ้คไบๆกๆถๅค๏ผไผไธ้กน็ฎๅผๅไนไผ็จๅฐๅคง้็ฌ็ซ็ไธญ้ดไปถ๏ผไปฅ่งฃๅณๆไบๅฎ้
้ฎ้ข๏ผๆฏๅฆๆ้ซ้กน็ฎ็ๆง่ฝใๆ้ซ้กน็ฎ็็จณๅฎๆงๅๅฏ้ ๆง็ญใ ไธ้ขๅไบซๅ ไธชๆๅธธ็จ็ไธปๆตไธญ้ดไปถใ ็ฅ่ฏ Redis ็ผๅญ ๆฐๆฎ็ฑปๅ ๅธธ็จๆไฝ Java ๆไฝ Redis ไธปไปๆจกๅๆญๅปบ ๅจๅ
ต้็พคๆญๅปบ ๆฅๅฟๆไน
ๅ ๅบ็จๅบๆฏ RabbitMQ ๆถๆฏ้ๅ ๆถๆฏ้ๅ็ไฝ็จ ็ไบงๆถ่ดนๆจกๅ ไบคๆขๆบๆจกๅ ๆญปไฟก้ๅ ๅปถ่ฟ้ๅ ๆถๆฏๆไน
ๅ Java ๆไฝ ้็พคๆญๅปบ Nginx ็ฝๅ
ณ Nginx ไฝ็จ ๆญฃๅไปฃ็ ๅๅไปฃ็๏ผ่ด่ฝฝๅ่กก๏ผ ๅธธ็จๅฝไปค ้
็ฝฎ ๅจ้ๅ็ฆป๏ผ็ฝ็ซ้จ็ฝฒ๏ผ ้็พคๆญๅปบ ๅญฆไน ๅปบ่ฎฎ ๅญฆไผๅฆไฝไฝฟ็จไธญ้ดไปถๅนถไธ้พ๏ผๅ
่ฝๅค็ฌ็ซไฝฟ็จ๏ผไบ่งฃไปไปฌ็ๅบ็จๅบๆฏ๏ผๅ็จ Java ๆฅๆไฝไธญ้ดไปถ๏ผๅ้กน็ฎ็ธ็ปๅใ ่ท็่ง้ขๆ็จๅฎๆไธ้ๅณๅฏ๏ผๅฏไปฅ็ญๅฐ้ข่ฏๅๅๅปๆทฑๅ
ฅไบ่งฃๅ็ๅ้ซ็บง็นๆงใ ่ตๆบ ่ง้ข โญ ๅฐ็ก
่ฐท - 2021 ๆๆฐ Redis 6 ๅ
ฅ้จๅฐ็ฒพ้ๆ็จ๏ผๅบไบ Redis 6 ็๏ผๆจ่๏ผ โญ ๅฐ็ก
่ฐท - 2021 ๆๆฐ RabbitMQ ๆ็จ๏ผๅพๆฐๅพๅ
จ้ข๏ผ โญ ๅฐ็ก
่ฐท - Nginx ๆ็จ็ฑๆต
ๅ
ฅๆทฑ๏ผ่ฎฒ็ๆฏ่พๅ
จ้ข๏ผ โญ Nginx ้ฑผ็ฎ - ๆๆๆๅธฆไฝ ไป0ๆญๅปบไธชไบบ็ฝ็ซ๏ผ็ฎๅๆผ็คบ Nginx ้จ็ฝฒ็ฝ็ซ๏ผ ๆๆกฃ Redis ๅฝไปคๅ่ Redis ้ข่ฏ้ขๆด็ RabbitMQ ไธญๆๆๆกฃ Nginx ไธญๆๆๆกฃ ไนฆ็ฑ ใRedis ๅฎๆใ๏ผ็ปๅ
ธ๏ผ ใRabbitMQ ๅฎๆ๏ผ้ซๆ้จ็ฝฒๅๅธๅผๆถๆฏ้ๅใ๏ผ็ปๅ
ธ๏ผ ๅทฅๅ
ท โญ Redis ๅจ็บฟ็ปไน ๏ผๅผบ็ๆจ่๏ผ โญ RabbitMQ ๅจ็บฟๆจกๆๅจ Nginx ้
็ฝฎๅจ็บฟ็ๆ ็ธๅ
ณๆๆฏ ็ผๅญ๏ผMemcachedใEhcache ้ๅ๏ผKafkaใActiveMQใTubeMQใRocketMQ ็ฝๅ
ณ๏ผHAProxy ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"Netty ็ฝ็ป็ผ็จ๏ผ14 ๅคฉ๏ผ ๅผๆบ็ Java ็ฝ็ป็ผ็จๆกๆถ๏ผ็จไบๅผๅ้ซๆง่ฝ๏ผไบไปถ้ฉฑๅจใๅผๆญฅ้้ปๅก๏ผใ้ซๅฏ้ ็็ฝ็ปๆๅกๅจๅๅฎขๆท็ซฏ็จๅบใ ๅพๅค็ฝ็ปๆกๆถๅๆๅกๅจ็จๅบ้ฝ็จๅฐไบ Netty ไฝไธบๅบๅฑ๏ผๅญฆๅฅฝ Netty ไธไป
ๅฏไปฅ่ฎฉๆไปฌ่ชๅทฑๅฎ็ฐ้ซๆง่ฝๆๅกๅจ๏ผไน่ฝๆดๅฅฝๅฐ็่งฃๅ
ถไป็ๆกๆถๅบ็จใ้
่ฏปๆบ็ ใ ็ฅ่ฏ IO ๆจกๅ๏ผBIO / NIO๏ผ Channel Buffer Seletor Netty ๆจกๅ WebSocket ็ผ็จ๏ผๅจๆๅไธช่ๅคฉๅฎค๏ผ ๅญฆไน ๅปบ่ฎฎ ไธๅไบไนๅๅญฆ็ SSM ๆกๆถ๏ผNetty ่ฟๆฏ้่ฆไธๅฎๅญฆไน ๆๆฌ็๏ผไธๆน้ขๆฏๅฝๅ
่ตๆบๅคช็ผบไน๏ผๅฆไธๆน้ขๅพๅค้่ฆ็ๆฆๅฟต๏ผๆฏๅฆ NIO๏ผ่ฟๆฏ่ฆๅคๅจๆๅไปฃ็ ่ฐ่ฏๆ่ฝ็่งฃใ ่ฟๆฏๅปบ่ฎฎๅ
ไป่ง้ขๅ
ฅ้จ๏ผๅนถไธไธๅปบ่ฎฎๅจ Netty ไธ่ฑๅคชๅคๆถ้ด๏ผ้ข่ฏ็ๆถๅไธ่ฌไนๅฐฑ่ๅฏไธไบ Netty ๆๆณใ ่ตๆบ ่ง้ข โญ ๅฐ็ก
่ฐทNettyๆ็จ Netty ๆๆฏๆผ่ฎฒ๏ผไธญๆๅญๅน็๏ผ ๆๆกฃ Netty 4 ็จๆทๆๅ ไนฆ็ฑ ใNetty ๅฎๆใ ็ธๅ
ณๆๆฏ Vertx๏ผๆฏ Netty ็ฎๅๅคไบ๏ผๅฎๅจ็ไธๆ Netty ไนๅฏไปฅๅญฆไน ไธ่ฟไธช๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅพฎๆๅก๏ผ60 ๅคฉ๏ผ ้็ไบ่็ฝ็ๅๅฑ๏ผ้กน็ฎ่ถๆฅ่ถๅคๆ๏ผๅๆบไธๅบๅคง็ๅทจ็ณ้กน็ฎๅทฒๆ ๆณๆปก่ถณๅผๅใ่ฟ็ปดใๅนถๅใๅฏ้ ๆง็ญ้ๆฑใ ๅ ๆญค๏ผๅๅฐๆถๆไธๆญๆผ่ฟ๏ผๅฏไปฅๅฐๅบๅคง็้กน็ฎๆๅๆไธไธชไธช่่ดฃๆ็กฎใๅ่ฝ็ฌ็ซ็็ปๅฐๆจกๅ๏ผๆจกๅๅฏไปฅ้จ็ฝฒๅจๅคๅฐๆๅกๅจไธ๏ผ็ธไบ้
ๅๅไฝ๏ผๆไพๅฎๆด็็ณป็ป่ฝๅใ ๆข่จไน๏ผๆณๅๅคงๅ้กน็ฎ๏ผ่ฟๅๅฟไธๅฎ่ฆๅฅฝๅฅฝๅญฆ๏ผ ็ฅ่ฏ Dubbo ๆถๆๆผ่ฟ RPC Zookeeper ๆๅกๆไพ่
ๆๅกๆถ่ดน่
้กน็ฎๆญๅปบ ๅพฎๆๅก ๅพฎๆๅกๆฆๅฟต Spring Cloud ๆกๆถ ๅญ็ถๅทฅ็จ ๆๅกๆณจๅไธๅ็ฐ ๆณจๅไธญๅฟ EurekaใZookeeperใConsul Ribbon ่ด่ฝฝๅ่กก Feign ๆๅก่ฐ็จ Hystrix ๆๅก้ๆตใ้็บงใ็ๆญ Resilience4j ๆๅกๅฎน้ Gateway๏ผZuul๏ผๅพฎๆๅก็ฝๅ
ณ Config ๅๅธๅผ้
็ฝฎไธญๅฟ ๅๅธๅผๆๅกๆป็บฟ ๅๅธๅผ้พ่ทฏ่ฟฝ่ธช Spring Cloud Alibaba Nacos ๆณจๅใ้
็ฝฎไธญๅฟ OpenFeign ๆๅก่ฐ็จ Sentinel ๆตๆง Seata ๅๅธๅผไบๅก ๆฅๅฃ็ฎก็ Swagger ๆฅๅฃๆๆกฃ Postman ๆฅๅฃๆต่ฏ ๅญฆไน ๅปบ่ฎฎ ๆถ้ดไธๆฅ็่ฏ๏ผๅปบ่ฎฎๅ
ไป Dubbo ๅญฆ่ตท๏ผๅฏนๅๅธๅผใRPCใๅพฎๆๅกๆไบๅบๆฌ็ไบ่งฃ๏ผๅๅป้ฃ็จ Spring Cloud ๅ
จๅฎถๆกถไผๆด้ฆใ ่ฟ้จๅๅ
ๅฎน็ๅญฆไน ๏ผๅ็ + ๅฎ่ทต้ฝๅพ้่ฆ๏ผไนไธ่ฆ่ขซๅ็ง้ซๅคงไธ็่ฏๆฑๅฌไฝไบ๏ผ้ฝๆฏไธๅฑ๏ผๅบ็จๅฑ๏ผ็ไธ่ฅฟ๏ผๅบๆฌๆฒกๆไปไน็ฎๆณ๏ผ่ท็่ง้ขๆ็จๅญฆ๏ผๅ
ถๅฎ่ฟๆฏๅพๅฅฝ็่งฃ็ใ ๅๅธๅผ็ธๅ
ณ็ฅ่ฏ้ๅธธๅค๏ผไฝ่ฟ้ไธ็จๅปๆๅป่๏ผๅ
้่ฟ่ง้ขๆ็จๅฎๆไฝฟ็จไธไบๅพฎๆๅกๆกๆถ๏ผไน่ฝๅฏนๅ
ถไธญ็ๆฆๅฟตๆๅบๆฌ็ไบ่งฃใ ่ตๆบ ่ง้ข โญ ๅฐ็ก
่ฐท Dubbo ๆ็จ โญ ๅฐ็ก
่ฐท SpringCloud๏ผH็\u0026alibaba๏ผๆกๆถๅผๅๆ็จ๏ผๅพฎๆๅกๅๅธๅผๆถๆ๏ผ๏ผๆๅฝๅค็ Spring Cloud ๅๅฝๅ
็ Spring Cloud Alibaba ็ปๅๅจไธ่ตทๅฏนๆฏ็ๅป่ฎฒ๏ผไธปๆตๆๆฏๆ ใ็ฅ่ฏ็น้ฝ่ฎฒๅฐไบ๏ผ็ๅฟไธ้๏ผ๏ผ ๆๆกฃ Apache Dubbo ๅฎๆนๆๆกฃ Spring Cloud Alibaba ๅฎๆนๆๆกฃ โญ Swagger ๆๅญฆๆๆกฃ๏ผ่ท็ๅฟซ้ๅผๅง็ดๆฅ็จๅฐฑๅฅฝไบ๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:5","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅฎนๅจ๏ผ7 ๅคฉ๏ผ ๅฐๅบ็จๅ็ฏๅข่ฟ่กๅฐ่ฃ
๏ผ็ธไบ้็ฆปใ็ฌ็ซ้จ็ฝฒใไพฟไบ็งปๆค๏ผๆ้ซๅฎๅ
จๆงใๆ้ซๅผๅๅ็ปดๆคๆ็ใ ไพฟไบๅฎ็ฐๅพฎๆๅกใๆ็ปญ้ๆๅไบคไปใ ็ฅ่ฏ Docker ๅฎนๅจๆฆๅฟต ้ๅ ้จ็ฝฒๆๅก Dockerfile K8S๏ผKubernetes๏ผ ๆถๆ ้จ็ฝฒๅบ็จ ๆด้ฒๆๅก ๅจๆๆฉ็ผฉๅฎน ๅญฆไน ๅปบ่ฎฎ ไผ็จ Docker / K8S ้จ็ฝฒ้กน็ฎๅๆๅกๅฐฑ่ก๏ผไผไธไธ่ฌ้ฝๆ็ฐๆ็ๅนณๅฐ็ดๆฅ็จ๏ผ้ข่ฏ่ๅฏไธๅค๏ผไธ็จ่ฑๅคชๅคๆถ้ดใ ่ตๆบ ่ง้ข โญใ็็ฅ่ฏดใDocker ๆๆฐ่ถ
่ฏฆ็ป็ๆ็จ้ไฟๆๆ K8S ่ง้ขๆ็จ ไนฆ็ฑ ใๆทฑๅ
ฅๆต
ๅบ Dockerใ ๆๆกฃ Docker โ ไปๅ
ฅ้จๅฐๅฎ่ทต ่้ธๆ็จ Docker ๅฝๅค Docker ๅฎๆนๆๆกฃ ็ฝ็ซ Docker ไธญๆ็คพๅบ๏ผๅผบ็ๆจ่๏ผๆๅพๅค Docker ๆๆฏๆ็ซ ๅๅญฆไน ็ฌ่ฎฐ๏ผ Docker Blog๏ผๅฝๅค Docker ๆๆฏๅๅฎข๏ผ ้ๅๆบ Docker Hub ่
พ่ฎฏ่ฝฏไปถๆบ ้ฟ้ไบ Docker ไปๅบ ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:6","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"CI / CD๏ผ3 ๅคฉ๏ผ ๆ็ปญ้ๆ / ๆ็ปญไบคไป๏ผ่ดฏ็ฉฟๆดไธช็ ๅๅฐ้กน็ฎไธ็บฟ็่ฟ็จ๏ผๆ้ซๆ็ใ ๅคงๅ
ฌๅธไธ่ฌ้ฝๆ่ชๅทฑ็ CI / CD ๅนณๅฐใ ็ฅ่ฏ ไปไนๆฏ CI / CD CI / CD ๆไปไนๅฅฝๅค ไฝฟ็จไปปไธ CI / CD ๅนณๅฐ ๅญฆไน ๅปบ่ฎฎ ไบ่งฃๅฎๆฏไปไน๏ผๅนถไธๅฎๆไฝฟ็จไปปไธ CI / CD ๅนณๅฐ๏ผๆๅๅฎๅไผ ็ปๅผๅ่ฟ็ปดๅฐๅบๆไปไนไธๅ๏ผๅฐฑ่ถณๅคไบใๅ
ถๅฎๅพ็ฎๅ๏ผไธ่ฆ่ฑๅคชๅคๆถ้ดใ ็ๆญฃ่ฆ่ชๅทฑๅปๆญๅปบ็ๆถๅ๏ผ่ท็ๅฎๆนๆๆกฃๆฅๅฐฑ่กใ ่ตๆบ ่ง้ข โญใ็็ฅ่ฏดใCI/CDๅฐๅบๆฏไปไน๏ผๅๅ้็่งฃไผไธ็บงDevOps๏ผ่ฎฒ็้ๅธธๆฃ๏ผๅธฆไฝ ๅฟซ้็่งฃ CI / CD ็ไฝ็จๅ้จๅๅ็๏ผ ๅฐ็ก
่ฐท - Jenkins ๆ็ปญ้ๆๅทฅๅ
ทๆ็จ๏ผๅฎๅจ่ฆ็จๅฐ Jenkins ๅๅปๅญฆ๏ผ ๆๆกฃ Jenkins ๅฎๆนๆๆกฃ๏ผๆๅพๅคๆกไพ๏ผ่ฆ็จ็ๆถๅๆฅไธไธๅฐฑ่กไบ๏ผ ๅฎๆๅนณๅฐ โญ ๅพฎไฟกไบๆ็ฎก ๅ็ซฏๆ็ฎก Webify ","date":"2022-08-13","objectID":"/blog/20220813_route/:5:7","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 5๏ผ้กน็ฎๅฎๆ ","date":"2022-08-13","objectID":"/blog/20220813_route/:6:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ็ปผๅๆๅญฆๆๆฏไป 0 ๅฐ 1 ๅผๅๅไธ็บฟไธไธชๅ
จ้ขใๆ็น่ฒ็ใๅฏไปฅๅ่ฟ็ฎๅ็ไธชไบบ้กน็ฎใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:6:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅญฆไน ๅปบ่ฎฎ ๅ
ถๅฎๅจไนๅ็ๆกๆถๅญฆไน ่ง้ขไธญๅบ่ฏฅๅฐฑๅ่ฟๅ ไธช้กน็ฎไบ๏ผไฝ็ธๅฏนไธๅคๅฎๆดๅไฝ็ณปๅใ ๆๆณๆณ็ๅๅญฆๅฏไปฅๅไปปไฝ่ชๅทฑๆณๅ็้กน็ฎ๏ผๆจ่ๅๅ ไธไบไฝๅ็ฑป็ซ่ต๏ผ็ปๆใๆฟๅฅใๆถ่ท้กน็ฎ็ปๅไธไธพไธๅพใ ๆๆถๆฒกๆณๆณ็ๆๅ๏ผๅปบ่ฎฎๅ
่ท็ไธ้จๅธฆๅ้กน็ฎ็่ง้ขๆ็จๅ 1 - 2 ๅฅ Java ๅฎๆด้กน็ฎ๏ผไธๅฎ่ฆไป 0 ๅฐ 1 ่ชๅทฑๆๅ๏ผ ๆ่ฝๅ็ๆๅไนๅฏไปฅ่ฏ็็จ GitHub ไธ็ๆบ็ ๆฅๅญฆไน ๅฆ~ ๅไธไธชๅฎๆด็้กน็ฎ็็กฎๅพไธๅฎนๆ๏ผๅปบ่ฎฎๅคงๅฎถๆ นๆฎ่ชๅทฑ็ ๆถ้ดใๅ
ด่ถฃ ้ๆฉ ่พๆฐ็ใๆ้
ๅฅๆบ็ ็ ๆ็จ๏ผไฟๆ่ๅฟใ ไธ้ขๆจ่ไธไบไผ่ดจ็ใ่พๆฐ็้กน็ฎๅฎๆ่ง้ขๆ็จ + 50 ๅฅ้กน็ฎๆบ็ ใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:6:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"่ง้ขๆ็จ ๅฐ็ก
่ฐท - ่ฐท็ฒๅญฆ้ข - ๅพฎๆๅก + ๅ
จๆ - ๅจ็บฟๆ่ฒๅฎๆ้กน็ฎ๏ผๅ
จๆ ้กน็ฎ๏ผๅๅ็ซฏ่ฎฒๅพ้ฝๅพๅ
จ้ข๏ผ ๅฐ็ก
่ฐท - ๅฐ็ญน็ฝ - Java้กน็ฎๅฎๆๅผๅๆ็จ - SSM ๆกๆถ + ๅพฎๆๅกๆถๆ๏ผ500 ๅค้๏ผๅ
ๅซๅฎๆด็็จๆทๆ้็ฎก็๏ผๅ่ฝไธฐๅฏใ่ฎฒๅพๅพ็ป่ดๅ
จ้ข๏ผ ้ป้ฉฌ - 24 ๅฐๆถๆๅฎ Java ๆฏ่ฎพ็ตๅ้กน็ฎ ้ป้ฉฌ็จๅบๅ Java ้กน็ฎใไผ ๆบๅฅๅบทใ๏ผ่ถ
ๅฎๆด็ไผไธ็บงๅป็่กไธ้กน็ฎ ้ป้ฉฌ็จๅบๅ Java ้กน็ฎใไธไฟก้่ใไผไธ็บงๅผๅๅฎๆ๏ผไบ่็ฝ้่่กไธ่งฃๅณๆนๆก ้ป้ฉฌ็จๅบๅ Java ้กน็ฎ SaaS ็งปๅจๅๅ
ฌๅฎๆด็ใiHRM ไบบๅ่ตๆบ็ฎก็็ณป็ปใ๏ผ่ทจ่กไธ SaaS ๅๅ
ฌๆดๅๆง่งฃๅณๆนๆก ้ป้ฉฌ็จๅบๅ Java ๅคงๅๅๅธๅผๅพฎๆๅก้ช่ๆฏไป้กน็ฎ๏ผJava ็งปๅจๆฏไปๅ
จ็ๆ็ณป็ป ้ป้ฉฌ็จๅบๅ Java ้กน็ฎใๅฅฝๅฎข็งๆฟใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:6:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้กน็ฎๆบ็ ๏ผ50 ๅฅ๏ผ ็ตๅ็งๆ ๅคฉ็ซๆด็ซ J2EE ๅคฉ็ซๆด็ซ SSM ๅคฉ็ซๆด็ซ Springboot mall-learning๏ผๅญฆไน ๆ็จ๏ผๆถๆใไธๅกใๆๆฏ่ฆ็นๅ
จๆนไฝ่งฃๆ๏ผ SpringBoot ็ตๅๅๅ็ณป็ป Mall4j SpringBoot ๅฎๆด็ตๅ็ณป็ป Mall๏ผๅ
ๆฌๅๅฐๅๅ็ณป็ปๅๅๅฐ็ฎก็็ณป็ป๏ผๅบไบ SpringBoot+MyBatis ๅฎ็ฐ๏ผ newbee-mall๏ผไธๅฅ็ตๅ็ณป็ป๏ผๅ
ๆฌ newbee-mall ๅๅ็ณป็ปๅ newbee-mall-admin ๅๅๅๅฐ็ฎก็็ณป็ป๏ผๅบไบ Spring Boot 2.X ๅ็ธๅ
ณๆๆฏๆ ๅผๅ๏ผ paascloud-master๏ผ\u003c\u003e๏ผๅบไบ spring cloud + vue + oAuth2.0๏ผๅๅ็ซฏๅ็ฆปๅๅ็ณป็ป๏ผ mall-swarm๏ผไธๅฅๅพฎๆๅกๅๅ็ณป็ป๏ผ้็จไบ Spring Cloud GreenwichใSpring Boot 2ใMyBatisใDockerใElasticsearch ็ญๆ ธๅฟๆๆฏ๏ผๅๆถๆไพไบๅบไบ Vue ็็ฎก็ๅๅฐๆนไพฟๅฟซ้ๆญๅปบ็ณป็ป๏ผ onemall๏ผmall ๅๅ๏ผๅบไบๅพฎๆๅก็ๆๆณ๏ผๆๅปบๅจ B2C ็ตๅๅบๆฏไธ็้กน็ฎๅฎๆใๆ ธๅฟๆๆฏๆ ๏ผๆฏ Spring Boot + Dubbo ใๆชๆฅ๏ผไผ้ๆๆ Spring Cloud Alibaba๏ผ litemall๏ผๅไธไธชๅฐๅๅ๏ผlitemall = Spring Boot ๅ็ซฏ + Vue ็ฎก็ๅๅ็ซฏ + ๅพฎไฟกๅฐ็จๅบ็จๆทๅ็ซฏ + Vue ็จๆท็งปๅจ็ซฏ๏ผ xmall ๏ผๅบไบSOAๆถๆ็ๅๅธๅผ็ตๅ่ดญ็ฉๅๅ ๅๅ็ซฏๅ็ฆป ๅๅฐๅๅ:Vueๅ
จๅฎถๆกถ ๅๅฐ็ฎก็็ณป็ป๏ผ miaosha๏ผ็งๆ็ณป็ป่ฎพ่ฎกไธๅฎ็ฐ๏ผ SecKill๏ผๅบไบ SpringBoot+Mybatis+Redis+RabbitMQ ็งๆ็ณป็ป๏ผ ๅๅฎข่ฎบๅ Mblog๏ผๅผๆบ Java ๅๅฎข็ณป็ป halo๏ผไธไธชไผ็ง็ๅผๆบๅๅฎขๅๅธๅบ็จ forum-java๏ผไธๆฌพ็จ Java๏ผspring boot๏ผ ๅฎ็ฐ็็ฐไปฃๅ็คพๅบ๏ผ่ฎบๅ/้ฎ็ญ/BBS/็คพไบค็ฝ็ป/ๅๅฎข๏ผ็ณป็ปๅนณๅฐ vhr๏ผๅพฎไบบไบๆฏไธไธชๅๅ็ซฏๅ็ฆป็ไบบๅ่ตๆบ็ฎก็็ณป็ป๏ผ้กน็ฎ้็จ SpringBoot+Vue ๅผๅใ favorites-web:ไบๆถ่ Spring Boot 2.X ๅผๆบ้กน็ฎใไบๆถ่ๆฏไธไธชไฝฟ็จ Spring Boot ๆๅปบ็ๅผๆบ็ฝ็ซ๏ผๅฏไปฅ่ฎฉ็จๆทๅจ็บฟ้ๆถ้ๅฐๆถ่็ไธไธช็ฝ็ซ๏ผๅจ็ฝ็ซไธๅ็ฑปๆด็ๆถ่็็ฝ็ซๆ่
ๆ็ซ ใ community๏ผ็ ้ฎ๏ผๅผๆบ่ฎบๅใ้ฎ็ญ็ณป็ป๏ผ็ฐๆๅ่ฝๆ้ฎใๅๅคใ้็ฅใๆๆฐใๆ็ญใๆถ้ค้ถๅๅคๅ่ฝใๆๆฏๆ SpringใSpring BootใMyBatisใMySQL/H2ใBootstrap NiterForum๏ผๅฐผ็น็คพๅบ-NiterForum-ไธไธช่ฎบๅ/็คพๅบ็จๅบใๅ็ซฏSpringboot/MyBatis/Maven/MySQL๏ผๅ็ซฏThymeleaf/Layuiใๅฏไพๅๅญฆ่
๏ผๅญฆไน ใไบคๆตไฝฟ็จใ VBlog๏ผV้จ่ฝ๏ผVue+SpringBootๅฎ็ฐ็ๅค็จๆทๅๅฎข็ฎก็ๅนณๅฐ! NiceFish๏ผSpringBoot/SpringCloud ๅๅ็ซฏๅ็ฆป้กน็ฎ My-Blog๏ผ My Blog ๆฏ็ฑ SpringBoot + Mybatis + Thymeleaf ็ญๆๆฏๅฎ็ฐ็ Java ๅๅฎข็ณป็ป๏ผ้กต้ข็พ่งใๅ่ฝ้ฝๅ
จใ้จ็ฝฒ็ฎๅๅๅฎๅ็ไปฃ็ ๏ผไธๅฎไผ็ปไฝฟ็จ่
ๆ ไธไผฆๆฏ็ไฝ้ชใ My-Blog-layui๏ผlayui ็ๆฌ็ My-Blog : A simple \u0026 beautiful blogging system implemented with spring-boot \u0026 layui \u0026 thymeleaf \u0026 mybatis My Blog ๆฏ็ฑ SpringBoot + Layui + Mybatis + Thymeleaf ็ญๆๆฏๅฎ็ฐ็ Java ๅๅฎข็ณป็ป๏ผ้กต้ข็พ่งใๅ่ฝ้ฝๅ
จใ้จ็ฝฒ็ฎๅๅๅฎๅ็ไปฃ็ ๏ผไธๅฎไผ็ปไฝฟ็จ่
ๆ ไธไผฆๆฏ็ไฝ้ช symphony๏ผJava ๅฎ็ฐ็็ฐไปฃๅ็คพๅบ ็ฎก็็ณป็ป Spring-Cloud-Admin๏ผCloud-Admin ๆฏๅฝๅ
้ฆไธชๅบไบ Spring Cloud ๅพฎๆๅกๅๅผๅๅนณๅฐ๏ผๅ
ทๆ็ปไธๆๆใ่ฎค่ฏๅๅฐ็ฎก็็ณป็ป๏ผๅ
ถไธญๅ
ๅซๅ
ทๅค็จๆท็ฎก็ใ่ตๆบๆ้็ฎก็ใ็ฝๅ
ณ API ็ฎก็็ญๅคไธชๆจกๅ๏ผๆฏๆๅคไธๅก็ณป็ปๅนถ่กๅผๅ๏ผๅฏไปฅไฝไธบๅ็ซฏๆๅก็ๅผๅ่ๆๆถใไปฃ็ ็ฎๆด๏ผๆถๆๆธ
ๆฐ๏ผ้ๅๅญฆไน ๅ็ดๆฅ้กน็ฎไธญไฝฟ็จใๆ ธๅฟๆๆฏ้็จ Spring Boot2 ไปฅๅ Spring Cloud Gateway ็ธๅ
ณๆ ธๅฟ็ปไปถ๏ผๅ็ซฏ้็จ vue-element-admin ็ปไปถใ bootshiro๏ผๅบไบ springboot+shiro+jwt ็่ตๆบๆ ็ถๆ่ฎค่ฏๆ้็ฎก็็ณป็ปๅ็ซฏ ๆ็ฉบCRM๏ผๅบไบjfinal+vue+ElementUI็ๅๅ็ซฏๅ็ฆปCRM็ณป็ป EL-ADMIN๏ผๅบไบ SpringBoot ็ๅๅฐ็ฎก็็ณป็ป pig๏ผๅบไบ Spring Boot 2.2ใ Spring Cloud Hoxton \u0026 Alibabaใ OAuth2 ็ RBAC ๆ้็ฎก็็ณป็ปใ FEBS-Shiro๏ผSpring Boot 2.1.3๏ผShiro1.4.0 \u0026 Layui 2.5.4 ๆ้็ฎก็็ณป็ปใ Spring Boot-Shiro-Vue๏ผๅบไบSpring Boot-Shiro-Vue ็ๆ้็ฎก็ studentmanager๏ผๅบไบspringboot+mybatisๅญฆ็็ฎก็็ณป็ป jshERP๏ผๅๅคERPๅบไบSpringBootๆกๆถๅSaaSๆจกๅผ๏ผ็ซๅฟไธบไธญๅฐไผไธๆไพๅผๆบๅฅฝ็จ็ERP่ฝฏไปถ๏ผ็ฎๅไธๆณจ่ฟ้ๅญ+่ดขๅกๅ่ฝใไธป่ฆๆจกๅๆ้ถๅฎ็ฎก็ใ้่ดญ็ฎก็ใ้ๅฎ็ฎก็ใไปๅบ็ฎก็ใ่ดขๅก็ฎก็ใๆฅ่กจๆฅ่ฏขใ็ณป็ป็ฎก็็ญใๆฏๆ้ขไปๆฌพใๆถๅ
ฅๆฏๅบใไปๅบ่ฐๆจใ็ป่ฃ
ๆๅธใ่ฎขๅ็ญ็น่ฒๅ่ฝใๆฅๆๅบๅญ็ถๅตใๅบๅ
ฅๅบ็ป่ฎก็ญๆฅ่กจใๅๆถๅฏน่ง่ฒๅๆ้่ฟ่กไบ็ป่ดๅ
จ้ขๆงๅถ๏ผ็ฒพ็กฎๅฐๆฏไธชๆ้ฎๅ่ๅใ HotelSystem๏ผ้
ๅบ็ฎก็็ณป็ป Java,tomcat,mysql,servlet,jspๅฎ็ฐ๏ผๆฒกๆไฝฟ็จไปปไฝๆกๆถ ๅผๅๅนณๅฐ open-capacity-platform๏ผๅพฎๆๅก่ฝๅๅผๅๅนณๅฐ jeecg-boot๏ผJeecgBootๆฏไธๆฌพๅบไบBPM็ไฝไปฃ็ ๅนณๅฐ๏ผๅๅ็ซฏๅ็ฆปๆถๆ SpringBoot 2.x๏ผSpringCloud๏ผAnt Design\u0026Vue๏ผMybatis-plus๏ผShiro๏ผJWT๏ผๆฏๆๅพฎๆๅกใๅผบๅคง็ไปฃ็ ็ๆๅจ่ฎฉๅๅ็ซฏไปฃ็ ไธ้ฎ็ๆ๏ผๅฎ็ฐไฝไปฃ็ ๅผๅ๏ผ ๅ
ถไป ๅญฆไนๆๅจ็บฟ่่ฏ็ณป็ป๏ผไธๆฌพ java + vue ็ๅๅ็ซฏๅ็ฆป็่่ฏ็ณป็ป PassJava-Platform๏ผไธๆฌพ้ข่ฏๅท้ข็ Spring Cloud ๅผๆบ็ณป็ป kkFileView๏ผไฝฟ็จspring bootๆ้ ๆไปถๆๆกฃๅจ็บฟ้ข่ง้กน็ฎ dynamic-datasource๏ผไธไธชๅบไบspringboot็ๅฟซ้้ๆๅคๆฐๆฎๆบ็ๅฏๅจๅจ moti-cloud๏ผ่ซๆ็ฝ็๏ผๅบไบ SpringBoot+MyBatis+ThymeLeaf+BootStrap๏ผ้ๅๅๅญฆ่
threadandjuc๏ผthree-high-import ้ซๅฏ็จ\\้ซๅฏ้ \\้ซๆง่ฝ๏ผไธ้ซๅค็บฟ็จๅฏผๅ
ฅ็ณป็ป๏ผ่ฏฅ้กน็ฎๆไนไธบ็่ฎบ่ดฏ้) proxyee-down๏ผhttpไธ่ฝฝๅทฅๅ
ท๏ผๅบไบhttpไปฃ็๏ผๆฏๆๅค่ฟๆฅๅๅไธ่ฝฝ hosp_order๏ผๅป้ข้ข็บฆๆๅท็ณป็ป๏ผๅบไบ SSM ๆกๆถ ่ถๅฟๆ่ต SpringCloud DiyTomcat ","date":"2022-08-13","objectID":"/blog/20220813_route/:6:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 6๏ผJava ้ซ็บง ","date":"2022-08-13","objectID":"/blog/20220813_route/:7:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ไธๆปก่ถณไบ่ฝๅ๏ผ่ๆฏ้่ฟๆด ๆทฑๅ
ฅ ๅ ๅนฟๆณ ็ๅญฆไน ๏ผๅฎ็ฐ้ซ่ดจ้็ไปฃ็ ๅๆดไผ็ง็ๆถๆ๏ผๅนๅ
ป่งฃๅณ้ฎ้ข็่ฝๅใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:7:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅนถๅ็ผ็จ๏ผ21 ๅคฉ๏ผ ๅฏน Java ๅ็ซฏๅผๅ็จๅบๅๆฅ่ฏด๏ผๆๅพๅฆไฝๅฉ็จๆ้็็ณป็ป่ตๆบๆฅๆ้ซ็ณป็ป็ๆง่ฝๆฏๅพ้่ฆ็๏ผไนๆฏๅคงๅ้ข่ฏ่ๅฏ็้็น๏ผๅ ๆญคๅนถๅ็ผ็จ๏ผๅฐคๅ
ถๆฏ Java ๅนถๅๅ
็ไฝฟ็จ๏ผ่ฟๅ็็ฅ่ฏๅพ้่ฆใ ๆๅฎๆพๅฐ้ซ็บง๏ผๆฏๅ ไธบๅจๅญฆๅนถๅ็ผ็จๅ๏ผ้่ฆๆไธๅฎ็็ผ็จ็ป้ชใไบ่งฃไธๅฎ็ๆไฝ็ณป็ป็ฅ่ฏใ ็ฅ่ฏ ็บฟ็จๅ่ฟ็จ ็บฟ็จ็ถๆ ๅนถ่กๅๅนถๅ ๅๆญฅๅๅผๆญฅ Synchronized Volatile ๅ
ณ้ฎๅญ Lock ้ ๆญป้ ๅฏ้ๅ
ฅ้ ็บฟ็จๅฎๅ
จ ็บฟ็จๆฑ JUC ็ไฝฟ็จ AQS Fork Join CAS ๅญฆไน ๅปบ่ฎฎ ๅนถๅ็ผ็จๅ
ฅ้จไธ้พ๏ผไพ็ถๆฏ ๅ
ๅญฆไผไฝฟ็จ ๅบ็ก็ Java ๅนถๅๅ
๏ผ ๅ้่ฟๅคง้ๅฐๅฎ่ทตๅๆต่ฏ๏ผไบ่งฃไธไบๅ็๏ผๆ่ฝ็ๆญฃๆๆกไฝๆถไฝฟ็จใๅฆไฝๆดๅ็ๅฐไฝฟ็จๅนถๅ็ผ็จใ ่ตๆบ ่ง้ข โญใๅฐ็ก
่ฐทใๅคงๅๅฟ
ๅคๆๆฏไนJUCๅนถๅ็ผ็จ2021ๆๆฐ็๏ผ็น็นๆฏ็ญใ็ฒพใๆฐ๏ผ ้ป้ฉฌ็จๅบๅๅ
จ้ขๆทฑๅ
ฅๅญฆไน Javaๅนถๅ็ผ็จ๏ผ่ฎฒ็ๅพ็ปใๅ
จ้ขๆทฑๅ
ฅ๏ผ ไนฆ็ฑ โญใJavaๅนถๅ็ผ็จๅฎๆใ๏ผๅฝๅค็็ปๅ
ธ๏ผ โญใJava ๅนถๅ็ผ็จ่บๆฏใ๏ผๅฝไบบๅ็๏ผ็่ฎบๆๆณๅ
ๅฎน่พๅค๏ผๆๆถ้ดๅปบ่ฎฎๅๅค็๏ผ ้กน็ฎ โญ Java ๅนถๅ็ฅ่ฏ็นๆป็ป ","date":"2022-08-13","objectID":"/blog/20220813_route/:7:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"JVM๏ผ30 ๅคฉ๏ผ ๆณ่ฆๆทฑๅ
ฅ็่งฃ Java๏ผๆข็ง Java ่ทจๅนณๅฐ็ๅฅฅ็ง๏ผไธๅฎ่ฆไบ่งฃ Java ๅบๅฑ็่ๆๆบๆๆฏใ ไบ่งฃ่ๆๆบใๆๆก่ๆๆบๆง่ฝ่ฐไผๆนๆณ๏ผๆๅฉไบไฝ ๅๅบๆด้ซๆง่ฝใ่ตๆบๅ ็จๆดๅฐ็ไผ่ดจ็จๅบใ ๅจๅญฆไน JVM ็่ฟ็จไธญ๏ผไน่ฝๅญฆๅฐๅพๅค็ฒพๅฆ็่ฎพ่ฎก๏ผๅผๆๆ่ทฏใ ็ฅ่ฏ JVM ๅ
ๅญ็ปๆ JVM ็ๅฝๅจๆ ไธปๆต่ๆๆบ Java ไปฃ็ ๆง่กๆต็จ ็ฑปๅ ่ฝฝ ็ฑปๅ ่ฝฝๅจ ็ฑปๅ ่ฝฝ่ฟ็จ ๅไบฒๅงๆดพๆบๅถ ๅๅพๅๆถ ๅๅพๅๆถๅจ ๅๅพๅๆถ็ญ็ฅ ๅๅพๅๆถ็ฎๆณ StopTheWorld ๅญ่็ ๅ
ๅญๅ้
ๅๅๆถ JVM ๆง่ฝ่ฐไผ ๆง่ฝๅๆๆนๆณ ๅธธ็จๅทฅๅ
ท ๅๆฐ่ฎพ็ฝฎ ๅญฆไน ๅปบ่ฎฎ JVM ็็ฅ่ฏ็ฅๆพๆฏ็ฅ๏ผๅปบ่ฎฎๅ
็่ง้ข๏ผๆๅฎๆ็ๅฐๆนไธๅฎ่ฆๅฎๆ๏ผ่ชๅทฑๅคๅปๅๆใ ็ฌฌไธ้ไธ็่งฃๆฒกๆๅ
ณ็ณป๏ผๅฏไปฅๅ็ไนฆๆฅๅทฉๅบ๏ผๆณ่ฆ็ๆญฃๅญฆๅฅฝ๏ผใๆทฑๅ
ฅ็่งฃ Java ่ๆๆบ๏ผ็ฌฌไธ็๏ผใไธๅฎ่ฆ่ฏปใ ๅฆๆๅชๆฏไธบไบ้่ฟ้ข่ฏๅฏไปฅ็ดๆฅ็ๆด็ฒพ็ฎ็่ง้ข๏ผๆฏๅฆ็็ฅ็ใ ่ตๆบ ่ง้ข โญ ๅฐ็ก
่ฐทๅฎ็บขๅบท - JVM ๅ
จๅฅๆ็จ่ฏฆ่งฃ๏ผ่ฎฒๅพ็ธๅฝๅ
จ้ข๏ผ้ๆๅฎๆ๏ผ ใ็็ฅ่ฏดJavaใJVMๅฟซ้ๅ
ฅ้จ็ฏ๏ผ่ฎฒๅพๆ็นๆต
๏ผไฝ้ฝๆฏ้ข่ฏ้็น๏ผๆถ้ด็ดง็ๅฐไผไผดๅฏไปฅ็ดๆฅ็่ฟไธช๏ผ ไนฆ็ฑ โญใๆทฑๅ
ฅ็่งฃ Java ่ๆๆบ๏ผ็ฌฌไธ็๏ผใ๏ผๆ็่ฎบๆๅฎ่ทต๏ผๅ
ๅฎนไธฐๅฏ๏ผไธๅฏๅคๅพ็ JVM ๅญฆไน ็ฅไนฆ๏ผๅฐฑๆฏๆ็นๅบๅคดๅ๏ผ ้กน็ฎ โญ Java ่ๆๆบๅบๅฑๅ็็ฅ่ฏๆป็ป ๅฎๆ ้ฟ้ไบ JVM ๅฎๆ ","date":"2022-08-13","objectID":"/blog/20220813_route/:7:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๆถๆ่ฎพ่ฎก ๅๅธๅผ ๅๅธๅผ็่ฎบ CAP BASE ๅๅธๅผ็ผๅญ Redis Memcached Etcd ไธ่ดๆง็ฎๆณ Raft ไธ่ดๆงๅๅธ ๅๅธๅผไบๅก ๅๅธๅผ id ็ๆ ๅๅธๅผๆๅก่ฐ็จ ๅๅธๅผๅญๅจ ๅๅธๅผๆฐๆฎๅบ ๅๅธๅผๆไปถ็ณป็ป ๅๅธๅผๅ่ฐ Zookeeper ๅๅธๅผ็ๆง Prometheus ๅๅธๅผๆถๆฏ้ๅ RabbitMQ Kafka Apache Pulsar ๅๅธๅผๆฅๅฟๆถ้ Elastic Stack Loki ๅๅธๅผๆ็ดขๅผๆ Elasticsearch ๅๅธๅผ้พ่ทฏ่ฟฝ่ธช Apache SkyWalking ๅๅธๅผ้
็ฝฎไธญๅฟ Apollo Nacos ้ซๅฏ็จ ไธปไป ๅผๅฐๅคๆดป ๅฎน็พๅคไปฝ ้ซๅนถๅ ๆฐๆฎๅบ ๅๅบๅ่กจ ่ฏปๅๅ็ฆป ็ผๅญ ็ผๅญ้ชๅดฉ ็ผๅญๅป็ฉฟ ็ผๅญ็ฉฟ้ ่ด่ฝฝๅ่กก ่ด่ฝฝๅ่กก็ฎๆณ ่ฝฏ็กฌไปถ่ด่ฝฝๅ่กก๏ผ2ใ3ใ4ใ7 ๅฑ๏ผ ๅ
ถไป ็ๆงๅ่ญฆ ้ขๅ้ฉฑๅจ่ฎพ่ฎก ๅบ็จๅฎๅ
จ ็บฟไธๆ
้ๅๆ ๆๅก็ฝๆ ผ Serverless ไบๅ็ ๅญฆไน ๅปบ่ฎฎ ๅค็ๆ็ซ ๅคๆ่ ","date":"2022-08-13","objectID":"/blog/20220813_route/:7:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 7๏ผJava ๆฑ่ ","date":"2022-08-13","objectID":"/blog/20220813_route/:8:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ๆพๅฐๅฅฝๅทฅไฝ ","date":"2022-08-13","objectID":"/blog/20220813_route/:8:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅปบ่ฎฎ ๅฐฝๆฉๅ่งๅ๏ผๅฏไปฅ้่ฟๅคงๅๆ่ๅฎ็ฝ็ๅฒไฝๆ่ฟฐๆฅไบ่งฃๅฒไฝ็่ฆๆฑ ้็ขไธไปฝไผ็ง็็ฎๅ๏ผๆจ่้
่ฏป ๅค่ฏป้ข็ป๏ผๅๆๅท็ฎๆณ ๅคๅไธ้ข่ฏ๏ผๆ็ปญๅค็ๆป็ป ","date":"2022-08-13","objectID":"/blog/20220813_route/:8:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"่ตๆบ ๅฒไฝ่ฆๆฑ ้ฟ้ Java ๅผๅ ่
พ่ฎฏๅๅฐๅผๅ ่
พ่ฎฏๅ
จๆ ๅผๅ ่
พ่ฎฏ่ฟ่ฅๅผๅ ็พๅขๅ็ซฏๅผๅ ๅไธบ่ฝฏไปถๅผๅ ็ฅ่ฏๆป็ป โญ ็ๅฎข Java ้ข่ฏๅฎๅ
ธ โญ JavaGuide โญ CS-Notes ้ฟ้ Java ๆๆฏๅพ่ฐฑ ้ข็ป โญ 2021 ๆๆฐ Java ็ฌ่ฏใ้ข่ฏ้ขๅ้๏ผๅฏ็ ๏ผlkw1๏ผ โญ ็ๅฎข้ข็ป ่ง้ข โญ ๅฐ็ก
่ฐท 2021 ้่ขญ็ Java ้ข่ฏ้ข็ฌฌไธๅญฃ โญ ้ฟ้ๅคงไฝฌ้ๅฝป่ฎฒ่งฃ Java ้ข่ฏ 500 ้ๅฟ
่้ข ","date":"2022-08-13","objectID":"/blog/20220813_route/:8:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"้ถๆฎต 8๏ผๆ็ปญๅญฆไน ","date":"2022-08-13","objectID":"/blog/20220813_route/:9:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ฎๆ ๆ็ปญ่ฟฝๆฑๆๆฏ็ๆทฑๅบฆๅๅนฟๅบฆ๏ผๅนๅ
ป่ชๅทฑ็ ๆ ธๅฟ็ซไบๅ ๅ ไธๅฏๆฟไปฃๆง ๏ผๅญฆๆ ๆญขๅข๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:9:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅญฆไน ๅปบ่ฎฎ ่ชไธปๅญฆไน ๏ผ่ชไธปๆ็ดขๆ็จ๏ผๅค็ไนฆ๏ผๅค้
่ฏปๆๆฏๅๅฎข๏ผๅคๅฎ่ทตใ ","date":"2022-08-13","objectID":"/blog/20220813_route/:9:2","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅญฆไน ๆนๅ ๆกๆถๆบ็ Spring SpringBoot SpringMVC MyBatis Netty Dubbo SpringCloud ่ฎก็ฎๆบๅ็ ใ็ฎๆณๅฏผ่ฎบใ ใ็ฐไปฃๆไฝ็ณป็ปใ ใๆทฑๅ
ฅ็่งฃ่ฎก็ฎๆบ็ณป็ปใ ใ็ผ่ฏๅ็ใ ใ่ฎก็ฎๆบ็ฝ็ป๏ผ่ช้กถๅไธๆนๆณใ ใ่ฎก็ฎๆบ็จๅบ็ๆ้ ๅ่งฃ้ใ ใๆฐๆฎๅบ็ณป็ปๆฆๅฟตใ ๆฐๆฎๅบ / ไธญ้ดไปถ / ๅๅธๅผ ๆฐๆฎๅบ MySQL PostgreSQL ็ผๅญ Redis ้ๅ Apache Kafka Apache Pulsar ๆ็ดขๅผๆ Elastic Stack ๅฎนๅจ Docker K8S ่งฃๅณๆนๆก ๅนฟๅ ็ตๅ ๆ็ดข ๆธธๆ ๅณๆถ้่ฎฏ ็คพไบค CMS ERP OA ๆถๆ ไบฟ็บงๆต้ๆถๆ ็งๆ็ณป็ป ๆถๆ้ๅ่ฝๅ ๅคงๆฐๆฎ 5V ็น็น Hadoop HDFS MapReduce Spark Flink Storm Hive HBase Druid Kylin Pig Mahout ๅๆฒฟๆๆฏ ไบๅ็ Quasar Framework ","date":"2022-08-13","objectID":"/blog/20220813_route/:9:3","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"่ชๅญฆ Java ไธ้ข่ตๆบ GitHub Java ไธๅบ GitHub Java ๅ้ StackOverflow๏ผ่งฃๅณ้ฎ้ขๅฟ
ๅค๏ผ ๆ้ Java ไธๅบ ็พๅขๆๆฏๅข้ ้ฟ้ๆๆฏๅข้ ๆ่ตๆๆฏๅข้ ","date":"2022-08-13","objectID":"/blog/20220813_route/:9:4","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"ๅฐพๅฃฐ ","date":"2022-08-13","objectID":"/blog/20220813_route/:10:0","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Java"],"content":"็ผ็จ่ฏฏๅบ ๆไธ้ๅๅญฆ็ผ็จ๏ผโ๏ผๅ
ด่ถฃๆฏๅคฉ่ตๆด้่ฆ๏ผไธ่ฆๆ็่ชๅทฑ๏ผ ๅฟฝ่งๅบ็ก๏ผๆฅไบๆฑๆ โ๏ผๅฟไปฅๆตฎๆฒ็ญ้ซๅฐ๏ผ ๆฐๅญฆใ่ฑ่ฏญๅทฎ๏ผๅฐฑๅญฆไธๅฅฝ็ผ็จ โ๏ผๅผๅๅทฅไฝๅบๆฌไธ็จ้ซ็ญๆฐๅญฆ๏ผ่ฑ่ฏญๅฏไปฅไฝฟ็จ็ฟป่ฏ่ฝฏไปถใๅทฅไฝไธญๆๅ๏ผ ็ผ็จๆถ๏ผๅปๆ่ฎฐๅฟไปฃ็ โ๏ผ็ฅ้ๆฏ่กไปฃ็ ็ๆไน๏ผ่ฝ็ๆๆกฃๅๅบๆฅๅฐฑ่ก๏ผ ๆฏ่กไปฃ็ ้ฝ่ฆ่ฟฝๆฑๅฎ็พ โ๏ผไฝไธบๅฎ็พ๏ผๆฏไธชไบบ็ๅฎไนไธๅ๏ผ ็จ็พๅบฆๆ็ดขใๅคๅถ็ฒ่ดด็้ฝๆฏ่้ธก็จๅบๅ โ๏ผ่น๏ผ ๆๅ็้กน็ฎๅคชๅฐไบ๏ผๅฐฑไธๆด็ไบ โ๏ผ่ชๅทฑ็ๆฏไธช้กน็ฎ้ฝ่ฆๆด็๏ผๅฏไปฅ่ฎฐๅฝ่ชๅทฑ็ๆ้ฟ๏ผ ่ทๅซไบบไบคๆตๅพ้บป็ฆ๏ผๆๆดๆฟๆ่ชๅทฑๅไปฃ็ โ๏ผ1 + 1 \u003e 2๏ผๅๅฟ้ญ้จ้ ่ฝฆ๏ผไธ่ฟไน่ฆๆพๅฐๅ้็ๅๅญฆๅปไบคๆต๏ผ ๅๅซไบบๅ่ฟ็้กน็ฎๆฒกๆๆไน โ๏ผ่ฟๅซไบบๅ่ฟ็้กน็ฎ้ฝๅไธๅบ๏ผ่ฟๆณ้ ๆฐ่ฝฎๅญ๏ผ๏ผ ้ๅฐ Bug๏ผๆณๅๆณ็ป่ฟ่ไธๆฏๅฏปๆพ่งฃๅณๆนๆก โ๏ผBug ๆ่ฝไฝฟไบบๆ้ฟ๏ผ ้ๅฐ้ฎ้ข๏ผ็ฌฌไธๆถ้ดๅป้ฎๅซไบบ่้่ชๅทฑ่งฃๅณ โ๏ผๅปบ่ฎฎ้
่ฏปใๆ้ฎ็ๆบๆ
งใ๏ผ ่ฑไบๅพๅคๆถ้ดใ็ไบๅพๅคไนฆ๏ผๅฐฑ่ฝๅญฆๅฅฝ็ผ็จ โ๏ผ็ผ็จๆๅฟ่ฎณ็บธไธ่ฐๅ
ต๏ผ ๅชๅๅๅญฆไน ๏ผไธๆด็ๅญฆ่ฟ็็ฅ่ฏ โ๏ผๅปบ่ฎฎๆฏๅญฆๅฎไธไธช็ฅ่ฏ๏ผ้ฝๅปๅๆณใๆป็ปใๅๅฟๅพ๏ผ่ฟไธชๆถ้ด็่ฑ่ดนๆฏๅผๅพ็๏ผ ๅๅ
ๆต่ฏไธ้่ฆ โ๏ผไธๆฃๆๆญป๏ผ ๅๆๆกฃไธ้่ฆ โ๏ผไธๆฃๆๆญป๏ผ ๅๆๆ ๅ
ณ็ๅทฅไฝ๏ผๅฐฑไธ้่ฆไบ่งฃ โ๏ผไบ่งฃๅข้ใๅ่กๆฏๅพ้่ฆ็๏ผๅ
จๅฑ่ง้๏ผ ๆถ่็่ตๆบไปๆฅไธ็๏ผๅฐฑไธๆถ่ไบ โ๏ผไธไธไปฅๅ็จๅฐไบๅข๏ผ๏ผ ไธๅป่่้ๆฑ็ไปทๅผ๏ผ่ๆฏไธๅณๅฏปๆฑ่งฃๅณๆนๆก โ๏ผไธ่ฆๆไธบ้ๆฑๆบๅจ๏ผ่ฆๆ่ชๅทฑ็็ฌ็ซๆ่๏ผ ่ตๆๅ็
ง๏ผ็จๅบๅ้ฑผ็ฎ ๏ผๅไฝไธๆ๏ผ่ฝฌ่ฝฝไธ่ฝฝ่ฏทๆณจๆๅ่
๏ผ่ฐข่ฐข๏ผ ","date":"2022-08-13","objectID":"/blog/20220813_route/:10:1","tags":["java","study","Javaๅญฆไน ่ทฏ็บฟ"],"title":"Java ๅญฆไน ่ทฏ็บฟ","uri":"/blog/20220813_route/"},{"categories":["Daily"],"content":"ๆถๅปๆตฎ่บ๏ผๆฒๆท็ฒพๅ.","date":"2022-08-07","objectID":"/blog/20220807/","tags":["daily","study"],"title":"ๅณๅฎ้ๆฐๅๅฝ","uri":"/blog/20220807/"},{"categories":["Daily"],"content":"ๅปๆตฎๅป็ฅ๏ผ็ ฅ็ บๅ่ก ","date":"2022-08-07","objectID":"/blog/20220807/:0:0","tags":["daily","study"],"title":"ๅณๅฎ้ๆฐๅๅฝ","uri":"/blog/20220807/"},{"categories":["Daily"],"content":"่ตทๅ ๅๆณ่ตท่ชๅทฑๅ ไธบๅค่ไปฅๅ็ง็งๅๅ ๏ผๅทฒ็ปๅฐ่ฟไธๅนดๆฒกๆ็ๆญฃ่ชๅทฑ็ฌ็ซๅผๅไปฃ็ ไบ๏ผไผๆณไนๅๆๆไปฃ็ ็ๆฅๅญ่ฟๆฏๅพๆๅฟต็๏ผ่ฝ่ฎฉๅฝๆถๅพ็ดฏ๏ผๅคฉๅคฉ่ฝๅจ็ต่้ขๅๅไธไธชๅๅ ไธชๅฐๆถ๏ผ้ๅท็๏ผ๏ผไฝ้ฃๆถ็็ๆถ่ทๆปกๆปก๏ผๅฟๆปกๆ่ถณ๐๏ผ็ฐๅจ่ฝ็ถๅทฒ็ปๆๅไธๅฒธ๏ผไฝๆฐ็็ฎๆ ไน้ไน่ๆฅ๏ผ่ฟๅ
ฅๅคงๅ๏ผๆๆทฑ็ฅ่ฟๅ
ฅๅคงๅ็้พๅบฆ๏ผๆฏ็ซ่ฐไธๆณๅนดๅ
ฅ็พไธๅข๐๏ผไปๅคฉๆๅๆฌก็ป้ๆ็GitHubๆถ๏ผ็็ๅฝๅนดๆปก่
็ญ่กๆญๅปบ็Blog๏ผ่ณไป่ฟๆฒกๆๅๅธไปปไฝๅๆ ทๆ็ซ ๏ผ็ๆฏๆๆ
จไธๅ๏ผไบๆฏๆไปๅคฉๅ้ๆฐ้จ็ฝฒๅฎๆไบๆ็Blog๏ผไปฅไพฟ่ฎฐๅฝ่ชๅทฑ็ๆ้ฟ๏ผๅฎๅ่ชๆ๏ผๆฉๆฅๆไธบๅซไบบ็ผไธญ็ๅคง็๐ฎใ ","date":"2022-08-07","objectID":"/blog/20220807/:0:1","tags":["daily","study"],"title":"ๅณๅฎ้ๆฐๅๅฝ","uri":"/blog/20220807/"},{"categories":["Daily"],"content":"่ฎกๅ ไป็ฐๅจๅผๅง๏ผๆ่ฆ็ป่ชๅทฑๅถๅฎ็ธๅบๆฅ็จ็ฎๆ ๏ผไธ่ฝๅๆฏๅคฉๅชๆฏๅจฑไน่ณไธไบ๐ ๆ นๆฎๅญฆไน ่ทฏ็บฟๅพๆฅๆผ่กฅ็ผบ๏ผๅญฆไน ่ทฏ็บฟๅพๅ้ขไผๅถไฝ๏ผ ๆฏๅคฉๅท้ข๏ผไฟๆๅคด่๏ผ้ๆฉ+็ผ็จ๏ผ ้ๅฐ็ปๅธธ็ฏ็้่ฏฏๆ้พ้ข่งฃๅณๅ๏ผ้่ฟBlog่ฎฐๅฝไธๆฅ๏ผไปฅไพฟ่ชๅทฑๆธฉไน ๆฏๅคฉ็ฉบ้ฒๆถ้ด็็ๅคง็ๆๆฏๅไบซไปฅๅๅไบซ็้ข็ป ","date":"2022-08-07","objectID":"/blog/20220807/:0:2","tags":["daily","study"],"title":"ๅณๅฎ้ๆฐๅๅฝ","uri":"/blog/20220807/"},{"categories":["Daily"],"content":"ๆป็ป ่ฝ็ถไธ็ฅ้ๅ้ขไผ็ปง็ปญๅฐๅช้๏ผไฝๆป็ฎ่ฟๅบไบไปๅคฉ็็ฌฌไธๆญฅ๏ผๅ้ขๆไนไผ็ปง็ปญๅชๅ๏ผๆ็่ชๅทฑ้ขๆ็็ฎๆ ๆผๅฒๅ
จๅ๏ผๅ ๆฒน้ฟ่ฑช๏ผๆชๆฅๅฏๆ๏ผ ","date":"2022-08-07","objectID":"/blog/20220807/:0:3","tags":["daily","study"],"title":"ๅณๅฎ้ๆฐๅๅฝ","uri":"/blog/20220807/"},{"categories":["Hugo"],"content":"Hugo ไธญ็ Emoji ็็จๆณๆๅ.","date":"2021-07-01","objectID":"/blog/emoji/","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"Emoji ๅฏไปฅ้่ฟๅค็งๆนๅผๅจ Hugo ้กน็ฎไธญๅฏ็จ. emojify ๆนๆณๅฏไปฅ็ดๆฅๅจๆจกๆฟไธญ่ฐ็จ, ๆ่
ไฝฟ็จ่กๅ
Shortcodes. ่ฆๅ
จๅฑไฝฟ็จ emoji, ้่ฆๅจไฝ ็็ฝ็ซ้
็ฝฎไธญ่ฎพ็ฝฎ enableEmoji ไธบ true, ็ถๅไฝ ๅฐฑๅฏไปฅ็ดๆฅๅจๆ็ซ ไธญ่พๅ
ฅ emoji ็ไปฃ็ . ๅฎไปฌไปฅๅๅทๅผๅคดๅ็ปๅฐพ๏ผๅนถไธๅ
ๅซ emoji ็ ไปฃ็ : ๅป้ฒ่ฅๅฆ! :tent: ๅพๅฟซๅฐฑๅๆฅ. ็ๅผๅฟ! :joy: ๅ็ฐ็่พๅบๆๆๅฆไธ: ๅป้ฒ่ฅๅฆ! โบ ๅพๅฟซๅฐฑๅๆฅ. ็ๅผๅฟ! ๐ ไปฅไธ็ฌฆๅทๆธ
ๅๆฏ emoji ไปฃ็ ็้ๅธธๆ็จ็ๅ่. ","date":"2021-07-01","objectID":"/blog/emoji/:0:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่กจๆ
ไธๆ
ๆ ","date":"2021-07-01","objectID":"/blog/emoji/:1:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฌ่ธ่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ grinning ๐ smiley ๐ smile ๐ grin ๐ laughing satisfied ๐
sweat_smile ๐คฃ rofl ๐ joy ๐ slightly_smiling_face ๐ upside_down_face ๐ wink ๐ blush ๐ innocent ","date":"2021-07-01","objectID":"/blog/emoji/:1:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฑๆ่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ heart_eyes ๐ kissing_heart ๐ kissing โบ๏ธ relaxed ๐ kissing_closed_eyes ๐ kissing_smiling_eyes ","date":"2021-07-01","objectID":"/blog/emoji/:1:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ่ๅคด่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ yum ๐ stuck_out_tongue ๐ stuck_out_tongue_winking_eye ๐ stuck_out_tongue_closed_eyes ๐ค money_mouth_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅธฆๆ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ค hugs ๐ค thinking ","date":"2021-07-01","objectID":"/blog/emoji/:1:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไธญๆง่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ค zipper_mouth_face ๐ neutral_face ๐ expressionless ๐ถ no_mouth ๐ smirk ๐ unamused ๐ roll_eyes ๐ฌ grimacing ๐คฅ lying_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฐๅฆ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ relieved ๐ pensive ๐ช sleepy ๐คค drooling_face ๐ด sleeping ","date":"2021-07-01","objectID":"/blog/emoji/:1:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไธ้็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ท mask ๐ค face_with_thermometer ๐ค face_with_head_bandage ๐คข nauseated_face ๐คง sneezing_face ๐ต dizzy_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆดๅธฝๅญ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ค cowboy_hat_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆด็ผ้็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ sunglasses ๐ค nerd_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:9","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ
ๅฟ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ confused ๐ worried ๐ slightly_frowning_face โน frowning_face ๐ฎ open_mouth ๐ฏ hushed ๐ฒ astonished ๐ณ flushed ๐ฆ frowning ๐ง anguished ๐จ fearful ๐ฐ cold_sweat ๐ฅ disappointed_relieved ๐ข cry ๐ญ sob ๐ฑ scream ๐ confounded ๐ฃ persevere ๐ disappointed ๐ sweat ๐ฉ weary ๐ซ tired_face ","date":"2021-07-01","objectID":"/blog/emoji/:1:10","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฆๅฎ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ค triumph ๐ก pout rage ๐ angry ๐ smiling_imp ๐ฟ imp ๐ skull โ ๏ธ skull_and_crossbones ","date":"2021-07-01","objectID":"/blog/emoji/:1:11","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็นๆฎๆๆฎ็่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฉ hankey poop shit ๐คก clown_face ๐น japanese_ogre ๐บ japanese_goblin ๐ป ghost ๐ฝ alien ๐พ space_invader ๐ค robot ","date":"2021-07-01","objectID":"/blog/emoji/:1:12","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ซ่ธ่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐บ smiley_cat ๐ธ smile_cat ๐น joy_cat ๐ป heart_eyes_cat ๐ผ smirk_cat ๐ฝ kissing_cat ๐ scream_cat ๐ฟ crying_cat_face ๐พ pouting_cat ","date":"2021-07-01","objectID":"/blog/emoji/:1:13","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ด่ธ่กจๆ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ see_no_evil ๐ hear_no_evil ๐ speak_no_evil ","date":"2021-07-01","objectID":"/blog/emoji/:1:14","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ
ๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ kiss ๐ love_letter ๐ cupid ๐ gift_heart ๐ sparkling_heart ๐ heartpulse ๐ heartbeat ๐ revolving_hearts ๐ two_hearts ๐ heart_decoration โฃ๏ธ heavy_heart_exclamation ๐ broken_heart โค๏ธ heart ๐ yellow_heart ๐ green_heart ๐ blue_heart ๐ purple_heart ๐ค black_heart ๐ฏ 100 ๐ข anger ๐ฅ boom collision ๐ซ dizzy ๐ฆ sweat_drops ๐จ dash ๐ณ๏ธ hole ๐ฃ bomb ๐ฌ speech_balloon ๐๏ธโ๐จ๏ธ eye_speech_bubble ๐ฏ๏ธ right_anger_bubble ๐ญ thought_balloon ๐ค zzz ","date":"2021-07-01","objectID":"/blog/emoji/:1:15","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบบไธ่บซไฝ ","date":"2021-07-01","objectID":"/blog/emoji/:2:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅผ ๅผๆๆ็ๆๅฟ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ wave ๐ค raised_back_of_hand ๐๏ธ raised_hand_with_fingers_splayed โ hand raised_hand ๐ vulcan_salute ","date":"2021-07-01","objectID":"/blog/emoji/:2:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้จๅๆๆ็ๆๅฟ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ ok_hand โ๏ธ v ๐ค crossed_fingers ๐ค metal ๐ค call_me_hand ","date":"2021-07-01","objectID":"/blog/emoji/:2:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไธๆ นๆๆ็ๆๅฟ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ point_left ๐ point_right ๐ point_up_2 ๐ fu middle_finger ๐ point_down โ๏ธ point_up ","date":"2021-07-01","objectID":"/blog/emoji/:2:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆก็ดง็ๆๅฟ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ +1 thumbsup ๐ -1 thumbsdown โ fist fist_raised ๐ facepunch fist_oncoming punch ๐ค fist_left ๐ค fist_right ","date":"2021-07-01","objectID":"/blog/emoji/:2:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไธคๅชๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ clap ๐ raised_hands ๐ open_hands ๐ค handshake ๐ pray ","date":"2021-07-01","objectID":"/blog/emoji/:2:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆกไฝไธ่ฅฟ็ๆๅฟ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ writing_hand ๐
nail_care ๐คณ selfie ","date":"2021-07-01","objectID":"/blog/emoji/:2:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่บซไฝ้จไฝ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ช muscle ๐ ear ๐ nose ๐ eyes ๐๏ธ eye ๐
tongue ๐ lips ","date":"2021-07-01","objectID":"/blog/emoji/:2:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบบ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ถ baby ๐ฆ boy ๐ง girl :blonde_man: blonde_man person_with_blond_hair ๐จ man ๐ฉ woman ๐ฑโโ๏ธ blonde_woman ๐ด older_man ๐ต older_woman ","date":"2021-07-01","objectID":"/blog/emoji/:2:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่บซไฝๅจไฝ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐โโ๏ธ frowning_woman person_frowning ๐โโ๏ธ frowning_man ๐โโ๏ธ person_with_pouting_face pouting_woman ๐โโ๏ธ pouting_man ๐
โโ๏ธ ng_woman no_good no_good_woman ๐
โโ๏ธ ng_man no_good_man ๐โโ๏ธ ok_woman ๐โโ๏ธ ok_man ๐โโ๏ธ information_desk_person sassy_woman tipping_hand_woman ๐โโ๏ธ sassy_man tipping_hand_man ๐โโ๏ธ raising_hand raising_hand_woman ๐โโ๏ธ raising_hand_man ๐ bow bowing_man ๐โโ๏ธ bowing_woman ๐คฆโโ๏ธ man_facepalming ๐คฆโโ๏ธ woman_facepalming ๐คทโโ๏ธ man_shrugging ๐คทโโ๏ธ woman_shrugging ","date":"2021-07-01","objectID":"/blog/emoji/:2:9","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบบ็ฉ่ง่ฒ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐จโโ๏ธ man_health_worker ๐ฉโโ๏ธ woman_health_worker ๐จโ๐ man_student ๐ฉโ๐ woman_student ๐จโ๐ซ man_teacher ๐ฉโ๐ซ woman_teacher ๐จโโ๏ธ man_judge ๐ฉโโ๏ธ woman_judge ๐จโ๐พ man_farmer ๐ฉโ๐พ woman_farmer ๐จโ๐ณ man_cook ๐ฉโ๐ณ woman_cook ๐จโ๐ง man_mechanic ๐ฉโ๐ง woman_mechanic ๐จโ๐ญ man_factory_worker ๐ฉโ๐ญ woman_factory_worker ๐จโ๐ผ man_office_worker ๐ฉโ๐ผ woman_office_worker ๐จโ๐ฌ man_scientist ๐ฉโ๐ฌ woman_scientist ๐จโ๐ป man_technologist ๐ฉโ๐ป woman_technologist ๐จโ๐ค man_singer ๐ฉโ๐ค woman_singer ๐จโ๐จ man_artist ๐ฉโ๐จ woman_artist ๐จโโ๏ธ man_pilot ๐ฉโโ๏ธ woman_pilot ๐จโ๐ man_astronaut ๐ฉโ๐ woman_astronaut ๐จโ๐ man_firefighter ๐ฉโ๐ woman_firefighter ๐ฎโโ๏ธ cop policeman ๐ฎโโ๏ธ policewoman ๐ต detective male_detective ๐ต๏ธโโ๏ธ female_detective ๐โโ๏ธ guardsman ๐โโ๏ธ guardswoman ๐ทโโ๏ธ construction_worker construction_worker_man ๐ทโโ๏ธ construction_worker_woman ๐คด prince ๐ธ princess ๐ณโโ๏ธ man_with_turban ๐ณโโ๏ธ woman_with_turban ๐ฒ man_with_gua_pi_mao ๐คตโโ๏ธ man_in_tuxedo ๐ฐ bride_with_veil ๐คฐ pregnant_woman ","date":"2021-07-01","objectID":"/blog/emoji/:2:10","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅนปๆณ็ไบบ็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ผ angel ๐
santa ๐คถ mrs_claus ","date":"2021-07-01","objectID":"/blog/emoji/:2:11","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบบ็ฉๆดปๅจ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐โโ๏ธ massage massage_woman ๐โโ๏ธ massage_man ๐โโ๏ธ haircut haircut_woman ๐โโ๏ธ haircut_man ๐ถโโ๏ธ walking walking_man ๐ถโโ๏ธ walking_woman ๐โโ๏ธ runner running running_man ๐โโ๏ธ running_woman ๐ dancer ๐บ man_dancing ๐ด๏ธ business_suit_levitating ๐ฏโโ๏ธ dancers dancing_women ๐ฏโโ๏ธ dancing_men ","date":"2021-07-01","objectID":"/blog/emoji/:2:12","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไฝ่ฒ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐คบ person_fencing ๐ horse_racing โท๏ธ skier ๐ snowboarder ๐๏ธโโ๏ธ golfing_man ๐๏ธโโ๏ธ golfing_woman ๐โโ๏ธ surfer surfing_man ๐โโ๏ธ surfing_woman ๐ฃโโ๏ธ rowboat rowing_man ๐ฃโโ๏ธ rowing_woman ๐โโ๏ธ swimmer swimming_man ๐โโ๏ธ swimming_woman โน๏ธโโ๏ธ basketball_man โน๏ธโโ๏ธ basketball_woman ๐๏ธโโ๏ธ weight_lifting_man ๐๏ธโโ๏ธ weight_lifting_woman ๐ดโโ๏ธ bicyclist biking_man ๐ดโโ๏ธ biking_woman ๐ตโโ๏ธ mountain_bicyclist mountain_biking_man ๐ตโโ๏ธ mountain_biking_woman ๐คธโโ๏ธ man_cartwheeling ๐คธโโ๏ธ woman_cartwheeling ๐คผโโ๏ธ men_wrestling ๐คผโโ๏ธ women_wrestling ๐คฝโโ๏ธ man_playing_water_polo ๐คฝโโ๏ธ woman_playing_water_polo ๐คพโโ๏ธ man_playing_handball ๐คพโโ๏ธ woman_playing_handball ๐คนโโ๏ธ man_juggling ๐คนโโ๏ธ woman_juggling ","date":"2021-07-01","objectID":"/blog/emoji/:2:13","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไผๆฏ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ bath ๐ sleeping_bed ","date":"2021-07-01","objectID":"/blog/emoji/:2:14","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฎถๅบญ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ญ two_women_holding_hands ๐ซ couple ๐ฌ two_men_holding_hands ๐ฉโโค๏ธโ๐โ๐จ couplekiss_man_woman ๐จโโค๏ธโ๐โ๐จ couplekiss_man_man ๐ฉโโค๏ธโ๐โ๐ฉ couplekiss_woman_woman ๐ couple_with_heart couple_with_heart_woman_man ๐จโโค๏ธโ๐จ couple_with_heart_man_man ๐ฉโโค๏ธโ๐ฉ couple_with_heart_woman_woman ๐จโ๐ฉโ๐ฆ family family_man_woman_boy ๐จโ๐ฉโ๐ง family_man_woman_girl ๐จโ๐ฉโ๐งโ๐ฆ family_man_woman_girl_boy ๐จโ๐ฉโ๐ฆโ๐ฆ family_man_woman_boy_boy ๐จโ๐ฉโ๐งโ๐ง family_man_woman_girl_girl ๐จโ๐จโ๐ฆ family_man_man_boy ๐จโ๐จโ๐ง family_man_man_girl ๐จโ๐จโ๐งโ๐ฆ family_man_man_girl_boy ๐จโ๐จโ๐ฆโ๐ฆ family_man_man_boy_boy ๐จโ๐จโ๐งโ๐ง family_man_man_girl_girl ๐ฉโ๐ฉโ๐ฆ family_woman_woman_boy ๐ฉโ๐ฉโ๐ง family_woman_woman_girl ๐ฉโ๐ฉโ๐งโ๐ฆ family_woman_woman_girl_boy ๐ฉโ๐ฉโ๐ฆโ๐ฆ family_woman_woman_boy_boy ๐ฉโ๐ฉโ๐งโ๐ง family_woman_woman_girl_girl ๐จโ๐ฆ family_man_boy ๐จโ๐ฆโ๐ฆ family_man_boy_boy ๐จโ๐ง family_man_girl ๐จโ๐งโ๐ฆ family_man_girl_boy ๐จโ๐งโ๐ง family_man_girl_girl ๐ฉโ๐ฆ family_woman_boy ๐ฉโ๐ฆโ๐ฆ family_woman_boy_boy ๐ฉโ๐ง family_woman_girl ๐ฉโ๐งโ๐ฆ family_woman_girl_boy ๐ฉโ๐งโ๐ง family_woman_girl_girl ","date":"2021-07-01","objectID":"/blog/emoji/:2:15","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบบ็ฉ็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฃ speaking_head ๐ค bust_in_silhouette ๐ฅ busts_in_silhouette ๐ฃ footprints ","date":"2021-07-01","objectID":"/blog/emoji/:2:16","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅจ็ฉไธ่ช็ถ ","date":"2021-07-01","objectID":"/blog/emoji/:3:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅบไนณๅจ็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ต monkey_face ๐ monkey ๐ฆ gorilla ๐ถ dog ๐ dog2 ๐ฉ poodle ๐บ wolf ๐ฆ fox_face ๐ฑ cat ๐ cat2 ๐ฆ lion ๐ฏ tiger ๐
tiger2 ๐ leopard ๐ด horse ๐ racehorse ๐ฆ unicorn ๐ฆ deer ๐ฎ cow ๐ ox ๐ water_buffalo ๐ cow2 ๐ท pig ๐ pig2 ๐ boar ๐ฝ pig_nose ๐ ram ๐ sheep ๐ goat ๐ช dromedary_camel ๐ซ camel ๐ elephant ๐ฆ rhinoceros ๐ญ mouse ๐ mouse2 ๐ rat ๐น hamster ๐ฐ rabbit ๐ rabbit2 ๐ฟ๏ธ chipmunk ๐ฆ bat ๐ป bear ๐จ koala ๐ผ panda_face ๐พ feet paw_prints ","date":"2021-07-01","objectID":"/blog/emoji/:3:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ธ็ฑป ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฆ turkey ๐ chicken ๐ rooster ๐ฃ hatching_chick ๐ค baby_chick ๐ฅ hatched_chick ๐ฆ bird ๐ง penguin ๐ dove ๐ฆ
eagle ๐ฆ duck ๐ฆ owl ","date":"2021-07-01","objectID":"/blog/emoji/:3:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไธคๆ ๅจ็ฉ icon code icon code ๐ธ frog ","date":"2021-07-01","objectID":"/blog/emoji/:3:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฌ่ซ็ฑป ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ crocodile ๐ข turtle ๐ฆ lizard ๐ snake ๐ฒ dragon_face ๐ dragon ","date":"2021-07-01","objectID":"/blog/emoji/:3:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆตทๆดๅจ็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ณ whale ๐ whale2 ๐ฌ dolphin flipper ๐ fish ๐ tropical_fish ๐ก blowfish ๐ฆ shark ๐ octopus ๐ shell ","date":"2021-07-01","objectID":"/blog/emoji/:3:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่ซ็ฑป ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ snail ๐ฆ butterfly ๐ bug ๐ ant ๐ bee honeybee ๐ชฒ beetle ๐ท๏ธ spider ๐ธ๏ธ spider_web ๐ฆ scorpion ","date":"2021-07-01","objectID":"/blog/emoji/:3:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่ฑ็ฑปๆค็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ bouquet ๐ธ cherry_blossom ๐ฎ white_flower ๐ต๏ธ rosette ๐น rose ๐ฅ wilted_flower ๐บ hibiscus ๐ป sunflower ๐ผ blossom ๐ท tulip ","date":"2021-07-01","objectID":"/blog/emoji/:3:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ
ถๅฎๆค็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฑ seedling ๐ฒ evergreen_tree ๐ณ deciduous_tree ๐ด palm_tree ๐ต cactus ๐พ ear_of_rice ๐ฟ herb โ๏ธ shamrock ๐ four_leaf_clover ๐ maple_leaf ๐ fallen_leaf ๐ leaves ","date":"2021-07-01","objectID":"/blog/emoji/:3:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ฃ็ฉไธ้ฅฎๆ ","date":"2021-07-01","objectID":"/blog/emoji/:4:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆฐดๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ grapes ๐ melon ๐ watermelon ๐ mandarin orange tangerine ๐ lemon ๐ banana ๐ pineapple ๐ apple ๐ green_apple ๐ pear ๐ peach ๐ cherries ๐ strawberry ๐ฅ kiwi_fruit ๐
tomato ","date":"2021-07-01","objectID":"/blog/emoji/:4:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่ฌ่ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฅ avocado ๐ eggplant ๐ฅ potato ๐ฅ carrot ๐ฝ corn ๐ถ๏ธ hot_pepper ๐ฅ cucumber ๐ mushroom ๐ฅ peanuts ๐ฐ chestnut ","date":"2021-07-01","objectID":"/blog/emoji/:4:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฟซ้ค ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ bread ๐ฅ croissant ๐ฅ baguette_bread ๐ฅ pancakes ๐ง cheese ๐ meat_on_bone ๐ poultry_leg ๐ฅ bacon ๐ hamburger ๐ fries ๐ pizza ๐ญ hotdog ๐ฎ taco ๐ฏ burrito ๐ฅ stuffed_flatbread ๐ฅ egg ๐ณ fried_egg ๐ฅ shallow_pan_of_food ๐ฒ stew ๐ฅ green_salad ๐ฟ popcorn ","date":"2021-07-01","objectID":"/blog/emoji/:4:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบๆดฒ้ฃ็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฑ bento ๐ rice_cracker ๐ rice_ball ๐ rice ๐ curry ๐ ramen ๐ spaghetti ๐ sweet_potato ๐ข oden ๐ฃ sushi ๐ค fried_shrimp ๐ฅ fish_cake ๐ก dango ","date":"2021-07-01","objectID":"/blog/emoji/:4:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆตท้ฒ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฆ crab ๐ฆ shrimp ๐ฆ squid ","date":"2021-07-01","objectID":"/blog/emoji/:4:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็็น ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฆ icecream ๐ง shaved_ice ๐จ ice_cream ๐ฉ doughnut ๐ช cookie ๐ birthday ๐ฐ cake ๐ซ chocolate_bar ๐ฌ candy ๐ญ lollipop ๐ฎ custard ๐ฏ honey_pot ","date":"2021-07-01","objectID":"/blog/emoji/:4:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ฅฎๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ผ baby_bottle ๐ฅ milk_glass โ coffee ๐ต tea ๐ถ sake ๐พ champagne ๐ท wine_glass ๐ธ cocktail ๐น tropical_drink ๐บ beer ๐ป beers ๐ฅ clinking_glasses ๐ฅ tumbler_glass ","date":"2021-07-01","objectID":"/blog/emoji/:4:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้คๅ
ท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฝ๏ธ plate_with_cutlery ๐ด fork_and_knife ๐ฅ spoon ๐ช hocho knife ๐บ amphora ","date":"2021-07-01","objectID":"/blog/emoji/:4:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ
ๆธธไธๅฐ็ ","date":"2021-07-01","objectID":"/blog/emoji/:5:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฐๅพ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ earth_africa ๐ earth_americas ๐ earth_asia ๐ globe_with_meridians ๐บ๏ธ world_map ๐พ japan ","date":"2021-07-01","objectID":"/blog/emoji/:5:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฐ็็ฐ่ฑก ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ mountain_snow โฐ๏ธ mountain ๐ volcano ๐ป mount_fuji ๐๏ธ camping โฑ beach_umbrella ๐๏ธ desert ๐๏ธ desert_island ๐๏ธ national_park ","date":"2021-07-01","objectID":"/blog/emoji/:5:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅปบ็ญ็ฉ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐๏ธ stadium ๐๏ธ classical_building ๐๏ธ building_construction ๐ houses ๐ derelict_house ๐ house ๐ก house_with_garden ๐ข office ๐ฃ post_office ๐ค european_post_office ๐ฅ hospital ๐ฆ bank ๐จ hotel ๐ฉ love_hotel ๐ช convenience_store ๐ซ school ๐ฌ department_store ๐ญ factory ๐ฏ japanese_castle ๐ฐ european_castle ๐ wedding ๐ผ tokyo_tower ๐ฝ statue_of_liberty ","date":"2021-07-01","objectID":"/blog/emoji/:5:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฎๆๅปบ็ญ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โช church ๐ mosque ๐ synagogue โฉ๏ธ shinto_shrine ๐ kaaba ","date":"2021-07-01","objectID":"/blog/emoji/:5:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ
ถๅฎๅฐ็น ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โฒ fountain โบ tent ๐ foggy ๐ night_with_stars ๐๏ธ cityscape ๐ sunrise_over_mountains ๐
sunrise ๐ city_sunset ๐ city_sunrise ๐ bridge_at_night โจ๏ธ hotsprings ๐ carousel_horse ๐ก ferris_wheel ๐ข roller_coaster ๐ barber ๐ช circus_tent ","date":"2021-07-01","objectID":"/blog/emoji/:5:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้่ทฏ่ฟ่พ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ steam_locomotive ๐ railway_car ๐ bullettrain_side ๐
bullettrain_front ๐ train2 ๐ metro ๐ light_rail ๐ station ๐ tram ๐ monorail ๐ mountain_railway ๐ train ๐ bus ๐ oncoming_bus ๐ trolleybus ๐ minibus ๐ ambulance ๐ fire_engine ๐ police_car ๐ oncoming_police_car ๐ taxi ๐ oncoming_taxi ๐ car red_car ๐ oncoming_automobile ๐ blue_car ๐ truck ๐ articulated_lorry ๐ tractor ๐๏ธ racing_car ๐ motorcycle ๐ต motor_scooter ๐ฒ bike ๐ด kick_scooter ๐ busstop ๐ฃ๏ธ motorway ๐ค๏ธ railway_track ๐ข๏ธ oil_drum โฝ fuelpump ๐จ rotating_light ๐ฅ traffic_light ๐ฆ vertical_traffic_light ๐ stop_sign ๐ง construction ","date":"2021-07-01","objectID":"/blog/emoji/:5:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆฐด่ทฏ่ฟ่พ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ anchor โต boat sailboat ๐ถ canoe ๐ค speedboat ๐ณ๏ธ passenger_ship โด๏ธ ferry ๐ฅ๏ธ motor_boat ๐ข ship ","date":"2021-07-01","objectID":"/blog/emoji/:5:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฉบไธญ่ฟ่พ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ airplane ๐ฉ๏ธ small_airplane ๐ซ flight_departure ๐ฌ flight_arrival ๐บ seat ๐ helicopter ๐ suspension_railway ๐ mountain_cableway ๐ก aerial_tramway ๐ฐ๏ธ artificial_satellite ๐ rocket ","date":"2021-07-01","objectID":"/blog/emoji/:5:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ
้ฆ icon code icon code ๐๏ธ bellhop_bell ","date":"2021-07-01","objectID":"/blog/emoji/:5:9","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆถ้ด ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ hourglass โณ hourglass_flowing_sand โ watch โฐ alarm_clock โฑ๏ธ stopwatch โฒ๏ธ timer_clock ๐ฐ๏ธ mantelpiece_clock ๐ clock12 ๐ง clock1230 ๐ clock1 ๐ clock130 ๐ clock2 ๐ clock230 ๐ clock3 ๐ clock330 ๐ clock4 ๐ clock430 ๐ clock5 ๐ clock530 ๐ clock6 ๐ก clock630 ๐ clock7 ๐ข clock730 ๐ clock8 ๐ฃ clock830 ๐ clock9 ๐ค clock930 ๐ clock10 ๐ฅ clock1030 ๐ clock11 ๐ฆ clock1130 ","date":"2021-07-01","objectID":"/blog/emoji/:5:10","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅคฉ็ฉบไธๅคฉๆฐ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ new_moon ๐ waxing_crescent_moon ๐ first_quarter_moon ๐ moon waxing_gibbous_moon ๐ full_moon ๐ waning_gibbous_moon ๐ last_quarter_moon ๐ waning_crescent_moon ๐ crescent_moon ๐ new_moon_with_face ๐ first_quarter_moon_with_face ๐ last_quarter_moon_with_face ๐ก๏ธ thermometer โ๏ธ sunny ๐ full_moon_with_face ๐ sun_with_face โญ star ๐ star2 ๐ stars ๐ milky_way โ๏ธ cloud โ
partly_sunny โ cloud_with_lightning_and_rain ๐ค sun_behind_small_cloud ๐ฅ sun_behind_large_cloud ๐ฆ sun_behind_rain_cloud ๐ง cloud_with_rain ๐จ cloud_with_snow ๐ฉ cloud_with_lightning ๐ช๏ธ tornado ๐ซ๏ธ fog ๐ฌ wind_face ๐ cyclone ๐ rainbow ๐ closed_umbrella โ๏ธ open_umbrella โ๏ธ umbrella โฑ๏ธ parasol_on_ground โก zap โ๏ธ snowflake โ๏ธ snowman_with_snow โ๏ธ snowman โ๏ธ comet ๐ฅ fire ๐ง droplet ๐ ocean ","date":"2021-07-01","objectID":"/blog/emoji/:5:11","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆดปๅจ ","date":"2021-07-01","objectID":"/blog/emoji/:6:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบไปถ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ jack_o_lantern ๐ christmas_tree ๐ fireworks ๐ sparkler โจ sparkles ๐ balloon ๐ tada ๐ confetti_ball ๐ tanabata_tree ๐ bamboo ๐ dolls ๐ flags ๐ wind_chime ๐ rice_scene ๐ ribbon ๐ gift ๐๏ธ reminder_ribbon ๐ tickets ๐ซ ticket ","date":"2021-07-01","objectID":"/blog/emoji/:6:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฅๆฏไธๅฅ็ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐๏ธ medal_military ๐ trophy ๐
medal_sports ๐ฅ 1st_place_medal ๐ฅ 2nd_place_medal ๐ฅ 3rd_place_medal ","date":"2021-07-01","objectID":"/blog/emoji/:6:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไฝ่ฒ่ฟๅจ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โฝ soccer โพ baseball ๐ basketball ๐ volleyball ๐ football ๐ rugby_football ๐พ tennis ๐ณ bowling ๐ฆ cricket ๐ field_hockey ๐ ice_hockey ๐ ping_pong ๐ธ badminton ๐ฅ boxing_glove ๐ฅ martial_arts_uniform ๐ฅ
goal_net โณ golf โธ๏ธ ice_skate ๐ฃ fishing_pole_and_fish ๐ฝ running_shirt_with_sash ๐ฟ ski ","date":"2021-07-01","objectID":"/blog/emoji/:6:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆธธๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฏ dart ๐ฑ 8ball ๐ฎ crystal_ball ๐ฎ video_game ๐น๏ธ joystick ๐ฐ slot_machine ๐ฒ game_die โ ๏ธ spades โฅ๏ธ hearts โฆ๏ธ diamonds โฃ๏ธ clubs ๐ black_joker ๐ mahjong ๐ด flower_playing_cards ","date":"2021-07-01","objectID":"/blog/emoji/:6:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่บๆฏไธๅทฅ่บ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ญ performing_arts ๐ผ framed_picture ๐จ art ","date":"2021-07-01","objectID":"/blog/emoji/:6:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฉๅ ","date":"2021-07-01","objectID":"/blog/emoji/:7:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ่ฃ
ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ eyeglasses ๐ถ๏ธ dark_sunglasses ๐ necktie ๐ shirt tshirt ๐ jeans ๐ dress ๐ kimono ๐ bikini ๐ womans_clothes ๐ purse ๐ handbag ๐ pouch ๐๏ธ shopping ๐ school_satchel ๐ mans_shoe shoe ๐ athletic_shoe ๐ high_heel ๐ก sandal ๐ข boot ๐ crown ๐ womans_hat ๐ฉ tophat ๐ mortar_board โ๏ธ rescue_worker_helmet ๐ฟ prayer_beads ๐ lipstick ๐ ring ๐ gem ","date":"2021-07-01","objectID":"/blog/emoji/:7:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฃฐ้ณ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ mute ๐ speaker ๐ sound ๐ loud_sound ๐ข loudspeaker ๐ฃ mega ๐ฏ postal_horn ๐ bell ๐ no_bell ","date":"2021-07-01","objectID":"/blog/emoji/:7:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ณไน ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ผ musical_score ๐ต musical_note ๐ถ notes ๐๏ธ studio_microphone ๐๏ธ level_slider ๐๏ธ control_knobs ๐ค microphone ๐ง headphones ๐ป radio ","date":"2021-07-01","objectID":"/blog/emoji/:7:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไนๅจ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ท saxophone ๐ธ guitar ๐น musical_keyboard ๐บ trumpet ๐ป violin ๐ฅ drum ","date":"2021-07-01","objectID":"/blog/emoji/:7:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ต่ฏ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฑ iphone ๐ฒ calling โ๏ธ phone telephone ๐ telephone_receiver ๐ pager ๐ fax ","date":"2021-07-01","objectID":"/blog/emoji/:7:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ต่ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ battery ๐ electric_plug ๐ป computer ๐ฅ๏ธ desktop_computer ๐จ๏ธ printer โจ๏ธ keyboard ๐ฑ computer_mouse ๐ฒ๏ธ trackball ๐ฝ minidisc ๐พ floppy_disk ๐ฟ cd ๐ dvd ","date":"2021-07-01","objectID":"/blog/emoji/:7:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฏๅ
ไธๅฝฑๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฅ movie_camera ๐๏ธ film_strip ๐ฝ๏ธ film_projector ๐ฌ clapper ๐บ tv ๐ท camera ๐ธ camera_flash ๐น video_camera ๐ผ vhs ๐ mag ๐ mag_right ๐ฏ๏ธ candle ๐ก bulb ๐ฆ flashlight ๐ฎ izakaya_lantern lantern ","date":"2021-07-01","objectID":"/blog/emoji/:7:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไนฆไธ็บธๅผ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ notebook_with_decorative_cover ๐ closed_book ๐ book open_book ๐ green_book ๐ blue_book ๐ orange_book ๐ books ๐ notebook ๐ ledger ๐ page_with_curl ๐ scroll ๐ page_facing_up ๐ฐ newspaper ๐๏ธ newspaper_roll ๐ bookmark_tabs ๐ bookmark ๐ท๏ธ label ","date":"2021-07-01","objectID":"/blog/emoji/:7:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ฑ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฐ moneybag ๐ด yen ๐ต dollar ๐ถ euro ๐ท pound ๐ธ money_with_wings ๐ณ credit_card ๐น chart ","date":"2021-07-01","objectID":"/blog/emoji/:7:9","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ฎไปถ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ email envelope ๐ง ๐ง ๐จ incoming_envelope ๐ฉ envelope_with_arrow ๐ค outbox_tray ๐ฅ inbox_tray ๐ฆ package ๐ซ mailbox ๐ช mailbox_closed ๐ฌ mailbox_with_mail ๐ญ mailbox_with_no_mail ๐ฎ postbox ๐ณ ballot_box ","date":"2021-07-01","objectID":"/blog/emoji/:7:10","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไนฆๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ pencil2 โ๏ธ black_nib ๐ fountain_pen ๐ pen ๐ paintbrush ๐ crayon ๐ memo pencil ","date":"2021-07-01","objectID":"/blog/emoji/:7:11","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅๅ
ฌ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ผ briefcase ๐ file_folder ๐ open_file_folder ๐๏ธ card_index_dividers ๐
date ๐ calendar ๐ spiral_notepad ๐ spiral_calendar ๐ card_index ๐ chart_with_upwards_trend ๐ chart_with_downwards_trend ๐ bar_chart ๐ clipboard ๐ pushpin ๐ round_pushpin ๐ paperclip ๐ paperclips ๐ straight_ruler ๐ triangular_ruler โ๏ธ scissors ๐๏ธ card_file_box ๐๏ธ file_cabinet ๐๏ธ wastebasket ","date":"2021-07-01","objectID":"/blog/emoji/:7:12","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"้ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ lock ๐ unlock ๐ lock_with_ink_pen ๐ closed_lock_with_key ๐ key ๐๏ธ old_key ","date":"2021-07-01","objectID":"/blog/emoji/:7:13","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅทฅๅ
ท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐จ hammer โ๏ธ pick โ๏ธ hammer_and_pick ๐ ๏ธ hammer_and_wrench ๐ก dagger โ๏ธ crossed_swords ๐ซ gun ๐น bow_and_arrow ๐ก๏ธ shield ๐ง wrench ๐ฉ nut_and_bolt โ๏ธ gear ๐ clamp โ balance_scale ๐ link โ๏ธ chains ","date":"2021-07-01","objectID":"/blog/emoji/:7:14","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็งๅญฆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ alembic ๐ฌ microscope ๐ญ telescope ๐ฐ๏ธ satellite ","date":"2021-07-01","objectID":"/blog/emoji/:7:15","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅป็ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ syringe ๐ pill ","date":"2021-07-01","objectID":"/blog/emoji/:7:16","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ๆดป็จๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ช door ๐๏ธ bed ๐๏ธ couch_and_lamp ๐ฝ toilet ๐ฟ shower ๐ bathtub ๐ shopping_cart ","date":"2021-07-01","objectID":"/blog/emoji/:7:17","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ
ถๅฎ็ฉๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฌ smoking โฐ๏ธ coffin โฑ๏ธ funeral_urn ๐ฟ moyai ","date":"2021-07-01","objectID":"/blog/emoji/:7:18","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฌฆๅท ","date":"2021-07-01","objectID":"/blog/emoji/:8:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ไบค้ๆ ่ฏ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ง atm ๐ฎ put_litter_in_its_place ๐ฐ potable_water โฟ wheelchair ๐น mens ๐บ womens ๐ป restroom ๐ผ baby_symbol ๐พ wc ๐ passport_control ๐ customs ๐ baggage_claim ๐
left_luggage ","date":"2021-07-01","objectID":"/blog/emoji/:8:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่ญฆๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ ๏ธ warning ๐ธ children_crossing โ no_entry ๐ซ no_entry_sign ๐ณ no_bicycles ๐ญ no_smoking ๐ฏ do_not_litter ๐ฑ ๐ฑ ๐ท no_pedestrians ๐ต no_mobile_phones ๐ underage โข radioactive โฃ biohazard ","date":"2021-07-01","objectID":"/blog/emoji/:8:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็ฎญๅคด ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โฌ๏ธ arrow_up โ๏ธ arrow_upper_right โก๏ธ arrow_right โ๏ธ arrow_lower_right โฌ๏ธ arrow_down โ๏ธ arrow_lower_left โฌ
๏ธ arrow_left โ๏ธ arrow_upper_left โ๏ธ arrow_up_down โ๏ธ left_right_arrow โฉ๏ธ leftwards_arrow_with_hook โช๏ธ arrow_right_hook โคด๏ธ arrow_heading_up โคต๏ธ arrow_heading_down ๐ arrows_clockwise ๐ arrows_counterclockwise ๐ back ๐ end ๐ on ๐ soon ๐ top ","date":"2021-07-01","objectID":"/blog/emoji/:8:3","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฎๆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ place_of_worship โ๏ธ atom_symbol ๐ om โก๏ธ star_of_david โธ๏ธ wheel_of_dharma โฏ๏ธ yin_yang โ๏ธ latin_cross โฆ๏ธ orthodox_cross โช๏ธ star_and_crescent โฎ๏ธ peace_symbol ๐ menorah ๐ฏ six_pointed_star ","date":"2021-07-01","objectID":"/blog/emoji/:8:4","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"็่ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ aries โ taurus โ gemini โ cancer โ leo โ virgo โ libra โ scorpius โ sagittarius โ capricorn โ aquarius โ pisces โ ophiuchus ","date":"2021-07-01","objectID":"/blog/emoji/:8:5","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฝฑๅ็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ twisted_rightwards_arrows ๐ repeat ๐ repeat_one โถ๏ธ arrow_forward โฉ fast_forward โญ next_track_button โฏ play_or_pause_button โ๏ธ arrow_backward โช rewind โฎ๏ธ previous_track_button ๐ผ arrow_up_small โซ arrow_double_up ๐ฝ arrow_down_small โฌ arrow_double_down โธ pause_button โน stop_button โบ record_button ๐ฆ cinema ๐
low_brightness ๐ high_brightness ๐ถ signal_strength ๐ณ vibration_mode ๐ด mobile_phone_off ","date":"2021-07-01","objectID":"/blog/emoji/:8:6","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆฐๅญฆ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โ๏ธ heavy_multiplication_x โ heavy_plus_sign โ heavy_minus_sign โ heavy_division_sign ","date":"2021-07-01","objectID":"/blog/emoji/:8:7","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ ็น็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โผ๏ธ bangbang โ๏ธ interrobang โ question โ grey_question โ grey_exclamation โ exclamation heavy_exclamation_mark ใฐ๏ธ wavy_dash ","date":"2021-07-01","objectID":"/blog/emoji/:8:8","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"่ดงๅธ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฑ currency_exchange ๐ฒ heavy_dollar_sign ","date":"2021-07-01","objectID":"/blog/emoji/:8:9","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆ้ฎ็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ #๏ธโฃ hash *๏ธโฃ asterisk 0๏ธโฃ zero 1๏ธโฃ one 2๏ธโฃ two 3๏ธโฃ three 4๏ธโฃ four 5๏ธโฃ five 6๏ธโฃ six 7๏ธโฃ seven 8๏ธโฃ eight 9๏ธโฃ nine ๐ keycap_ten ","date":"2021-07-01","objectID":"/blog/emoji/:8:10","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅญๆฏ็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ capital_abcd ๐ก abcd ๐ข 1234 ๐ฃ symbols ๐ค abc ๐
ฐ๏ธ a ๐ ab ๐
ฑ๏ธ b ๐ cl ๐ cool ๐ free โน๏ธ information_source ๐ id โ๏ธ m ๐ new ๐ ng ๐
พ๏ธ o2 ๐ ok ๐
ฟ๏ธ parking ๐ sos ๐ up ๐ vs ๐ koko ๐๏ธ sa ๐ท๏ธ u6708 ๐ถ u6709 ๐ฏ u6307 ๐ ideograph_advantage ๐น u5272 ๐ u7121 ๐ฒ u7981 ๐ accept ๐ธ u7533 ๐ด u5408 ๐ณ u7a7a ใ๏ธ congratulations ใ๏ธ secret ๐บ u55b6 ๐ต u6e80 ","date":"2021-07-01","objectID":"/blog/emoji/:8:11","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ ไฝ็ฌฆๅท ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ด red_circle ๐ต large_blue_circle โซ black_circle โช white_circle โฌ black_large_square โฌ white_large_square โผ๏ธ black_medium_square โป๏ธ white_medium_square โพ black_medium_small_square โฝ white_medium_small_square โช๏ธ black_small_square โซ๏ธ white_small_square ๐ถ large_orange_diamond ๐ท large_blue_diamond ๐ธ small_orange_diamond ๐น small_blue_diamond ๐บ small_red_triangle ๐ป small_red_triangle_down ๐ diamond_shape_with_a_dot_inside ๐ radio_button ๐ณ white_square_button ๐ฒ black_square_button ","date":"2021-07-01","objectID":"/blog/emoji/:8:12","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅ
ถๅฎ็ฌฆๅ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ โป๏ธ recycle โ๏ธ fleur_de_lis ๐ฑ trident ๐ name_badge ๐ฐ beginner โญ o โ
white_check_mark โ๏ธ ballot_box_with_check โ๏ธ heavy_check_mark โ x โ negative_squared_cross_mark โฐ curly_loop โฟ loop ใฝ๏ธ part_alternation_mark โณ๏ธ eight_spoked_asterisk โด๏ธ eight_pointed_black_star โ๏ธ sparkle ยฉ๏ธ copyright ยฎ๏ธ registered โข๏ธ tm ","date":"2021-07-01","objectID":"/blog/emoji/:8:13","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๆๅธ ","date":"2021-07-01","objectID":"/blog/emoji/:9:0","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅธธ็จๆๅธ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ checkered_flag ๐ฉ triangular_flag_on_post ๐ crossed_flags ๐ด black_flag ๐ณ white_flag ๐ณ๏ธโ๐ rainbow_flag ","date":"2021-07-01","objectID":"/blog/emoji/:9:1","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"},{"categories":["Hugo"],"content":"ๅฝๅฎถๅๅฐๅบๆๅธ ๅพๆ ไปฃ็ ๅพๆ ไปฃ็ ๐ฆ๐ฉ andorra ๐ฆ๐ช united_arab_emirates ๐ฆ๐ซ afghanistan ๐ฆ๐ฌ antigua_barbuda ๐ฆ๐ฎ anguilla ๐ฆ๐ฑ albania ๐ฆ๐ฒ armenia ๐ฆ๐ด angola ๐ฆ๐ถ antarctica ๐ฆ๐ท argentina ๐ฆ๐ธ american_samoa ๐ฆ๐น austria ๐ฆ๐บ australia ๐ฆ๐ผ aruba ๐ฆ๐ฝ aland_islands ๐ฆ๐ฟ azerbaijan ๐ง๐ฆ bosnia_herzegovina ๐ง๐ง barbados ๐ง๐ฉ bangladesh ๐ง๐ช belgium ๐ง๐ซ burkina_faso ๐ง๐ฌ bulgaria ๐ง๐ญ bahrain ๐ง๐ฎ burundi ๐ง๐ฏ benin ๐ง๐ฑ st_barthelemy ๐ง๐ฒ bermuda ๐ง๐ณ brunei ๐ง๐ด bolivia ๐ง๐ถ caribbean_netherlands ๐ง๐ท brazil ๐ง๐ธ bahamas ๐ง๐น bhutan ๐ง๐ผ botswana ๐ง๐พ belarus ๐ง๐ฟ belize ๐จ๐ฆ canada ๐จ๐จ cocos_islands ๐จ๐ฉ congo_kinshasa ๐จ๐ซ central_african_republic ๐จ๐ฌ congo_brazzaville ๐จ๐ญ switzerland ๐จ๐ฎ cote_divoire ๐จ๐ฐ cook_islands ๐จ๐ฑ chile ๐จ๐ฒ cameroon ๐จ๐ณ cn ๐จ๐ด colombia ๐จ๐ท costa_rica ๐จ๐บ cuba ๐จ๐ป cape_verde ๐จ๐ผ curacao ๐จ๐ฝ christmas_island ๐จ๐พ cyprus ๐จ๐ฟ czech_republic ๐ฉ๐ช de ๐ฉ๐ฏ djibouti ๐ฉ๐ฐ denmark ๐ฉ๐ฒ dominica ๐ฉ๐ด dominican_republic ๐ฉ๐ฟ algeria ๐ช๐จ ecuador ๐ช๐ช estonia ๐ช๐ฌ egypt ๐ช๐ญ western_sahara ๐ช๐ท eritrea ๐ช๐ธ es ๐ช๐น ethiopia ๐ช๐บ eu european_union ๐ซ๐ฎ finland ๐ซ๐ฏ fiji ๐ซ๐ฐ falkland_islands ๐ซ๐ฒ micronesia ๐ซ๐ด faroe_islands ๐ซ๐ท fr ๐ฌ๐ฆ gabon ๐ฌ๐ง gb uk ๐ฌ๐ฉ grenada ๐ฌ๐ช georgia ๐ฌ๐ซ french_guiana ๐ฌ๐ฌ guernsey ๐ฌ๐ญ ghana ๐ฌ๐ฎ gibraltar ๐ฌ๐ฑ greenland ๐ฌ๐ฒ gambia ๐ฌ๐ณ guinea ๐ฌ๐ต guadeloupe ๐ฌ๐ถ equatorial_guinea ๐ฌ๐ท greece ๐ฌ๐ธ south_georgia_south_sandwich_islands ๐ฌ๐น guatemala ๐ฌ๐บ guam ๐ฌ๐ผ guinea_bissau ๐ฌ๐พ guyana ๐ญ๐ฐ hong_kong ๐ญ๐ณ honduras ๐ญ๐ท croatia ๐ญ๐น haiti ๐ญ๐บ hungary ๐ฎ๐จ canary_islands ๐ฎ๐ฉ indonesia ๐ฎ๐ช ireland ๐ฎ๐ฑ israel ๐ฎ๐ฒ isle_of_man ๐ฎ๐ณ india ๐ฎ๐ด british_indian_ocean_territory ๐ฎ๐ถ iraq ๐ฎ๐ท iran ๐ฎ๐ธ iceland ๐ฎ๐น it ๐ฏ๐ช jersey ๐ฏ๐ฒ jamaica ๐ฏ๐ด jordan ๐ฏ๐ต jp ๐ฐ๐ช kenya ๐ฐ๐ฌ kyrgyzstan ๐ฐ๐ญ cambodia ๐ฐ๐ฎ kiribati ๐ฐ๐ฒ comoros ๐ฐ๐ณ st_kitts_nevis ๐ฐ๐ต north_korea ๐ฐ๐ท kr ๐ฐ๐ผ kuwait ๐ฐ๐พ cayman_islands ๐ฐ๐ฟ kazakhstan ๐ฑ๐ฆ laos ๐ฑ๐ง lebanon ๐ฑ๐จ st_lucia ๐ฑ๐ฎ liechtenstein ๐ฑ๐ฐ sri_lanka ๐ฑ๐ท liberia ๐ฑ๐ธ lesotho ๐ฑ๐น lithuania ๐ฑ๐บ luxembourg ๐ฑ๐ป latvia ๐ฑ๐พ libya ๐ฒ๐ฆ morocco ๐ฒ๐จ monaco ๐ฒ๐ฉ moldova ๐ฒ๐ช montenegro ๐ฒ๐ฌ madagascar ๐ฒ๐ญ marshall_islands ๐ฒ๐ฐ macedonia ๐ฒ๐ฑ mali ๐ฒ๐ฒ myanmar ๐ฒ๐ณ mongolia ๐ฒ๐ด macau ๐ฒ๐ต northern_mariana_islands ๐ฒ๐ถ martinique ๐ฒ๐ท mauritania ๐ฒ๐ธ montserrat ๐ฒ๐น malta ๐ฒ๐บ mauritius ๐ฒ๐ป maldives ๐ฒ๐ผ malawi ๐ฒ๐ฝ mexico ๐ฒ๐พ malaysia ๐ฒ๐ฟ mozambique ๐ณ๐ฆ namibia ๐ณ๐จ new_caledonia ๐ณ๐ช niger ๐ณ๐ซ norfolk_island ๐ณ๐ฌ nigeria ๐ณ๐ฎ nicaragua ๐ณ๐ฑ netherlands ๐ณ๐ด norway ๐ณ๐ต nepal ๐ณ๐ท nauru ๐ณ๐บ niue ๐ณ๐ฟ new_zealand ๐ด๐ฒ oman ๐ต๐ฆ panama ๐ต๐ช peru ๐ต๐ซ french_polynesia ๐ต๐ฌ papua_new_guinea ๐ต๐ญ philippines ๐ต๐ฐ pakistan ๐ต๐ฑ poland ๐ต๐ฒ st_pierre_miquelon ๐ต๐ณ pitcairn_islands ๐ต๐ท puerto_rico ๐ต๐ธ palestinian_territories ๐ต๐น portugal ๐ต๐ผ palau ๐ต๐พ paraguay ๐ถ๐ฆ qatar ๐ท๐ช reunion ๐ท๐ด romania ๐ท๐ธ serbia ๐ท๐บ ru ๐ท๐ผ rwanda ๐ธ๐ฆ saudi_arabia ๐ธ๐ง solomon_islands ๐ธ๐จ seychelles ๐ธ๐ฉ sudan ๐ธ๐ช sweden ๐ธ๐ฌ singapore ๐ธ๐ญ st_helena ๐ธ๐ฎ slovenia ๐ธ๐ฐ slovakia ๐ธ๐ฑ sierra_leone ๐ธ๐ฒ san_marino ๐ธ๐ณ senegal ๐ธ๐ด somalia ๐ธ๐ท suriname ๐ธ๐ธ south_sudan ๐ธ๐น sao_tome_principe ๐ธ๐ป el_salvador ๐ธ๐ฝ sint_maarten ๐ธ๐พ syria ๐ธ๐ฟ swaziland ๐น๐จ turks_caicos_islands ๐น๐ฉ chad ๐น๐ซ french_southern_territories ๐น๐ฌ togo ๐น๐ญ thailand ๐น๐ฏ tajikistan ๐น๐ฐ tokelau ๐น๐ฑ timor_leste ๐น๐ฒ turkmenistan ๐น๐ณ tunisia ๐น๐ด tonga ๐น๐ท tr ๐น๐น trinidad_tobago ๐น๐ป tuvalu ๐น๐ผ taiwan ๐น๐ฟ tanzania ๐บ๐ฆ ukraine ๐บ๐ฌ uganda ๐บ๐ธ us ๐บ๐พ uruguay ๐บ๐ฟ uzbekistan ๐ป๐ฆ vatican_city ๐ป๐จ st_vincent_grenadines ๐ป๐ช venezuela ๐ป๐ฌ british_virgin_islands ๐ป๐ฎ us_virgin_islands ๐ป๐ณ vietnam ๐ป๐บ vanuatu ๐ผ๐ซ wallis_futuna ๐ผ๐ธ samoa ๐ฝ๐ฐ kosovo ๐พ๐ช yemen ๐พ๐น mayotte ๐ฟ๐ฆ south_africa ๐ฟ๐ฒ zambia ๐ฟ๐ผ zimbabwe ","date":"2021-07-01","objectID":"/blog/emoji/:9:2","tags":["emoji"],"title":"Emoji ๆฏๆ","uri":"/blog/emoji/"}]