首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏精讲JAVA

    Java 8Java 9 并发工具的改变

    8Java 9 concurrent 包有了一些改变, 本文对这些改变做了汇总。 Java 8 Concurrent package的改变 java.util.concurrent中新的类和接口 增加了两个新接口和4个新类: 接口 CompletableFuture.AsynchronousCompletionTask 的新方法 集合框架 在Java 8做了修订,基于 stream 和 lambda表达式 添加了很多聚合方法。 java.util.concurrent.atomic的新类 为了并发计算count、sum, 新引入了 DoubleAccumulator , DoubleAdder , LongAccumulator / Java 8Java 9 concurrent 包有了一些改变, 本文对这些改变做了汇总。

    71320发布于 2018-07-30
  • 来自专栏精讲JAVA

    Java 8Java 9 并发工具的改变

    8Java 9 concurrent 包有了一些改变, 本文对这些改变做了汇总。 Java 8 Concurrent package的改变 java.util.concurrent中新的类和接口 增加了两个新接口和4个新类: 接口 CompletableFuture.AsynchronousCompletionTask 的新方法 集合框架 在Java 8做了修订,基于 stream 和 lambda表达式 添加了很多聚合方法。 java.util.concurrent.atomic的新类 为了并发计算count、sum, 新引入了 DoubleAccumulator , DoubleAdder , LongAccumulator / Java 8Java 9 concurrent 包有了一些改变, 本文对这些改变做了汇总。

    74120发布于 2018-07-30
  • 来自专栏狗哥的 Java 世界

    Java 并发8)CyclicBarrier 源码分析

    现实生活我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。 在 JUC 包为我们提供了一个同步工具类能够很好的模拟这类场景,它就是 CyclicBarrier 类。 可以看到在 dowait 方法每次都将 count 减 1,减完后立马进行判断看看是否等于 0,如果等于 0 的话就会先去执行之前指定好的任务,执行完之后再调用 nextGeneration 方法将栅栏转到下一代 如果在等待过程当前线程被中断就会执行 breakBarrier 方法,该方法叫做打破栅栏,意味着游戏在中途被掐断,设置 generation 的 broken 状态为 true 并唤醒所有线程。

    51610发布于 2020-04-14
  • 来自专栏静晴轩

    Java 并发

    如何创建一个线程 按 Java 语言规范的说法,创建线程只有一种方式,就是创建一个 Thread 对象。 而从 HotSpot 虚拟机的角度看,创建一个虚拟机线程 有两种方式,一种是创建 Thread 对象,另一种是创建 一个本地线程,加入到虚拟机线程。 如果从 Java 语法的角度。有两种方法。 Executors JDK 的 java.util.concurrent.Executors 类提供了几个静态的方法,用于创建不同类型的线程池。 原理 JDK 的线程池通过 HashSet 存储工作者线程,通过 BlockingQueue 来存储待处理任务。 另外,如果待处理队列没有任务要处理,并且工作者线程数目超过了核心工作者数目,那么,需要减少工作者线程数目。

    89760发布于 2018-03-27
  • 来自专栏Java并发

    Java并发——并发的锁(五)

    一、Java锁分类 1.1 偏向锁/轻量级锁/重量级锁 这三种锁指的是synchronized锁的状态,Java1.6之前是基于重量级锁,Java1.6之后对synchronized进行了优化,为了减少获取和释放锁带来的性能消耗 java的Synchronized内置锁和ReentrantLock显式锁都是独占锁。 2、共享锁 共享锁就是在同一时刻允许多个线程持有的锁。 在并发环境,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列,以后会按照FIFO(先进先出)的规则从队列取到自己。 3、例子 在Java并发,ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。 二、synchronized锁 详细见Java并发——synchronized锁 三、Lock锁 Java并发——Lock锁 四、synchronized 和 Lock 对比 相同点: 1、synchronized

    2.5K00编辑于 2024-04-25
  • 来自专栏专注 Java 基础分享

    并发而生的 ConcurrentHashMap(Java 8

    尤其是在 jdk 1.8 之前,rehash 的过程采用头插法转移结点,高并发下,多个线程同时操作一条链表将直接导致闭链,死循环并占满 CPU。 当然,它毕竟不是并发容器,除非大改,否则依然是不能应对高并发场景的,或者说即使没有因多线程访问而造成什么问题,但是效率必然是受到影响的。 本篇文章将要介绍的 ConcurrentHashMap 是 HashMap 的并发版本,它是线程安全的,并且在高并发的情境下,性能优于 HashMap 很多。 三、put 方法实现并发添加 对于 HashMap 来说,多线程并发添加元素会导致数据丢失等并发问题,那么 ConcurrentHashMap 又是如何做到并发添加的呢? = 0) { //链表深度超过 8 转换为红黑树 if (binCount >= TREEIFY_THRESHOLD) treeifyBin

    2.7K120发布于 2018-01-04
  • 来自专栏JAVA并发编程

    JAVA并发编程系列(8)CountDownLatch核心原理

    和之前文章一样,我们通过现实案例出发,最后抛出主角方式带大家由浅入深了解并发编程核心知识点。 一、面试真题:模拟拼团我们利用CountDownLatch倒计时的特性,多线程并发条件下,多线程可以调用CountDownLatch.countDown()方法进行减1,然后等候信号的线程调用CountDownLatch.await package lading.java.mutithread;import java.util.HashSet;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * 模拟拼团,满10人成团 */public class Demo009CountDownLatch { public static

    34820编辑于 2024-09-19
  • 来自专栏bit哲学院

    Java 8并发教程:原子变量和ConcurrentMap

    / 欢迎阅读我的Java 8多线程编程教程系列的第三部分。 本教程介绍了并发API的两个重要部分:原子变量和并发映射。 在最新的Java 8版本引入了lambda表达式和功能编程,两者都得到了很大的改进。所有这些新功能都用一大堆易于理解的代码示例进行描述。 ConcurrentMap ConcurrentMap扩展了映射接口,并定义了最有用的并发收集类型之一。 Java 8通过向此界面添加新方法来引入功能编程。 就像并行流一样,这些方法使用Java 8的ForkJoinPool.commonPool()可以使用一个特殊的ForkJoinPool。该池使用一个取决于可用内核数量的预设并行度。 8并发的教程系列的第三部分。

    96220发布于 2021-04-20
  • 来自专栏架构探险之道

    Java 并发并发原理剖析之ConcurrentLinkedQueue

    [Java] Java 并发并发原理剖析之ConcurrentLinkedQueue ConcurrentLinkedQueue是线程安全的无界非阻塞队列,其底层数据结构使用单向链表实现,对于入队和出队操作使用 队列包含的元素是从head访问的非空节点。通过CAS将节点的引用指向null,自动的会将它从队列移除。 内存一致性效果:当存在其他并发 collection 时,将对象放入 ConcurrentLinkedQueue 之前的线程的操作 happen-before 随后通过另一线程从 ConcurrentLinkedQueue head; else // Check for tail updates after two hops. //[8] REFERENCES Java并发编程之美 JDK-API-DOCS

    55620发布于 2019-07-25
  • 来自专栏Android开发经验分享

    Java并发工具类

    转载请以链接形式标明出处: 本文出自:103style的博客 Java并发编程的艺术笔记 并发编程的挑战 Java并发机制的底层实现原理 Java内存模型 Java并发编程基础 Java的锁的使用和实现介绍 Java并发容器和框架 Java的12个原子操作类介绍 Java并发工具类 Java的线程池 Executor框架 ---- 简介 在JDK的并发包里提供了几个非常有用的并发工具类。 假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据 data -- 2 save data -- 6 save data -- 5 save data -- 7 save data -- 9 save data -- 10 save data -- 8 虽然有20个线程在执行,但是只允许5个并发执行。

    36410编辑于 2022-12-19
  • 来自专栏Java开发

    如何理解Java并发

    Java 并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等) undefined例如:4 核 CPU 同时运行 4 个线程是并行,1 核 CPU 快速切换 4 个线程是并发。三、Java 实现并发的方式Java 提供了多种并发编程工具,核心是通过线程实现:1. // Callable 示例import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import Java 提供 Executors 工具类快速创建线程池:import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors 理解并发Java 进阶的关键,尤其在高并发场景(如分布式系统、高流量服务器),合理设计并发模型能显著提升系统性能。

    26510编辑于 2025-10-15
  • 来自专栏程序那些事

    java并发ExecutorService的使用

    java并发ExecutorService的使用 ExecutorService是java的一个异步执行的框架,通过使用ExecutorService可以方便的创建多线程执行环境。 第一种方式是使用Executors的工厂类方法,例如: ExecutorService executor = Executors.newFixedThreadPool(10); 除了newFixedThreadPool Future<String>> futures = executorService.invokeAll(callableTasks); 关闭ExecutorService 如果ExecutorService的任务运行完毕之后 ExecutorService和 Fork/Join java 7 引入了Fork/Join框架。那么两者的区别是什么呢? 本文的代码请参考https://github.com/ddean2009/learn-java-concurrency/tree/master/ExecutorService

    1.7K10发布于 2020-07-08
  • 来自专栏程序那些事

    java并发CountDownLatch的使用

    java并发CountDownLatch的使用 在java并发,控制共享变量的访问非常重要,有时候我们也想控制并发线程的执行顺序,比如:等待所有线程都执行完毕之后再执行另外的线程,或者等所有线程都准备好了才开始所有线程的执行等 最后在主线程调用await()方法来等待子线程结束执行。 我们是主线程等待子线程,那么在这个例子,我们将会看看怎么子线程一起等待到准备好的状态,再一起执行。 思路也很简单,在子线程开始之后,将等待的子线程计数器减一,在主线程await该计数器,等计数器归零之后,主线程再通知子线程运行。 sync.tryAcquireSharedNanos(1, unit.toNanos(timeout)); } 本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency

    53410发布于 2020-07-08
  • 来自专栏路人甲Java

    java并发系列 - 第8天:线程组

    java并发系列第8篇文章 线程组 我们可以把线程归属到某个线程组,线程组可以包含多个线程以及线程组,线程和线程组组成了父子关系,是个树形结构,如下图: ? ,包含下面的所有子孙节点的线程,由于线程组的线程是动态变化的,这个值只能是一个估算值。 的t3、t4 线程组的list()方法,将线程组的所有子孙节点信息输出到控制台,用于调试使用 根线程组 获取根线程组 package com.itsoku.chat02; /** * description java并发系列目录: 1.java并发系列-第1天:必须知道的几个概念 2.java并发系列-第2天:并发级别 3.java并发系列-第3天:有关并行的两个重要定律 4.java并发系列 - 第4天:JMM相关的一些概念 5.java并发系列第5天-深入理解进程和线程 6.java并发系列 - 第6天:线程的基本操作 7.java并发系列 - 第7天:volatile与Java内存模型

    65030发布于 2019-12-10
  • 来自专栏程序猿的大杂烩

    Java并发编程(8)- 应用限流及其常见算法

    [TOC] ---- 应用限流 在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流: 缓存:缓存的目的是提升系统访问速度和增大系统处理容量 降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉 ,待高峰或者问题解决后再打开 限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理 本文仅针对限流做一些简单的说明 在上图中,整个红色的矩形框表示一个时间窗口,在我们的例子,一个时间窗口就是一分钟。然后我们将时间窗口进行划分,比如图中,我们就将滑动窗口划成了6格,所以每格代表的是10秒钟。 在上图中,0:59到达的100个请求会落在灰色的格子,而1:00到达的请求会落在橘×××的格子。 我们将算法的水换成实际应用的请求,我们可以看到漏桶算法天生就限制了请求的速度。当使用了漏桶算法,我们可以保证接口会以一个常速速率来处理请求。所以漏桶算法天生不会出现临界问题。

    75630发布于 2020-09-23
  • 来自专栏后端精进之路

    Java并发编程系列-(9) JDK 8910并发

    9.1 CompletableFuture CompletableFuture是JDK 8引入的工具类,实现了Future接口,对以往的FutureTask的功能进行了增强。 流式调用 CompletableFuture提供了类似于JDK 8list的流式操作,下面例子,首先利用supplyAsync()执行一个异步任务,接着使用流式操作对任务结果进行处理。 9.2 改进的读写锁:StampedLock StampedLock是JDK 8引入的新的锁机制,可以认为是读写锁的一个改进版本,读写锁虽然分离了读和写,使得读与读之间可以完全并发,但是读和写之间仍然是冲突的 从java doc可以看出,其适用于统计计数的场景,例如计算qps这种场景。在高并发场景下,qps这个值会被多个线程频繁更新的,所以LongAdder很适合。 ---- 参考: https://www.jianshu.com/p/22d38d5c8c2a 《实战Java并发程序设计》

    42410编辑于 2023-10-19
  • 来自专栏微信公众号【Java技术江湖】

    Java并发指南8:AQS的公平锁与非公平锁,Condtion

    本文转自:http://hongjiev.github.io/2017/06/16/AbstractQueuedSynchronizer 本文是微信公众号【Java技术江湖】的《Java并发指南》其中一篇 该系列博文会告诉你如何全面深入地学习Java并发技术,从Java多线程基础,再到并发编程的基础知识,从Java并发包的入门和实战,再到JUC的源码剖析,一步步地学习Java并发编程,并上手进行实战,以便让你更完整地了解整个 Java并发编程知识体系,形成自己的知识框架。 需要深入了解这几个方法的读者,可以参考我的另一篇文章《深入分析 java 8 编程语言规范:Threads and Locks》。 在并发,有非常多的这种处理中断的例子,提供两个方法,分别为响应中断和不响应中断,对于不响应中断的方法,记录中断而不是丢失这个信息。

    1.1K20发布于 2019-11-20
  • 来自专栏产品优化

    Java 并发编程·Java 并发

    Java 并发 线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 時雨:在 《Java 并发核心知识体系精讲》,参考 Oracle 官方文档,标注实现多线程方式只有两种:实现 Runnable 接口和继承 Thread 类。 它是 JUC 并发的核心基础组件。 CountDownLatch 用来控制一个或者多个线程等待多个线程。 线程只能直接操作工作内存的变量,不同线程之间的变量值传递需要通过主内存来完成。 内存间交互操作 Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 在 Java 内存模型,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    3.2K32编辑于 2022-12-01
  • 来自专栏王念博客

    java并发的volatile和synchronized

    今天使用到了volatile关键字,之前了解到这个关键字,但是不知道他的具体作用是什么,下面就来详细解释一下他的作用: 在java线程并发处理,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字 ,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块(synchronized) 和 volatile 关键字机制。 在Java内存模型,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。 换句话说,另一个线程可能已经改变了它线程内的i1值,而这个值可以和当前线程的i1值不相同。事实上,Java有个思想叫“主”内存区域,这里存放了变量目前的“准确值”。

    57030发布于 2019-07-24
  • 来自专栏码农架构

    Java并发编程:并发死锁的形成条件及处理

    02 死锁的处理 由于死锁的检测涉及到很多复杂的场景,而且它还是运行时才会产生的,所以编程语言编译器一般也不会提供死锁的检测功能,包括Java也不提供死锁检测功能。 这其实就叫做鸵鸟算法,对于某件事如果我们没有很好的处理方法,那么就学鸵鸟一样把头埋入沙假装什么都看不见。 死锁的处理主要包括锁的顺序化、资源合并、避免锁嵌套等事前预防措施和超时机制、抢占资源机制、撤销线程机制等事的处理措施 - END -

    86440发布于 2020-12-28
领券