{"id":16201,"date":"2014-12-02T18:14:45","date_gmt":"2014-12-02T12:44:45","guid":{"rendered":"https:\/\/2thenew.today\/blog\/?p=16201"},"modified":"2014-12-02T18:32:16","modified_gmt":"2014-12-02T13:02:16","slug":"groovy-goodness-readwritelocks","status":"publish","type":"post","link":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/","title":{"rendered":"Groovy Goodness &#8211; ReadWriteLocks"},"content":{"rendered":"<p>We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading.\u00a0So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource,\u00a0for that all new threads for reading should be blocked or allowed to finish execution if already in reading process.<\/p>\n<p>In other words while writing no other threads should\u00a0be able\u00a0read or write, this can be achieved using read \/ write lock. In Java one can use an implementation of ReadWriteLock interface in java.util.concurrent.locks package which provides readLock and writeLock objects to achieve this.<\/p>\n<p>Groovy has provided two annotations for above use which are simply wrapper of ReentrantReadWriteLock<br \/>\n&#8211; groovy.transform.WithReadLock<br \/>\n&#8211; groovy.transform.WithWriteLock<\/p>\n<p>import groovy.transform.*;<\/p>\n<p>We will see an example to understand. So below getResource() method is not blocked until any thread is\u00a0accessing any of updateAndGetResource() and refresh() methods and vice versa.<\/p>\n<p>[java]<\/p>\n<p>public class ResourceProvider {<br \/>\nprivate final Map&lt;String, Object&gt; data = new HashMap&lt;String, Object&gt;();<\/p>\n<p>@WithReadLock<br \/>\npublic String getResource(String key) throws Exception {<br \/>\nreturn data.get(key);<br \/>\n}<\/p>\n<p>@WithWriteLock<br \/>\npublic void refresh() throws Exception {<br \/>\n\/\/reload the resources into memory<br \/>\n}<\/p>\n<p>@WithWriteLock<br \/>\npublic String updateAndGetResource(String key){<br \/>\nrefresh()<br \/>\n\/\/updating the shared resource for some special key<br \/>\ngetResource(key)<br \/>\n}<\/p>\n<p>\/\/no blocking required<br \/>\npublic void update(String key){<br \/>\nObject object = data.get(key)<br \/>\n\/\/now update object mutable attributes<br \/>\n}<br \/>\n}<\/p>\n<p>[\/java]<\/p>\n<p>Now you can use synchronization much more efficiently with read\/write locks.<\/p>\n<p>Hope this helps!!!<\/p>\n<p>Parampreet Singh<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading.\u00a0So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource,\u00a0for that all new [&hellip;]<\/p>\n","protected":false},"author":142,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":8,"footnotes":""},"categories":[7],"tags":[1557,9,1559,1558],"class_list":["post-16201","post","type-post","status-publish","format-standard","hentry","category-grails","tag-concurrency","tag-groovy","tag-lock","tag-threads"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Parampreet Singh\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#article\",\"name\":\"Groovy Goodness \\u2013 ReadWriteLocks | TO THE NEW Blog\",\"headline\":\"Groovy Goodness &#8211; ReadWriteLocks\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/parampreet-singhintelligrape-com\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"datePublished\":\"2014-12-02T18:14:45+05:30\",\"dateModified\":\"2014-12-02T18:32:16+05:30\",\"inLanguage\":\"en-US\",\"commentCount\":1,\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#webpage\"},\"articleSection\":\"Grails, concurrency, Groovy, lock, threads\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"name\":\"Grails\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"position\":2,\"name\":\"Grails\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#listItem\",\"name\":\"Groovy Goodness &#8211; ReadWriteLocks\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#listItem\",\"position\":3,\"name\":\"Groovy Goodness &#8211; ReadWriteLocks\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/grails\\\/#listItem\",\"name\":\"Grails\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/parampreet-singhintelligrape-com\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/parampreet-singhintelligrape-com\\\/\",\"name\":\"Parampreet Singh\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1e9df3a8758e24f9c14fff7414a5c90b64e5b083e7ef91d457fef757ace0a04e?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Parampreet Singh\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/\",\"name\":\"Groovy Goodness \\u2013 ReadWriteLocks | TO THE NEW Blog\",\"description\":\"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/groovy-goodness-readwritelocks\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/parampreet-singhintelligrape-com\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/parampreet-singhintelligrape-com\\\/#author\"},\"datePublished\":\"2014-12-02T18:14:45+05:30\",\"dateModified\":\"2014-12-02T18:32:16+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog","description":"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new","canonical_url":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#article","name":"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog","headline":"Groovy Goodness &#8211; ReadWriteLocks","author":{"@id":"https:\/\/2thenew.today\/blog\/author\/parampreet-singhintelligrape-com\/#author"},"publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"},"datePublished":"2014-12-02T18:14:45+05:30","dateModified":"2014-12-02T18:32:16+05:30","inLanguage":"en-US","commentCount":1,"mainEntityOfPage":{"@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#webpage"},"isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#webpage"},"articleSection":"Grails, concurrency, Groovy, lock, threads"},{"@type":"BreadcrumbList","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","position":1,"name":"Home","item":"https:\/\/2thenew.today\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","name":"Grails"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","position":2,"name":"Grails","item":"https:\/\/2thenew.today\/blog\/category\/grails\/","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#listItem","name":"Groovy Goodness &#8211; ReadWriteLocks"},"previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#listItem","position":3,"name":"Groovy Goodness &#8211; ReadWriteLocks","previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/grails\/#listItem","name":"Grails"}}]},{"@type":"Organization","@id":"https:\/\/2thenew.today\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/2thenew.today\/blog\/"},{"@type":"Person","@id":"https:\/\/2thenew.today\/blog\/author\/parampreet-singhintelligrape-com\/#author","url":"https:\/\/2thenew.today\/blog\/author\/parampreet-singhintelligrape-com\/","name":"Parampreet Singh","image":{"@type":"ImageObject","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/1e9df3a8758e24f9c14fff7414a5c90b64e5b083e7ef91d457fef757ace0a04e?s=96&d=mm&r=g","width":96,"height":96,"caption":"Parampreet Singh"}},{"@type":"WebPage","@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#webpage","url":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/","name":"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog","description":"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/#breadcrumblist"},"author":{"@id":"https:\/\/2thenew.today\/blog\/author\/parampreet-singhintelligrape-com\/#author"},"creator":{"@id":"https:\/\/2thenew.today\/blog\/author\/parampreet-singhintelligrape-com\/#author"},"datePublished":"2014-12-02T18:14:45+05:30","dateModified":"2014-12-02T18:32:16+05:30"},{"@type":"WebSite","@id":"https:\/\/2thenew.today\/blog\/#website","url":"https:\/\/2thenew.today\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog","og:description":"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new","og:url":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/","og:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"Groovy Goodness \u2013 ReadWriteLocks | TO THE NEW Blog","twitter:description":"We often use synchronization. Imagine you have a use case in which there is some resource upon which writing is not done as much as compared to reading. So multiple threads should be able to read concurrently same resource without any problems. But if a single thread wants to write to the resource, for that all new","twitter:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"16201","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"created":"2021-04-30 07:45:54","updated":"2024-02-29 10:17:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\/category\/grails\/\" title=\"Grails\">Grails<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tGroovy Goodness \u2013 ReadWriteLocks\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/2thenew.today\/blog"},{"label":"Grails","link":"https:\/\/2thenew.today\/blog\/category\/grails\/"},{"label":"Groovy Goodness &#8211; ReadWriteLocks","link":"https:\/\/2thenew.today\/blog\/groovy-goodness-readwritelocks\/"}],"_links":{"self":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/16201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/users\/142"}],"replies":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/comments?post=16201"}],"version-history":[{"count":0,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/16201\/revisions"}],"wp:attachment":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/media?parent=16201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/categories?post=16201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/tags?post=16201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}