JUC介绍

JUC是 Java.util.concurrent 包的简称,它是 Java 5 引入的一个用于处理并发编程的工具包,为 Java 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。以下是对该包的详细介绍:

主要组件

  1. 原子类(Atomic Classes)java.util.concurrent.atomic 子包下的类,提供了一些可以进行原子操作的类,如 AtomicIntegerAtomicLongAtomicBoolean 等。这些类可以在不使用锁的情况下实现多线程环境下的原子操作,避免了传统同步机制带来的性能开销。
  2. 锁框架(Lock Framework):提供了 Lock 接口以及相关的实现类,如 ReentrantLockReentrantReadWriteLock 等。相比于传统的 synchronized 关键字,这些锁提供了更灵活的锁机制,例如可中断锁、公平锁、定时锁等功能。
  3. 执行器框架(Executor Framework):主要包含 ExecutorExecutorServiceScheduledExecutorService 等接口以及 ThreadPoolExecutorScheduledThreadPoolExecutor 等实现类。它提供了一种管理线程池的方式,允许开发者将任务的提交和执行分离,简化了线程的创建和管理。
  4. 并发集合类(Concurrent Collections):提供了一系列线程安全的集合类,如 ConcurrentHashMapCopyOnWriteArrayListConcurrentLinkedQueue 等。这些集合类在多线程环境下可以高效地进行并发操作,避免了使用传统集合类时需要额外的同步处理。
  5. 同步工具类(Synchronization Utilities):包含了一些用于线程同步的工具类,如 CountDownLatchCyclicBarrierSemaphoreExchanger 等。这些工具类可以帮助开发者实现复杂的线程同步和协作逻辑。

示例代码

下面是一个简单的使用 ExecutorService 的示例,展示了如何使用 JUC 来创建和管理线程池:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 定义一个实现了Runnable接口的任务类
class MyTask implements Runnable {
    private final int taskId;

    public MyTask(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());
    }
}

public class JUCExample {
    public static void main(String[] args) {
        // 创建一个固定大小为3的线程池
        ExecutorService executor = Executors.newFixedThreadPool(3);

        // 提交5个任务给线程池执行
        for (int i = 1; i <= 5; i++) {
            executor.submit(new MyTask(i));
        }

        // 关闭线程池
        executor.shutdown();
    }
}

在上述代码中,首先创建了一个固定大小为 3 的线程池,然后向线程池提交了 5 个任务。线程池会自动分配线程来执行这些任务,最后调用 shutdown 方法关闭线程池。

JUC 包为 Java 并发编程提供了丰富的工具和功能,能够帮助开发者更高效、更安全地编写多线程程序。

JUC编程 文章被收录于专栏

JUC 是 Java.util.concurrent 包的简称,它是 Java 5 引入的一个用于处理并发编程的工具包,为 Java 开发者提供了一系列用于高效处理并发任务的类和接口,极大地简化了多线程编程的复杂性。

全部评论

相关推荐

