0 0

贴一段代码,一个id的生成器,求解5

/*
 * This file is part of aion-unique <aion-unique.org>.
 *
 *  aion-unique is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  aion-unique is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with aion-unique.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.aionemu.chatserver.utils;

import java.util.BitSet;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Simplified version of idfactory
 * 
 * @author ATracer
 */
public class IdFactory
{
	private final BitSet		idList		= new BitSet();
	private final ReentrantLock	lock		= new ReentrantLock();
	private AtomicInteger		nextMinId	= new AtomicInteger(1);

	protected static IdFactory	instance	= new IdFactory();

	public int nextId()
	{
		try
		{
			lock.lock();
			int id = idList.nextClearBit(nextMinId.intValue());
			idList.set(id);
			nextMinId.incrementAndGet();
			return id;
		}
		finally
		{
			lock.unlock();
		}
	}

	public static IdFactory getInstance()
	{
		return instance;
	}

	public static void main(String[] xiaoe)
	{
		BitSet idList = new BitSet();
		for (int i = 0; i < 100; i++)
			System.out.println(idList.nextClearBit(i));
	}

}


我觉得有两个问题:
1. 这里既然已经用锁同步了,就可以不用atomic类
2. BitSet有点画蛇添足的味道

不知道作者为何要这么设计,求解。谁能指点下这么写的好处。
2012年7月02日 17:28

3个答案 按时间排序 按投票排序

0 0

采纳的答案

public class IdFactory {
	private final ReentrantLock lock = new ReentrantLock();
	private volatile int id = 0;
	private static final IdFactory instance = new IdFactory();

	private IdFactory() {
	}

	public int nextId() {
		try {
			lock.lock();
			id++;
			return id;
		} finally {
			lock.unlock();
		}
	}

	public static IdFactory getInstance() {
		return instance;
	}

	static class TestThread extends Thread {
		ArrayList<Integer> idList = new ArrayList<Integer>();

		public void run() {
			IdFactory fac = IdFactory.getInstance();
			for (int i = 0; i < 10000; i++) {
				idList.add(fac.nextId());
			}
		}
	}

	public static void main(String[] arg) throws Exception {
		TestThread t1 = new TestThread();
		TestThread t2 = new TestThread();
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(t1.idList.size());
		System.out.println(t2.idList.size());
		t1.idList.removeAll(t2.idList);
		System.out.println(t1.idList.size());
		System.out.println(t2.idList.size());
	}
}

我这样写,效果应该一样吧!

2012年7月03日 08:44
0 0

看起来貌似很蛋疼,还是依据自己的需求写一个吧。
可能他这样写是为了迎合特定的需要

2012年7月02日 18:45
0 0

1.AtomicXXX类保证的只是是compare-and-swap的原子性

2.这里使用BitSet是为了避免使用Integer或者BigInteger来表示id,这样的话id就可以无限增大下去

2012年7月02日 18:18

相关推荐

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7...

    编译原理实验二——算符优先分析法设计与实现

    - **表达式求值**:实现表达式的计算逻辑,例如,对于算术表达式,可能需要一个求值函数来处理运算符的优先级和结合性。 - **错误处理**:在分析过程中检测到错误时,输出错误信息并停止分析。 【实验总结与展望】 ...

    DMC.rar_DMC_create函数_控制_预测函数控制_预测控制_预测控制DMC

    2. **系统预测**:在每个采样时间点,DMC控制器利用当前系统状态和未来一段时间内的设定值预测系统的未来行为。这涉及到求解状态方程的递推过程。 3. **性能指标计算**:基于预测的系统输出,DMC算法定义一个性能...

    打印 - SP20_PANGOLIN1

    【打印 - SP20_PANGOLIN1】:这篇文档主要介绍了PANGOLIN,一个增量型混合模糊测试工具,其设计目标是提高覆盖率引导的模糊测试技术的效率。混合模糊测试结合了模糊测试(fuzzing)和符号执行(concolic execution)...

    GSL库在vs2005中的移植.doc

    以下是一段简单的示例代码,用于演示如何使用GSL库中的贝塞尔函数: ```c #include #include int main(void) { double x = 5.0; double y = gsl_sf_bessel_J0(x); printf("J0(%g) = %.18e\n", x, y); return...

    机器学习常见面试.docx

    - GBDT:逐步迭代,每次训练一个弱分类器来纠正前一个分类器的错误,通过shrinkage避免过拟合。 7. **神经网络(BP)**: - 反向传播:调整权重以减小损失函数,实现梯度下降。 - 最小二乘法:一种求解线性回归...

    数据挖掘-评选十大经典算法

    数据挖掘是机器学习领域中一个重要的分支,它涉及从大量数据中挖掘出有价值的信息、模式和关系的过程。在数据挖掘领域,有许多经典的算法被广泛应用于各种类型的问题解决中,其中包括分类、聚类、关联规则发现以及...

    The Top Ten Algorithms in Data Mining 2009 - X. Wu & V. Kumar -

    AdaBoost是一种集成学习方法,通过组合多个弱分类器来构建一个强分类器。它的核心思想是对每次迭代中分类错误的样本给予更高的权重。 **关键特性:** - 适应性强,可以与其他算法结合使用。 - 不容易过拟合。 **...

    leetcode:回购跟踪我的leetcode解决方案

    文件名可能反映了问题的ID或者问题的描述,使得用户可以轻松地找到和理解每个代码段的功能。 在Python中解决LeetCode问题时,你可能会遇到以下常见的技术点: 1. **数据结构实现**:Python内置了一些基本数据结构...

    2021-2022计算机二级等级考试试题及答案No.12079.docx

    - **答案解析**:题目要求在代码中引用一个控件时应使用控件的哪个属性。由于`Name`属性是用来唯一标识控件的,因此正确答案为B。 ### 12. Java 代码执行结果分析 - **知识点说明**:Java 是一种广泛使用的面向...

    PCA人脸识别信息管理系统

    5. 训练模型:在目标文件夹下,系统会自动为每个目标人物生成包含10张训练图像的子文件夹。这些图像经过PCA处理后,用于构建识别模型。模型的训练过程通常涉及计算协方差矩阵、求解特征值和特征向量等步骤。 6. ...

    mpi-pi:使用 mpi 逼近 pi 的分布式蒙特卡罗算法

    5. **通信与统计**:每个进程统计其生成的圆内点的数量,并使用 `MPI_Reduce()` 函数将这些统计信息(通常是和)归约到一个主进程中。 6. **计算 π**:主进程将收到的所有圆内点数相加,除以总的点数,然后乘以 4 ...

    人工智能试卷

    另一个是评估过程,即利用启发式信息评估解的质量。 **4. 机器学习的学习系统结构模型由环境、_______________、_____________、执行四部分构成。** **解析:**机器学习系统结构模型通常包括环境、学习、知识库和...

Global site tag (gtag.js) - Google Analytics