1、 你说你的项目用到的公司的分布式锁组件,这个组件什么实现原理,你能讲一讲吗?
分布式锁要保证
- 互斥性。 对同一个key进行操作。使用redis的setnx指令,该key不存在时才能设置成功,如果存在则不操作。
- 避免死锁的发生。 设置key时同时为该key设置过期时间。
- 避免误解锁。 将该key的值设置成对应的ip值。当然也有可能被该机器实例的不同redis实例误解锁。因此可以使用UUID作为值。
使用redis分布式锁存在问题
设置key和过期时间不是原子操作: setNx保证
防止误解锁: 设置value为UUID
假设这么一个场景,setnx了获得了锁,锁的时间没有到期,但是持有锁的redis实例挂了,这个时候存在一些问题,你觉得这个问题该怎么解决?
Java基础考核
String byteStyle =“Inspire Creativity” + “,” + “Enrich Life”
这段代码生成了几个string对象:
首先在堆中找"Inspire Creativity"字符串,不存在,则使用new String创建一个对象。
后面","、“Enrich Life"也分别创建对象。
由于String是不可变的,使用“+”实际上是先把String转为StringBuilder然后使用StringBuilder的append方法添加,所以"Inspire Creativity” + “,”
实际上是:
StringBuilder sb = new StringBuilder(“Inspire Creativity”)
sb.append(“,”);
然后在返回新的String对象,return sb.toString()
所以一共生成6个对象。
String str = new String(“abc”),“abc”在内存中是怎么分配的?
堆和字符串常量池中,当你new String(“abc”)时,其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区