昨天发了一下美团和腾讯的面经,想着来都来了,要不就再整理一波暑假实习总结吧!下面是个人的经历:一、迷茫我的大一、大二过得比较颓废,当意识到保研无望时,就想着&amp;quot;要不考研吧&amp;quot;。但所谓的考研计划,其实只是为自己继续摆烂找的借口,等到最后关头才匆忙准备。我根本不清楚读研的意义,也不确定自己能否考上。那段时间持续陷入迷茫和焦虑的漩涡,却又固守舒适圈不愿改变,没有目标,终日浑浑噩噩、虚度光阴。二、慢慢看清方向在经历了一段迷茫期后,我渐渐意识到必须做出改变了——无论是就业还是考研,都需要提前规划准备。经过考虑之后,我最终决定all&nbsp;in&nbsp;就业了。于是那个寒假,我选择多留在学校一两周,开始系统地学习就业所需的技能。命运的转折点出现在大二寒假的一次老乡聚会上。我遇到了一位同专业的学长,他刚刚斩获字节跳动的SP&nbsp;offer。那一刻,我内心充满羡慕与向往,立即主动与他交换了联系方式。从就业前景到具体准备,我迫不及待地向他请教各种问题。至今仍清晰记得,当晚回到宿舍后,我又详细询问了学习路线、推荐网站等实用资源。学长非常热情,为我推荐了许多优质的学习资料和平台。我也就着学习资源慢慢开始学起来了。三、努力学习每个人都是自己的第一责任人,我选择把我的命运紧握在我自己的手中!学习的过程中我逐渐发现,时间紧迫,很多课程太耽误学习就业内容了。我的解决方案是如果我发现某些人教书是混日子的,那我自己找效率更高的办法(嘿嘿,懂的都懂)。这可能是对教育制度的不敬,但却是对职业发展最高效的负责。现在回想起来,我的评价是这是一种极端但是高效的做法吧。学着学着,慢慢地就到了投递暑假实习的日子……四、奋战暑假实习我是从二月份开始投递的,处女面是腾讯的S3线的后端开发,上来先写两道题,没有自我介绍,没有问项目,全程八股盛宴,下午面的,晚上就挂了,严重怀疑是kpi面,连自我介绍都没可还行。。。下面是我的暑假实习面试情况统计:-&nbsp;腾讯&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;一面挂&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;一面挂&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;offer-&nbsp;字节&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;二面挂&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;一面挂-&nbsp;京东一面挂-&nbsp;蚂蚁一面挂-&nbsp;阿里控股一面挂-&nbsp;百度三面挂-&nbsp;美团offer面试的话,从一开始的一面挂,到二面挂,到三面挂,到之后拿下了腾讯和美团的offer,整个过程的话,我发现我真的逐渐变强了,变得不紧张了,不会大脑一片空白想不出解决方案了。这种感觉真的是很有成就感的,会越面越有自信。最后是拒了腾讯的offer,去美团了,面经和timeline可以看我其他动态。五、总结一下上面都是属于个人的流水账,随便记记的,下面来点有意义的总结1.&nbsp;写在简历上的东西一定要很熟悉。这方面包括技术栈知识点和项目简介吧。知识点的话主要是靠背,靠对比记忆。我这里说一下项目,在面试之前我觉得大家可以针对于项目的每个点进行一些思考,可以用上AI给出一些思考方向,我以我简历上的一点为例,简单说说面试会被问到的问题。&nbsp;&nbsp;&nbsp;&nbsp;简历描述:&nbsp;&nbsp;&nbsp;&nbsp;&amp;quot;在高并发购票场景,引入本地缓存&nbsp;Caffeine&nbsp;缓解&nbsp;Redis&nbsp;压力,并在节目详情页面度,结合&nbsp;Lua+Redis&nbsp;实现余票数量的原子更新,有效提高系统可用性和吞吐量。&amp;quot;&nbsp;&nbsp;&nbsp;&nbsp;可能会被问到的问题:&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;本地缓存相关:为什么用Caffeine呢,它有什么特性让你选择它?对比其他本地缓存,它有什么优势?涉及到本地缓存,那缓存一致性你是怎么保障的?本地缓存的命中率多少呢?有测过本地缓存占用多少内存吗?&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;缓存预热:缓存预热是预热了什么东西?都预热吗,还是有进行判断呢?预热会不会占用太多内存呢?&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;分片策略具体是什么样的?能不能再进一步细分?&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;为什么要用Lua+Redis,为什么不直接用分布式锁?脚本执行失败了怎么办,会有兜底吗?&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;优化之后QPS提高了多少呢?有什么进一步的优化策略?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;综合上述问题,其实面试官是大概能够考察出一个候选人的思考深度和技术选型细节相关方面的掌握程度的,所以大家务必要认真思考,然后基于面试及时复盘总结。2.&nbsp;把面试当作是一场推销。面试的目标就是在短时间内能够让面试官明白你的方案,并认可你思考设计的合理性。因此核心问题就是你要想明白你的业务为什么要这么设计,怎么去优化接口响应速度和用户体验的呢。然后要怎么表述给面试官听,使得他能快速理解你的方案呢,如果他不满意,你要怎么去改进呢。3.&nbsp;面试看实力,也看运气。运气真的也很重要,有时候聊的快红温了,却还是过了。反倒自己觉得一点问题没有的还挂了。运气成分也是面试的一部分吧。但是我们都不知道幸运之神什么时候会眷顾我们,所以能努力的只有多面试,多碰碰运气,如果运气好+内容不错的话,会拿到offer的!4.&nbsp;算法一定要熟练。其实面试考的大部分算法都不太难,除非是强组。建议是把hot100和codetop好好过一下,codetop得看一下评论,注意一下变式。算法算是基本要求了,要是算法没a的话,会有点悬的。5.&nbsp;相信自己,会赢的!每个熬夜刷题的夜晚,每个反复调试的case,都在为最终的offer铺路。面试不仅考验技术,更是心态的较量。相信自己的付出,保持稳定的发挥,属于你的机会终会到来。记住,成功往往就在再坚持一下之后!----------------------------------------------------------------------------------------------------------------------------------------“我们这一辈子的终极目标,活着是为了什么?”“为了待会儿去码头整点薯条”#实习##腾讯##美团#
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务