如果通过类java.lang.reflect.Field的’set’方法设置了值,那么它在并发性方面是否具有可见性?
作者:互联网
在此方法的Java文档中,未提及并发性,因此’set’方法似乎不能确保可见性.我对此不确定.
实际上,由于这个问题,我遇到了困难.我将基于Zookeeper构建一个分布式配置平台.像其他配置平台一样,如果字段由特定注释注释,则该平台会将其映射到Zookeeper中的节点.更改映射节点的值后,动物园管理员将通知使用此平台的项目,并使用反射(通过“设置”方法)更改带注释的字段.
使用我的配置平台的项目可能是一个Web应用程序,该服务在服务层中只有一个对象,因此始终并发访问该字段.如果’set’方法不能确保可见性,我是否必须强制项目为注释字段添加关键字volatile?我看起来很奇怪又乏味.关于这个问题有更好的方法吗?其他配置平台如何解决此问题?
解决方法:
In java doc of this method, concurrency is not mentioned, so it seems that the ‘set’ method do not ensure visibility. I’m not sure about this.
通过反射调用set方法与并发无关,它与可访问性有关.并发涉及如何特别标记字段.它是一个不稳定的领域,还是Atomic …类之一?
如果一个线程以任何方式调用set方法(通过反射或其他代码调用setFoo()方法),则其他线程可能看不到此更新值,直到进行写操作的线程越过写内存屏障以确保发布到主内存和其他线程则越过读取障碍,以确保更新其每个处理器的内存缓存.
If the ‘set’ method do not ensure visibility, do I must force the project add Keyword volatile for the annotated field ?
是的你是.对于要在线程之间共享的任何字段,您将需要弄清楚该字段如何同步.
I looks strange and tedious. Is there some better way about this problem ? How do the other configuration platforms solving this ?
答案取决于您的要求.如果您需要将此字段更新为每次访问的最新值,则将其标记为易失性或切换到Atomic *类是您的答案(不确定为什么添加关键字是“乏味的”).
您可以使用的另一种机制是让每个请求在请求开始时以同步方式更新某种配置对象,然后在处理请求时使用其缓存的配置对象.
标签:reflection,concurrency,apache-zookeeper,java 来源: https://codeday.me/bug/20191026/1938467.html