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

    Java并发编程系列-(5) Java并发容器

    5 并发容器 5.1 Hashtable、HashMap、TreeMap、HashSet、LinkedHashMap 在介绍并发容器之前,先分析下普通的容器,以及相应的实现,方便后续的对比。 通过下面的例子,可以清楚的看到,21和5在原来的数组中都处于相同的位置,但是在新的数组,21到了新的位置,位置为原来的位置加上16,也就是旧的Capacity;但是5还在原来的位置。 ---- 参考: https://tech.meituan.com/2016/06/24/java-hashmap.html https://juejin.im/post/5aa5d8d26fb9a028d2079264 如果并发度设置的过小,会带来严重的锁竞争问题;如果并发度设置的过大,原本位于同一个Segment内的访问会扩散到不同的Segment,CPU cache命中率会下降,从而引起程序性能下降。 队列的 Delayed 必须实现 compareTo 来指定元素的顺序。比如让延时时间最长的放在队列的末尾。 5.

    57410编辑于 2023-10-19
  • 来自专栏静晴轩

    Java 并发

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

    96660发布于 2018-03-27
  • 来自专栏Java帮帮-微信公众号-技术文章全总结

    Java并发学习5【面试+工作】

    Java并发学习5【面试+工作】 十一.future模式 future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用。 类推到程序设计时,当提交请求时,期望得到答复时,如果这个答复可能很慢。 传统的时一直等待到这个答复收到时再去做别的事情,但如果利用Future设计模式就无需等待答复的到来,在等待答复的过程可以干其他事情。   对于future模式来说,虽然它无法立即给你需要的数据。 Future模式java实现 ? (1) Data.java ? (2) RealData.java ? (3) FutureData.java ? (4) Client.java ? (5) Main.java ? 输出结果: 请求完毕 数据 = aaaaaaaaaa future jdk实现 ? (1) RealData.java ? (2) Main.java ?

    33320发布于 2018-07-26
  • 来自专栏悠扬前奏的博客

    Java并发-5.线程状态

    Java线程有6种状态 Java线程在运行的声明周期有6不同的状态,给任一时刻,线程只能处于其中一种状态: 状态 说明 NEW 初始状态,线程被构建的,但是还没有调用start()方法 RUNNABLE 运行状态,这里包括操作系统的就绪和运行两种状态,Java统称“运行” BLOCKED 阻塞,标识线程阻塞于锁 WAITING 等待,标识当前线程需要等待其他线程作出一些特定操作(通知或中断) TIME_WAITING } } 查看线程pid: $jps 48316 ThreadState 48317 Jps 查看线程状态: $jstack 48316 "TimeWaitingThread" #13 prio=5 at java.lang.Thread.run(Thread.java:748) "WaitingThread" #14 prio=5 os_prio=31 tid=0x00007fe47481b000 :748) "BlockedThread-1" #15 prio=5 os_prio=31 tid=0x00007fe470853800 nid=0xa403 waiting on condition

    80450发布于 2019-05-28
  • 来自专栏狗哥的 Java 世界

    Java 并发5)ReentrantLock 源码分析

    Java5.0 之前,协调对共享对象的访问可以使用的机制只有 synchronized 和 volatile。 因此,在 Java5.0 增加了一种新的机制:ReentrantLock。 5. 如果想编写一个带有多个条件谓词的并发对象,或者想获得除了条件队列可见性之外的更多控制权,就需要使用显式的 Lock 和 Condition 而不是内置锁和条件队列。 有关于 ConditionObject 的具体实现大家可以查阅我的这篇文章《Java 并发(4)AbstractQueuedSynchronizer 源码分析之条件队列》,这里就不重复赘述了。

    67430发布于 2020-04-07
  • 来自专栏Java并发

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

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

    2.6K00编辑于 2024-04-25
  • 来自专栏架构探险之道

    Java 并发并发原理剖析之ConcurrentLinkedQueue

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

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

    Java并发工具类

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

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

    如何理解Java并发

    Java 并发(Concurrency) 指多个任务在同一时间段内交替执行(宏观上同时进行,微观上可能是 CPU 快速切换调度),目的是提高程序效率,充分利用系统资源(如 CPU、内存、I/O 等) undefined例如:4 核 CPU 同时运行 4 个线程是并行,1 核 CPU 快速切换 4 个线程是并发。三、Java 实现并发的方式Java 提供了多种并发编程工具,核心是通过线程实现:1. // 创建固定大小的线程池(3个线程) ExecutorService pool = Executors.newFixedThreadPool(3); // 提交5个任务 (线程池会复用3个线程处理) for (int i = 0; i < 5; i++) { int taskId = i; pool.submit 理解并发Java 进阶的关键,尤其在高并发场景(如分布式系统、高流量服务器),合理设计并发模型能显著提升系统性能。

    33110编辑于 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.8K10发布于 2020-07-08
  • 来自专栏JAVA并发编程

    JAVA并发编程系列(5)AQS原理剖析

    很多小朋友面试时候,面试官考察并发编程部分,都会被问:说一下AQS原理。 面对并发编程基础和面试经验,专栏采用通俗简洁无废话无八股文方式,已陆续梳理分享了《一文看懂全部锁机制》、《JUC包之CAS原理》、《volatile核心原理》、《synchronized全能王的原理》, 这个类在JUC包java.util.concurrent.locks下面。 一句话总结:AQS是FIFO先进先出双向队列,队列里存的是线程Thread。 说到双向链表,这回大家就不陌生了。 核心原理:队列的每个节点对应一个线程。线程通过判断state字段进行抢占资源,如果获取资源成功,则把当前线程设置为有效工作线程,并且修改state值。

    42720编辑于 2024-12-09
  • 来自专栏程序那些事

    java并发CountDownLatch的使用

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

    58610发布于 2020-07-08
  • 来自专栏后端精进之路

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

    9.2 改进的读写锁:StampedLock StampedLock是JDK 8引入的新的锁机制,可以认为是读写锁的一个改进版本,读写锁虽然分离了读和写,使得读与读之间可以完全并发,但是读和写之间仍然是冲突的 简单粗暴的分散了高并发下的竞争压力。 答案就在LongAdder的java doc,从我们翻译的那段可以看出,LongAdder适合的场景是统计求和计数的场景,而且LongAdder基本只提供了add方法,而AtomicLong还具有cas 从java doc可以看出,其适用于统计计数的场景,例如计算qps这种场景。在高并发场景下,qps这个值会被多个线程频繁更新的,所以LongAdder很适合。 ---- 参考: https://www.jianshu.com/p/22d38d5c8c2a 《实战Java并发程序设计》

    46510编辑于 2023-10-19
  • 来自专栏产品优化

    Java 并发编程·Java 并发

    Java 并发 线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 時雨:在 《Java 并发核心知识体系精讲》,参考 Oracle 官方文档,标注实现多线程方式只有两种:实现 Runnable 接口和继承 Thread 类。 :5) at InterruptExample$$Lambda$1/713338599.run(Unknown Source) at java.lang.Thread.run(Thread.java:745 它是 JUC 并发的核心基础组件。 CountDownLatch 用来控制一个或者多个线程等待多个线程。 在 Java 内存模型,允许编译器和处理器对指令进行重排序,重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    3.4K32编辑于 2022-12-01
  • 来自专栏yukong的小专栏

    java并发编程实战5】线程与线程通信

    然后它调度的最小单元是线程,线程也叫轻量级进程(Light Weight Process),在一个进程可以创建多个线程,这些线程都有各自的计算器,堆,栈和局部变量,并且都能访问共享的内存变量。 在java线程,可以通过priority来控制线程优先级,线程优先级的范围从1~10。 默认值是5,优先级大的分配的时间片会大于优先级低,所以频繁阻塞线程可以设置高优先级,而占用cpu比较长的线程(计算线程)可以设置较低的优先级。但是在有的操作系统会无视对线程有限制。 线程的状态 状态名称 解释 NEW 初始状态,线程被构建,但是还没执行start()方法 RUNNABLE 运行状态,Java中将就绪与运行统称为 ”运行“ BLOCKED 阻塞状态,表示线程阻塞与获取锁的过程 /** * @author yukong * @date 2018/9/5 * @description 线程池接口,抽象出来,定义规范 */ public interface ThreadPool

    68620发布于 2018-10-09
  • 来自专栏开发语言-Java

    Java并发编程学习5-对象的组合

    因此在设计线程安全类的过程,需要包含如下三个基本要素:找出构成对象状态的所有变量。找出约束状态变量的不可变条件。建立对象状态的并发访问管理策略。那如何找构成对象状态的所有变量? 1.3 状态的所有权所有权在 Java 是属于类设计的一个要素,不像 C或C++,需要认真考虑所有权的处理,Java 通过垃圾回收机制,减少了许多在引用共享方面常见的错误,降低了在所有权处理上的开销 2.1 Java监视器模式Java 监视器模式来自于 Hoare 对监视器机制的研究工作。 在JVM,进入和退出同步代码块的字节指令也称为 monitorenter 和 monitorexit,而 Java 的内置锁也称为 监视器锁 或 监视器。 下一篇我们将要学习Java类库并发基础构建模块,敬请期待!

    41221编辑于 2024-08-08
  • 来自专栏拭心的安卓进阶之路

    并发编程5Java 阻塞队列源码分析(下)

    上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文章来了解剩下的四种阻塞队列 7 种阻塞队列的特点 这篇文章介绍的 4 种加上上一篇 细说并发4:Java 阻塞队列源码分析(上) 3 种,总共 7 种阻塞队列,这么多队列看的眼都花了。 这里简单总结下 Java 7 种阻塞队列的特点: ArrayBlockingQueue 环形数组实现的、有界的队列,一旦创建后,容量不可变 基于数组,在添加删除上性能还是不如链表 LinkedBlockingQueue 我们结合源码和《Java 并发编程的艺术》相关章节分两篇文章介绍了 Java 的阻塞队列,了解了 7 种阻塞队列的大致源码实现,后面遇到需要使用阻塞队列时心里应该有些底了。 Thanks 《Java 并发编程的艺术》 http://blog.csdn.net/goldlevi/article/details/7705180 http://stevex.blog.51cto.com

    1.3K60发布于 2018-01-05
  • 来自专栏码农架构

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

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

    96020发布于 2020-12-13
  • 来自专栏王念博客

    java并发的volatile和synchronized

    今天使用到了volatile关键字,之前了解到这个关键字,但是不知道他的具体作用是什么,下面就来详细解释一下他的作用: 在java线程并发处理,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块(synchronized) 和 volatile 关键字机制。 对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的 例如假如线程1,线程2 在进行read,load 操作,发现主内存data的值都是5,那么都会加载这个最新的值 在Java内存模型,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。 如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。

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

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

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

    94340发布于 2020-12-28
领券