`

多线程下生成UUID

阅读更多

这个实例是验证多线程下使用java.util.UUID生成UUID不会发生重复的(其实UUID发生重复的概率是很小很小的 )

 

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;

public class GenUUId implements Callable { //实现Callable接口

	public String genUuid(){
		String uuid = UUID.randomUUID().toString();
		return uuid;
	}

	@Override
	public Object call() throws Exception {//覆盖call()方法,并将结果返回,该结果就是FutureTask的get()获得值
		Set<String> sets = new HashSet<String>();
		for(int i=0;i<1000;i++){
			sets.add(genUuid());
		}
		return sets;
	}
}

 

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 这个实例是为了演示UUID.randomUUID()的生成的数据会不会重复<br/>
 * 当然这个列子因为太弱了,还不能检测出发生重复的UUID,但是UUID是由可能发生重复的,只是几率很小很小很小<br/>
 * 关于UUID的介绍:see <a href="http://www.ietf.org/rfc/rfc4122.txt"> <br/>
 *设计思路:
 *1. 后台开启5个线程(放在一个线程池里)<br/>
 *2.开启1000个FutureTask(这是一个异步任务,其结合Callable可以实现从子线程里获得线程执行的结果,弥补了Thead和Runnable拿不到结果的不足)<br/>
 *3.每个FutureTask里的Callable产生1000个UUID,然后把这1000个UUID放大Set里
 * 程序运行结束如果Set.size()==1000*1000,则没有产生重复的UUID,但依然不能说明UUID.randomUUID()在多线程下不会重复。
 * */
public class TestUUId {
	public static void main(String[] args){
		List<FutureTask<Set<String>>> futureTasks = new ArrayList<FutureTask<Set<String>>>();//为了后面统计这些FutureTask的结果准备的
		ExecutorService pool = Executors.newFixedThreadPool(5);//创建一个拥有5个线程的线程池,其大小起码要小于等于futureTasks的吧,否则不就浪费了吗
		for(int i=0;i<1000;i++){
			FutureTask<Set<String>> futureTask = new FutureTask<Set<String>>(new GenUUId());//可以跳到GenUUId的类,看其实现
			futureTasks.add(futureTask);//便于下面的for循环统计结果
			pool.submit(futureTask);//将FutureTask提交到线程池中,有子线程执行
		}

		Set<String> sets = new HashSet<String>();
		for(FutureTask<Set<String>> futureTask:futureTasks){
			try{
				sets.addAll(futureTask.get());//统计结果
			}catch (Exception e){
				//TODO
			}
		}
		pool.shutdown();
		for(String str:sets){
			System.out.println(str);
		}
		System.out.println("多线程计算后的总结果是:" + sets.size());
	}



}

 

 

 

分享到:
评论

相关推荐

    嵌入式Linux UUID生成代码接口及测试程序

    在进行测试时,还需要考虑并发情况,因为多线程或多进程环境下,UUID生成的并发安全性也是关键。如果UUID生成代码不线程安全,可能会导致生成重复的UUID。 总的来说,嵌入式Linux环境下UUID的生成和测试涉及到系统...

    创建基于时间的 UUID

    为了验证同一时间点内生成UUID可能产生的冲突问题,可以编写一个多线程程序来模拟并测试冲突情况。下面是一个示例程序结构: ```java int threadCount = 128; int iterationCount = 100_000; ConcurrentHashMap...

    java自动生成id策略

    "java自动生成id策略"指的是设计并实现一种机制,确保在多线程环境下能够高效、唯一地生成ID。这里我们将详细探讨这个主题,以及如何根据描述实现这样的策略。 首先,ID的生成通常要求满足以下条件: 1. 唯一性:...

    fast-uuid用于快速高效地解析和编写UUID的Java库

    3. **多线程支持**:在多线程环境下,`fast-uuid`能更好地处理并发,避免了同步开销,提高了整体的并行性能。 4. **API设计**:`fast-uuid`的API设计简洁明了,易于集成到现有项目中,提供了一种快速创建和比较UUID...

    uuid:Kotlin多平台UUID

    Kotlin多平台UUID K / N还没有UUID。 这带来了一个与各种平台上的UUID相匹配的UUID: iOS / Mac: NSUUID Java: java.util.UUID UUID 冰冻的 线程安全(本机中的线程安全随机性) 遵守RFC4122 经过测试 经过...

    居于H5的多文件、大文件、多线程上传解决方案.docx

    ### 居于H5的多文件、大文件、多线程上传解决方案 #### 一、需求分析 在现代Web开发中,文件上传是一项常见的功能需求。对于需要支持多文件、大文件以及多线程上传的应用而言,传统的上传方式往往无法满足高效、...

    nuxeo-platform-uidgen-core-AT-HF1:当并发线程向平台服务请求UUID时,此捆绑包会修正UUID生成过程的错误

    这个平台通常用于构建复杂的业务应用,因此需要高效且可靠的UUID生成机制,以确保在多用户、多线程环境中创建的每条记录都有独一无二的身份标识。 `uidgen`模块是Nuxeo平台中的一个核心组件,负责生成这些UUID。在...

    VB.NET Guid生成器

    在实际应用中,可以考虑引入异步处理、多线程或者分批生成的方式来优化性能。 此VB.NET Guid生成器项目可能存在的不足包括: 1. 性能优化:未针对大量Guid生成进行性能优化,可能导致程序在处理大任务时卡死。 2. ...

    订单号生成工具类

    7. **工具类的设计**:在Java等编程语言中,订单号生成工具类通常会设计为线程安全,提供静态方法供调用,以确保在多线程环境下的正确性。同时,可以考虑提供配置项,允许用户自定义订单号的格式和生成策略。 8. **...

    LongId:具有8字节长输出的单类Java UUID生成器。 多服务器功能

    LongId-智能简单的Java UUID生成器替换为自动递增的ID,尤其是在多服务器多数据中心环境中。 为响应Snowflake和Snowizard的复杂性而创建,它只是一个类。 好处: 当用作主键时,SQL插入将始终在表的底部ID始终大于...

    Hibernate内置标识符生成器

    但这种方法不适用于多线程或分布式环境,因为可能会导致并发问题,即多个进程可能会同时读取到相同的最大 ID,从而导致主键冲突。 2. Identity 标识符生成器:这是由底层数据库自身来处理主键生成的策略,例如 ...

    Hibernate教程02_ID生成策略

    9. ** Enhanced Native **:是Native策略的增强版,能够更有效地处理多线程环境下的ID生成。 在实际项目中,选择合适的ID生成策略需要考虑以下几个因素: - 数据库类型:不同的数据库支持的ID生成机制不同。 - 性能...

    java生成32位的唯一标识

    在这个例子中,我们使用`AtomicLong`保证时间戳的线程安全递增,并结合随机数生成24位的随机部分,最终组合成32位的唯一标识。 总结起来,生成32位的唯一标识在Java中有多种方法,包括使用UUID并转换、自增序列或...

    hibernate主键生成策略

    - **应用场景**:适用于多实例或多线程环境下,避免主键冲突。 - **特点**: - 可以通过 `&lt;param&gt;` 元素自定义表名和字段名。 - 默认表名为 `hibernate_unique_key`,默认字段名为 `next_hi`。 ##### 7. **...

    根据时间自动生成编号,很实用.zip

    此外,如果多个线程同时生成编号,还需要考虑并发安全问题,可能需要使用synchronized关键字或使用Atomic类来保证线程安全。 总的来说,这个压缩包提供了一种自动化生成编号的解决方案,对于需要时间相关的唯一标识...

    Go-GoUUIDv4库基于LinuxkernelUUID生成器

    它避免了不必要的锁操作,提高了多线程环境下的效率。此外,由于依赖于内核的随机数生成器,生成的UUID具有较高的安全性,不易被预测或重复。 在实际项目中,我们可以利用Go-GoUUIDv4库解决一些特定问题。例如,在...

    银联订单号永远不会重复的生成算法分析与示例

    为了测试和验证这些算法,可以创建一个数据库表,将订单号字段设置为唯一键,并通过多线程并发请求生成订单号,观察是否会有重复。也可以使用Apache的ab工具进行并发压力测试。 总结来说,银联16位订单号的生成需要...

    PHP实现Snowflake生成分布式唯一ID的方法示例

    使用 snowflake 生成 UUID 很多都是在分布式场景下使用,我看了下网上有其中有几篇 PHP 实现的都没有考虑到线程安全。现在 PHP 有了 Swoole 的锁和协程的加持,对于我们开发线程安全和高并发模拟还是很方便的,这里...

    euueuu:命令行中的UUID

    这意味着你可以安全地在多个线程间共享UUID实例,而无需担心同步问题。 5. **UUID的可序列化**: - 由于`UUID`遵循`Hashable`、`Equatable`、`Codable`协议,你可以很容易地将UUID对象序列化为JSON或其他数据格式...

Global site tag (gtag.js) - Google Analytics