并发编程
文章平均质量分 87
在下小吉.
我心爱的花在那里,在那颗遥远的星星上。
展开
-
【并发编程篇】阻塞队列BlockingQueue
Java 中的 java.util.concurrent 包提供了多种类型的阻塞队列实现,如 ArrayBlockingQueue、LinkedBlockingQueue 等,它们在多线程并发编程中发挥重要作用,简化了线程间的协作和数据传递。阻塞队列是一种特殊的队列,它具有线程安全的特性,并且在队列满或者空的情况下具有阻塞线程的能力。当队列为空时,试图从队列中获取元素的线程将被阻塞,直到队列中有可用元素;当队列已满时,试图向队列中添加元素的线程将被阻塞,直到队列中有空闲位置。原创 2024-01-24 11:58:55 · 499 阅读 · 5 评论 -
【并发编程篇】详解Forkjoin
Fork/Join 是一种在多线程领域中常用的算法或技术,它的核心思想是将大任务分割成若干个小任务,然后将这些小任务分配给多个线程并行处理,最终将结果合并起来。这种思想可以应用于多种场景,例如图像处理、批处理、并行排序等。在 Java 中,Fork/Join 这种思想被封装在了 java.util.concurrent 包中的 ForkJoinPool 类和 RecursiveTask 类中。原创 2024-01-13 13:03:52 · 1122 阅读 · 2 评论 -
【并发编程篇】同步队列SynchronousQueue
科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。在 T2 线程中调用 take 方法时,如果队列中没有元素,那么线程将被阻塞直到有另一个线程插入一个元素。使用同步队列可以有效地实现线程间的同步和协作,避免了显式的锁和条件变量的使用,简化了代码的编写和维护。因此,对于上述代码,SynchronousQueue 允许执行插入操作和删除操作的线程相互等待,因此该队列的容量为 0,即不能存储任何元素。总结起来,同步队列是一种阻塞的、容量为0的队列数据结构,用于实现线程间的同步和协作。原创 2023-12-29 13:18:30 · 1207 阅读 · 2 评论 -
【并发编程篇】线程安全问题_—_ConcurrentHashMap
在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!我们使用 ConcurrentHashMap 来创建一个线程安全的 Map 集合。总之,ConcurrentHashMap 提供了一种高效的线程安全哈希表实现,适用于多线程环境下的并发读写操作。它能够提供较好的并发性能和可伸缩性,适用于大规模数据集合的处理。原创 2023-12-29 13:13:46 · 619 阅读 · 0 评论 -
【并发编程篇】解决线程安全问题 — CopyOnWriteArrayList
需要注意的是,虽然 Collections.synchronizedList() 方法可以确保对集合的基本操作是线程安全的,但在进行复合操作时仍然需要额外的同步措施。在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。此外,如果只是在单线程环境下使用集合,或者可以保证对集合的访问是单线程的,那么不一定需要使用线程安全的集合类。在刚才的案例中,我们看到,并发下,ArrayList是不安全的,下面将提供两种解决方法。原创 2023-12-29 13:07:25 · 1144 阅读 · 0 评论 -
【并发编程篇】解决线程安全问题 — CopyOnWriteArraySet
需要注意的是,虽然 Collections.synchronizedSet() 方法可以确保对集合的基本操作是线程安全的,但在进行复合操作时仍然需要额外的同步措施。具体来说,它会对 Set 的各种操作(如添加、删除、迭代等)进行同步化处理,以避免并发修改引发的线程安全问题,比如数据不一致或异常。此外,如果只是在单线程环境下使用集合,或者可以保证对集合的访问是单线程的,那么不一定需要使用线程安全的集合类。因为线程安全的集合类在性能上会有一些额外开销,所以在单线程环境下使用普通的集合类可能更加高效。原创 2023-12-29 13:08:18 · 972 阅读 · 2 评论 -
【并发编程篇】读锁readLock()和写锁writeLock()
方法返回一个读锁,允许同时获取该锁,以进行并发读取操作。如果当前已有一个写锁或其他线程正在请求写锁,则读锁会被阻塞,直到所有写锁请求完成并释放锁为止。读锁和写锁之间是互斥的。方法返回一个写锁,只允许获取该锁,以进行写入操作。如果当前已有一个读锁或其他线程正在请求读锁,则写锁会被阻塞,直到所有读锁请求完成并释放锁为止。写锁是独占的,同一时间只能有一个线程持有写锁。在使用读写锁时,应该根据具体的业务场景和需求选择适当的锁类型。如果共享资源的读取操作远远超过写入操作,那么使用读写锁可以提高系统的并发性能。原创 2023-12-25 09:23:30 · 1458 阅读 · 10 评论 -
【并发编程篇】定义最大线程的方法
上一篇文章我们讲解了自定义线程池的方法,里面提到了最大线程池那么,到底应该怎么去定义最大线程呢。原创 2023-12-24 13:52:41 · 811 阅读 · 18 评论 -
【并发编程篇】源码分析,手动创建线程池
Java 中的 Executors 类提供了创建和管理线程池的工厂方法。主要有以下三种常用的静态工厂方法:固定的线程池大小创建一个固定大小的线程池,其中包含指定数量的线程。如果所有线程都处于活动状态,并且任务队列已满,那么新任务将在任务队列中等待,直到有空闲的线程可用。遇强则强,遇弱则弱创建一个可缓存的线程池,如果线程池的当前规模超过处理需求时,它会回收空闲线程;当需求增加时,则可以添加新的线程,线程池规模不存在限制。单个线程。原创 2023-12-24 13:51:50 · 1009 阅读 · 2 评论 -
【并发编程篇】常用的赋值类(必会)CountDownLatch,CyclicBarrier,Semaphore
需要注意的是,CountDownLatch 的计数器是一次性的,一旦计数器归零,就无法重置。Semaphore(信号量)是 Java 多线程并发包(java.util.concurrent)中的一个同步工具类,它可以用来控制同时访问某个资源的线程数量。需要注意的是,CyclicBarrier 是一次性的,一旦计数器归零,就无法重置。需要注意的是,Semaphore 是一个比较底层的同步工具,使用时需要谨慎考虑并发访问的场景、许可数量的分配等问题,以确保线程安全和性能。原创 2023-12-22 09:25:34 · 479 阅读 · 0 评论 -
【并发编程篇】四大函数式接口
总之,Supplier 接口是一个函数式编程中的概念,代表一个供应商的角色,它可以在需要的时候生成值。让我们携手并进,共同努力,开创美好的未来!在函数式编程中,我们可以将函数看作一种对象,可以将其作为参数传递给其他函数,或者从函数中返回另一个函数。总之,Consumer接口是函数式编程的一部分,它基于函数作为一等公民的思想,用于表示接收单个参数并且没有返回值的操作。总之,Function 接口体现了函数式编程的核心理念,使得函数成为程序开发中的一等公民,能够以一种更加灵活和抽象的方式来处理数据和逻辑。原创 2023-12-20 12:16:45 · 961 阅读 · 3 评论 -
【并发编程篇】详细讲解八种锁现象,彻底理解锁
原因是因为先调用发短信的方法吗。不对,原因是因为synchronized锁的对象是方法的调用者(发短信和打电话这两个方法,都使用了synchronized),而且这两个方法都被phone所调用,由于。原创 2023-12-18 14:49:05 · 955 阅读 · 0 评论 -
【并发编程篇】Synchronized和Lock的零碎知识点
JUC(Java Util Concurrent)是Java平台提供的一个并发编程工具包,它包含了一系列用于多线程编程的类和接口。JUC提供了更高层次的抽象,简化了并发编程的复杂性,并提供了更高效、更安全的并发编程解决方案。JUC提供了以下几个核心概念和组件:并发集合(Concurrent Collections):JUC提供了一些线程安全的集合类,如ConcurrentHashMap、ConcurrentLinkedQueue等,用于在多线程环境下进行安全的数据共享和操作。原创 2023-12-16 14:24:17 · 1069 阅读 · 4 评论 -
【并发编程篇】Callable实现多线程计算
在Java中,可以使用ExecutorService.submit(Callable)方法来提交一个Callable任务,并返回一个Future对象,然后可以通过Future.get()方法来获取Callable计算的结果,如果任务还未完成,则get()方法会阻塞调用线程,直到任务完成。与Runnable接口不同的是,Callable的call()方法可以返回一个结果,而Runnable的run()方法是void类型的,不返回任何结果。在给定的代码中,输出结果将取决于线程的执行顺序。原创 2023-12-12 12:17:41 · 994 阅读 · 1 评论