您的位置:首页 > 科技 > IT业 > 小公司有必要买财务软件吗_机械加工网站哪个好_各种资源都有的搜索引擎_微信客户管理系统

小公司有必要买财务软件吗_机械加工网站哪个好_各种资源都有的搜索引擎_微信客户管理系统

2024/12/22 22:50:16 来源:https://blog.csdn.net/zcl_1991/article/details/143360330  浏览:    关键词:小公司有必要买财务软件吗_机械加工网站哪个好_各种资源都有的搜索引擎_微信客户管理系统
小公司有必要买财务软件吗_机械加工网站哪个好_各种资源都有的搜索引擎_微信客户管理系统

背景

看到某个发的一个他遇到的bug,觉得有意思,特此记录一下。
他的bug现象:一次kafka消费,代码没发现任何问题,就是始终没有消费到数据。后面在日志中发现本应该初始化offset=0的,变成了offset=1590039403;
发现是程序里面调用了一个
public native int GetConfFile(String var1, int var2, StringBuffer var4);
的本地方法

  1. java中某些对象自带有缓存功能:如Integer、Long、Character、Byte等。调用这些类的valueOf()方法,如果是在缓存范围内的数都是获取的缓存对象,而不会创建新对象。
  2. 这些对象可以自动拆箱装箱。
  3. 对于同一个对象,不管谁修改了它,其他地方用到了这个对象的也会发生改变。

Thread t = new Thread(() -> {Integer a = 0;while (true) {System.out.println(a);try {TimeUnit.SECONDS.sleep(1);} catch (Throwable ignore) {}}});
t.start();

当我们执行上述代码时,理论上a的值应该一直的0的,因为没有任何地方修改这个a。

Thread t = new Thread(() -> {Integer a = 0;while (true) {System.out.println(a);try {TimeUnit.SECONDS.sleep(1);} catch (Throwable ignore) {}}});t.start();TimeUnit.SECONDS.sleep(5);// 定义一个b,下面是模拟修改b的值Integer b = 0;// 获取Unsafe的实例Field f = Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(true);Unsafe unsafe = (Unsafe) f.get(null);// 获取对象的字段Field field = Integer.class.getDeclaredField("value");// 计算字段在对象中的偏移量long offset = unsafe.objectFieldOffset(field);// 修改字段的值unsafe.putInt(b, offset, 1);System.out.println("+++++" + unsafe.getInt(b, offset));

然后试试执行上面代码,可以看到线程里面的a还是没有谁去修改它,下面定义了一个b,然后后面模拟修改b对应的值,后面发现a的输出值夜变了。

  1. 缓存对象是同一个对象,内存地址是同一个;
  2. 某些方法里面会调用native方法,底层是c++,而c++通常传递的是指针,也就是对象的内存地址,c++修改这个内存对应的值;
  3. 如果刚好被修改的这个参数是一个被缓存共用的对象,那所有使用这个缓存对象的都会发生改变。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com