加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Grails Service 并发处理(笔记)

发布时间:2020-12-14 16:54:34 所属栏目:大数据 来源:网络整理
导读:grails Service是单例的,所以容易出并发问题,当出现并发时怎么处理?在调用的方法名称上面增加@Synchronized。 这个是groovy多线程的处理,非常简单就能解决异步问题。 groovy的异步用法有很多种,以下是groovy帮助文档里面的原文。 ---------------------

grails Service是单例的,所以容易出并发问题,当出现并发时怎么处理?在调用的方法名称上面增加@Synchronized。


这个是groovy多线程的处理,非常简单就能解决异步问题。


groovy的异步用法有很多种,以下是groovy帮助文档里面的原文。

-------------------------------------------------------------


Method annotation to make a method call synchronized for concurrency handling with some useful baked-in conventions.


@Synchronized is a safer variant of the synchronized method modifier. The annotation can only be used on static and instance methods. It operates similarly to the synchronized keyword,but it locks on different objects. When used with an instance method,the synchronized keyword locks on this,but the annotation locks on a (by default automatically generated) field named $lock. If the field does not exist,it is created for you. If you annotate a static method,the annotation locks on a static field named $LOCK instead.


If you want,you can create these locks yourself. The $lock and $LOCK fields will not be generated if you create them yourself. You can also choose to lock on another field,by specifying its name as parameter to the @Synchronized annotation. In this usage variant,the lock field will not be created automatically,and you must explicitly create it yourself.


Rationale: Locking on this or your own class object can have unfortunate side-effects,as other code not under your control can lock on these objects as well,which can cause race conditions and other nasty threading-related bugs.


Example usage:


?

class SynchronizedExample {
   private final myLock = new Object()


   @Synchronized
   static void greet() {
     println "world"
   }


   @Synchronized
   int answerToEverything() {
     return 42
   }


   @Synchronized("myLock")
   void foo() {
     println "bar"
   }
 }


?
which becomes:
?
class SynchronizedExample {
   private static final $LOCK = new Object[0]
   private final $lock = new Object[0]
   private final myLock = new Object()


   static void greet() {
     synchronized($LOCK) {
       println "world"
     }
   }


   int answerToEverything() {
     synchronized($lock) {
       return 42
     }
   }


   void foo() {
     synchronized(myLock) {
       println "bar"
     }
   }
 }
? Credits: this annotation is inspired by the Project Lombok annotation of the same name. The functionality has been kept similar to ease the learning curve when swapping between these two tools. Details: If $lock and/or $LOCK are auto-generated,the fields are initialized with an empty Object[] array,and not just a new Object() as many snippets using this pattern tend to use. This is because a new Object is NOT serializable,but a 0-size array is. Therefore,using @Synchronized will not prevent your object from being serialized.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读