{"id":10312,"date":"2020-10-01T15:37:33","date_gmt":"2020-10-01T06:37:33","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10312"},"modified":"2020-10-05T07:10:34","modified_gmt":"2020-10-04T22:10:34","slug":"read-write-lock-%ed%8c%a8%ed%84%b4","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10312","title":{"rendered":"Read-Write Lock \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134 \uba85\uce6d<\/h4>\n<p>Read-Write Lock<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>Database\uc5d0\uc11c \uc5b4\ub5a4 \ud14c\uc774\ube14\uc774 \uc788\ub2e4\uace0 \ud558\uc790. \uc774 \ud14c\uc774\ube14\uc740 \ub2e4\uc218\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \uc77d\uace0 \uc4f0\uc774\ub294 \ub300\uc0c1\uc774\ub2e4. \uc5b4\ub5a4 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc774 \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \uc4f0\uace0, \uc5b4\ub5a4 \ub610 \ub2e4\ub978 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc774 \ud14c\uc774\ube14\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc77d\ub294\ub2e4. \uadf8\ub7f0\ub370 \ub9cc\uc57d 2\uac1c\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ud2b9\uc815 \ub808\ucf54\ub4dc \ub370\uc774\ud130\ub97c \ub3d9\uc2dc\uc5d0 \uac01\uac01 \uc4f0\uace0 \uc77d\uae30\ub97c \uc218\ud589\ud558\uba74 \uc77d\ub294 \uc4f0\ub808\ub4dc \ucabd\uc5d0\uc11c\ub294 \ub9dd\uac00\uc9c4 \ub370\uc774\ud130\ub97c \uc77d\uc744 \uc218 \uc788\ub2e4. \ub610\ud55c \ub9cc\uc57d 2\uac1c\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \ud2b9\uc815 \ub808\ucf54\ub4dc \ub370\uc774\ud130\ub97c \uc4f0\ub824\uace0 \ud560\ub54c \ub9dd\uac00\uc9c4 \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub420 \uc218 \uc788\ub2e4. \ubb38\uc81c\uac00 \uc5c6\ub294 \uacbd\uc6b0\ub294 2\uac1c\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub3d9\uc2dc\uc5d0 \ud2b9\uc815 \ub808\ucf54\ub4dc\uc758 \ub370\uc774\ud130\ub97c \uc77d\uc744 \ub54c \ubfd0\uc774\ub2e4. \uc774 \ud328\ud134\uc740 \uc5b4\ub5a4 \ub370\uc774\ud130\uc5d0 \ub300\ud574 \ub3d9\uc2dc\uc5d0 \uc77d\uace0 \uc4f8\ub54c\uc758 \uc0c1\ud669\uc5d0\uc11c, \ub610\ub294 \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud130\ub97c \uc4f0\ub294 \uc0c1\ud669\uc5d0\uc11c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud574\uc8fc\ub294\ub370 \ubaa9\uc801\uc774 \uc788\ub2e4.<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/read-write-lock.png\" alt=\"\" width=\"800\" class=\"aligncenter size-full wp-image-10316\" \/><\/p>\n<p>\uc704\uc758 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc5d0\uc11c \uc5b8\uae09\ub41c \ud074\ub798\uc2a4 \uc911 Reader\uc640 Writer\ub294 \uac01\uac01 \uc5b4\ub5a4 \ub370\uc774\ud130\ub97c \uc77d\uace0 \uc4f0\ub294 \uc2a4\ub808\ub4dc\uc774\uba70, Data\ub294 \uc774 \uc4f0\ub808\ub4dc\uac00 \uc77d\uac70\ub098 \uc4f0\ub294 \ub300\uc0c1\uc774 \ub418\ub294 \ub370\uc774\ud130\ub97c \ub2f4\uace0 \uc788\ub294 \ud074\ub798\uc2a4\uc774\ub2e4. Lock\uc740 \uc77d\uae30\uc640 \uc4f0\uae30\uc5d0 \ub300\ud55c \uc2a4\ub808\ub4dc \uc81c\uc5b4\ub97c \uc704\ud55c \ud074\ub798\uc2a4\uc774\ub2e4. \uc774 \ud074\ub798\uc2a4\ub4e4 \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\tData data = new Data(10);\r\n\t\t\r\n\t\tnew Reader(data).start();\r\n\t\tnew Reader(data).start();\r\n\t\tnew Reader(data).start();\r\n\t\t\r\n\t\tString[] weeks = {\"\uc6d4\", \"\ud654\", \"\uc218\", \"\ubaa9\", \"\uae08\", \"\ud1a0\", \"\uc77c\"};\r\n\t\tnew Writer(data, weeks).start();\r\n\t\t\r\n\t\tString[] numbers = {\"ONE\", \"TWO\", \"THREE\", \"FOUR\", \"FIVE\", \"SIX\", \"SEVEN\", \"EIGHT\", \"NINE\"};\r\n\t\tnew Writer(data, numbers).start();\r\n\t\t\r\n\t\tString[] digits = {\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"};\r\n\t\tnew Writer(data, digits).start();\r\n\t}\r\n}\r\n<\/pre>\n<p>Reader \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Reader extends Thread {\r\n\tprivate final Data data;\r\n\t\r\n\tpublic Reader(Data data) {\r\n\t\tthis.data = data;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\ttry {\r\n\t\t\twhile(true) {\r\n\t\t\t\tString v = data.read();\r\n\t\t\t\tSystem.out.println(Thread.currentThread().getName() + \" -> \" + v);\r\n\t\t\t}\r\n\t\t} catch(InterruptedException e) {\r\n\t\t\t\/\/.\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Writer \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.Random;\r\n\r\npublic class Writer extends Thread {\r\n\tprivate static final Random random = new Random();\r\n\tprivate final Data data;\r\n\tprivate final String[] inputs;\r\n\tprivate int index = 0;\r\n\t\r\n\tpublic Writer(Data data, String[] inputs) {\r\n\t\tthis.data = data;\r\n\t\tthis.inputs = inputs;\r\n\t}\r\n\t\r\n\tpublic void run() {\r\n\t\ttry {\r\n\t\t\twhile(true) {\r\n\t\t\t\tString input = inputs[index];\r\n\t\t\t\tindex = (index + 1) % inputs.length;\r\n\t\t\t\tdata.write(input);\r\n\t\t\t\tThread.sleep(random.nextInt(1000));\r\n\t\t\t}\r\n\t\t} catch(InterruptedException e) {\r\n\t\t\t\/\/.\r\n\t\t}\r\n\t}\t\r\n}\r\n<\/pre>\n<p>Data \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Data {\r\n\tprivate final StringBuilder buffer;\r\n\tprivate final Lock lock = new Lock();\r\n\t\r\n\tpublic Data(int size) {\r\n\t\tthis.buffer = new StringBuilder(\"#empty\");\r\n\t}\r\n\t\r\n\tpublic String read() throws InterruptedException {\r\n\t\tlock.readLock();\r\n\t\ttry {\r\n\t\t\tThread.sleep(100);\t\t\r\n\t\t\treturn buffer.toString();\r\n\t\t} finally {\r\n\t\t\tlock.readUnlock();\r\n\t\t}\r\n\t}\r\n\t\r\n\tpublic void write(String v) throws InterruptedException {\r\n\t\tlock.writeLock();\r\n\t\ttry {\r\n\t\t\tThread.sleep(100);\r\n\t\t\tbuffer.setLength(0);\r\n\t\t\tbuffer.append(v);\r\n\t\t} finally {\r\n\t\t\tlock.writeUnlock();\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>Lock \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Lock {\r\n\tprivate int readingReaders = 0;\r\n\tprivate int waitingReaders = 0;\r\n\tprivate boolean preferReader = false;\r\n\t\r\n\tprivate int waitingWriters = 0;\r\n\tprivate int writingWriters = 0;\r\n\tprivate boolean preferWriter = true;\r\n\t\r\n\tpublic synchronized void readLock() throws InterruptedException {\r\n\t\twaitingReaders++;\r\n\t\ttry {\r\n\t\t\twhile(writingWriters > 0 || (preferWriter && waitingWriters > 0)) {\r\n\t\t\t\twait();\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\twaitingReaders--;\r\n\t\t}\r\n\t\t\r\n\t\treadingReaders++;\r\n\t}\r\n\t\r\n\tpublic synchronized void readUnlock() {\r\n\t\treadingReaders--;\r\n\t\tpreferWriter = true;\r\n\t\tpreferReader = false;\r\n\t\tnotifyAll();\r\n\t}\r\n\t\r\n\tpublic synchronized void writeLock() throws InterruptedException {\r\n\t\twaitingWriters++;\r\n\t\ttry {\r\n\t\t\twhile(readingReaders > 0 || writingWriters > 0 || (preferReader && waitingReaders > 0)) {\r\n\t\t\t\twait();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t} finally {\r\n\t\t\twaitingWriters--;\r\n\t\t}\r\n\t\t\r\n\t\twritingWriters++;\r\n\t}\r\n\t\r\n\tpublic synchronized void writeUnlock() {\r\n\t\twritingWriters--;\r\n\t\tpreferWriter = false;\r\n\t\tpreferReader = true;\r\n\t\tnotifyAll();\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n<pre class='code'>\r\nThread-2 -> #empty\r\nThread-1 -> #empty\r\nThread-0 -> #empty\r\nThread-0 -> \uc6d4\r\nThread-2 -> \uc6d4\r\nThread-1 -> \uc6d4\r\nThread-0 -> 1\r\n\r\n.\r\n.\r\n.\r\n\r\nThread-0 -> 3\r\nThread-0 -> FOUR\r\nThread-2 -> FOUR\r\nThread-1 -> FOUR\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134 \uba85\uce6d Read-Write Lock \ud544\uc694\ud55c \uc0c1\ud669 Database\uc5d0\uc11c \uc5b4\ub5a4 \ud14c\uc774\ube14\uc774 \uc788\ub2e4\uace0 \ud558\uc790. \uc774 \ud14c\uc774\ube14\uc740 \ub2e4\uc218\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \uc77d\uace0 \uc4f0\uc774\ub294 \ub300\uc0c1\uc774\ub2e4. \uc5b4\ub5a4 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc774 \ud14c\uc774\ube14\uc5d0 \ub370\uc774\ud130\ub97c \uc4f0\uace0, \uc5b4\ub5a4 \ub610 \ub2e4\ub978 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc774 \ud14c\uc774\ube14\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc77d\ub294\ub2e4. \uadf8\ub7f0\ub370 \ub9cc\uc57d 2\uac1c\uc758 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ud2b9\uc815 \ub808\ucf54\ub4dc \ub370\uc774\ud130\ub97c \ub3d9\uc2dc\uc5d0 \uac01\uac01 \uc4f0\uace0 \uc77d\uae30\ub97c \uc218\ud589\ud558\uba74 \uc77d\ub294 \uc4f0\ub808\ub4dc \ucabd\uc5d0\uc11c\ub294 \ub9dd\uac00\uc9c4 \ub370\uc774\ud130\ub97c \uc77d\uc744 \uc218 \uc788\ub2e4. \ub610\ud55c \ub9cc\uc57d &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10312\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Read-Write Lock \ud328\ud134&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-10312","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10312"}],"version-history":[{"count":9,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10312\/revisions"}],"predecessor-version":[{"id":10323,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10312\/revisions\/10323"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10312"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}