Java-给每个对象生成一个唯一Id(单节点应用)
public class Main {
public static void main(String[] args) {
// 创建三个A类的实例对象
A a1 = new A();
A a2 = new A();
A a3 = new A();
// 打印每个对象的唯一ID
System.out.println(a1.getNowId()); // 输出第一个对象的ID
System.out.println(a2.getNowId()); // 输出第二个对象的ID
System.out.println(a3.getNowId()); // 输出第三个对象的ID
}
}
/**
* 给每个对象分配一个唯一id的实现类
* 这个类使用静态计数器来确保每个新创建的对象都能获得唯一的ID
*/
class A {
// 静态计数器,所有A类实例共享,初始值为0
// 使用volatile确保多线程环境下的可见性
private static volatile int nextId = 0;
// 实例变量,存储当前对象的唯一ID
private final int nowId;
// 构造方法,初始化对象时自动分配ID
public A() {
this.nowId = advanceId();
}
/**
* 静态同步方法,用于安全地获取下一个可用ID
* @return 返回分配的新ID
*/
private static synchronized int advanceId() {
return nextId++; // 先返回当前值,再自增
}
/**
* 获取当前对象的唯一ID
* @return 对象的唯一ID
*/
public int getNowId() {
return nowId;
}
}
console:
0
1
2
扩展说明:
- 改进后的代码添加了
synchronized关键字确保线程安全,避免在多线程环境下出现ID重复的问题 - 将
nowId标记为final,确保对象ID不会被意外修改 - 添加了构造方法显式初始化ID
- 使用
volatile修饰静态计数器,确保多线程环境下的可见性 - 为方法和类添加了更详细的注释说明
应用场景:
这种唯一ID生成模式适用于需要跟踪对象实例的场景,例如:
- 对象池管理
- 缓存系统
- 需要唯一标识的业务对象
- 调试时追踪对象实例
&spm=1001.2101.3001.5002&articleId=152166632&d=1&t=3&u=fae85b54c33a4805adf54e295fa907ef)
2万+

被折叠的 条评论
为什么被折叠?



