Java 有线程安全的 set 吗?,跳槽薪资翻倍
知乎热问:国家何时整治程序员的高薪现象?太可怕了!
注解+反射优雅的实现 Excel 导入导出(通用版)
Fluent Mybatis 牛逼!
Nginx 常用配置清单
这玩意比 ThreadLocal 叼多了,吓得我赶紧分享出来。
来源:blog.csdn.net/li_canhui/article/details/91393247
在多线程环境下,要使用线程安全的集合,比如,ConcurrentHashMap 是线程安全的 HashMap,CopyOnWriteArrayList 是线程安全的 ArrayList。那么 HashSet 对应的线程安全集合,是什么呢?java 有没有提供默认实现呢?
在 java 的 concurrent 包中,我找到了 CopyOnWriteArraySet,那么它是线程安全的吗?下面是测试代码。
public?static?void?main(String[]?args)?{
Set<String>?set?=?new?CopyOnWriteArraySet<>();
ExecutorService?service?=?Executors.newFixedThreadPool(12);
int?times?=?10000;
AtomicInteger?flag?=?new?AtomicInteger(0);
for(int?i?=?0;?i?<?times;?i?++){
service.execute(()->{
set.add("a"?+?flag.getAndAdd(1));
});
}
service.shutdown();
try?{
service.awaitTermination(Long.MAX_VALUE,?Tim 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 eUnit.DAYS);
}catch?(Exception?e){
e.printStackTrace();
}
System.out.println(set.size());
}
经过多次执行,结果都是 10000。可以说明,CopyOnWriteArraySet 是线程安全的 Set。
那么 CopyOnWriteArraySet 是如何保证写入时的线程安全呢?以下是 CopyOnWriteArraySet 的 add 源码。
public?boolean?add(E?e)?{
return?al.addIfAbsent(e);
}
public?boolean?addIfAbsent(E?e)?{
Object[]?snapshot?=?getArray();
return?indexOf(e,?snapshot,?0,?snapshot.length)?>=?0???false?:
addIfAbsent(e,?snapshot); Java 开源项目【ali1024.coding.net/public/P7/Java/git】
}
private?static?int?indexOf(Object?o,?Object[]?elements,
总结
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。
对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。
你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为 Java 工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实 Java 基础。下图涵盖了应届生乃至转行过来的小白要学习的 Java 内容:
请转发本文支持一下
评论