局部和全局引用的操作


    引用在Java编程中起到重要作用。这个虚拟机通过跟踪他们的引用来管理类实例的生命周期和垃圾管理机制收集不被引用的。因为本地代码不是一个管理的环境,这JNI提供了一套函数来运行本地的代码,明确的管理类的引用和生命周期。这JNI支持三张类型的引用:局部引用,全局引用和弱引用。

    局部引用

   局部引用不能被缓存和重复使用在一系列的调用因为他们的生命周期被限制在本地的方法。本地引用被释放一旦本地的方法返回。例如,这个FindClass函数返回一个弱引用;当本地方法返回时,自动释放掉。也可以明确的释放通过DelteLocalRef函数来释放。

  jclass clazz;
  clazz = (*env)->FindClass(env, "java/lang/String");

  新建全局引用

    全局引用通过NewGLobalRef函数用本地引用来初始化。

   jclass localClazz;
   jclass globalClazz;
  ...
  localClazz = (*env)->FindClass(env, "java/lang/String");
  globalClazz = (*env)->NewGlobalRef(env, localClazz);
  ...
  (*env)->DeleteLocalRef(env, localClazz);

删除全局引用

  当全局引用不在需要时,调用DeleteGlobalRef删除全局引用。

 (*env)->DeleteGlobalRef(env, globalClazz);

 弱全局引用

像全局引用一样,接下来的本地方法的调用仍旧是有效的。不像全局引用那些,弱全局引用强调的对象(underlying object)可以被回收。

   新建弱全局引用

  jclass weakGlobalClazz;
  weakGlobalClazz = (*env)->NewWeakGlobalRef(env, localClazz);

  验证一个弱全局引用

 决定是否这个弱引用正在指向一个存活类的实例,你能够使用IsSameObject函数。

  if (JNI_FALSE == (*env)->IsSameObject(env, weakGlobalClazz, NULL)) {
  /* Object is still live and can be used. */
  } else {
  /* Object is garbage collected and cannot be used. */
  }

删除弱引用

(*env)->DeleteWeakGlobalRef(env, weakGlobalClazz);

### 局部与全局的概念及其区别 在编程系统设计中,局部(Local)全局(Global)这两个术语用于描述变量、函数或其他实体的作用域以及其影响范围。 #### 局部作用域 局部指的是那些仅在其定义范围内有效的元素。这些元素通常是在某个特定的代码块内部声明的,比如在一个方法或函数体内创建的对象或者变量,在该区域之外无法访问它们。这种机制有助于减少命名冲突并提高程序的安全性可维护性[^1]。 对于服务平面中的多个服务而言,每一个单独的服务可以被视作具有自己的局部状态服务逻辑,这使得各个组件能够独立运作而不干扰其他部分的功能实现。 ```python def example_function(): local_variable = "I'm only available inside this function" print(local_variable) example_function() # Trying to access 'local_variable' here would result in an error. ``` #### 全局作用域 相比之下,全局是指在整个应用程序生命周期内都有效并且可以在任何地方被引用到的数据项或者是行为模式。全局变量一旦设置好就可以跨模块共享数据;而全局配置则可能决定了整个系统的运行方式或是默认的行为准则[^2]。 当涉及到像Vivado Design Suite这样的开发环境中时,某些设置可能是全局性的——例如项目的综合选项会影响所有后续操作直至最终生成比特流文件之前的过程。 ```c++ // C++ Example of Global Variable int globalVariable = 0; void someFunction() { // Accessible from anywhere within the program ++globalVariable; } ``` #### 应用场景对比 - **安全性考量**:由于局部资源只限于一定区域内可见,因此更易于控制权限管理,防止意外修改重要信息。 - **性能因素**:频繁地读写全局存储可能会带来额外开销,尤其是在多线程环境下可能导致竞争条件等问题发生。相反,利用局部缓存能显著提升效率。 - **灵活性需求**:如果希望保持较高的适应变化的能力,则应倾向于采用更多细粒度划分的方法论,即增加更多的局部决策单元而不是依赖少数几个固定的全局策略[^3]。 - **复杂度处理**:随着软件规模的增长,过多的全局连接会使架构变得难以理解调试。此时引入面向服务的思想,让不同业务领域内的功能各自成体系,再通过精心规划好的接口相互协作就显得尤为重要了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值