写点什么

Java 有线程安全的 set 吗?,跳槽薪资翻倍

  • 2022 年 4 月 22 日
  • 本文字数:1029 字

    阅读完需:约 3 分钟

知乎热问:国家何时整治程序员的高薪现象?太可怕了!


注解+反射优雅的实现 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 内容:


请转发本文支持一下




用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Java有线程安全的set吗?,跳槽薪资翻倍_Java_爱好编程进阶_InfoQ写作社区