首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏狗哥的 Java 世界

    Java 并发6)Semaphore 源码分析

    Semaphore (信号量) 是 JUC 包中比较常用到的一个类,它是 AQS 共享模式的一个应用,可以允许多个线程同时对共享资源进行操作,并且可以有效的控制并发数,利用它可以很好的实现流量控制。 在本篇我们只讲每次获取和释放一个许可证的情况。 每次只获取一个许可证,这也是现实生活较常遇到的情况。除了直接获取还提供了尝试获取,直接获取操作在失败之后可能会阻塞线程,而尝试获取则不会。 每当外部线程请求获取一个连接时,首先调用 semaphore.acquire () 方法获取一个许可证,然后将连接状态设置为使用,最后返回该连接的引用。 测试示例初始化了一个 3 个连接的连接池,我们从测试结果可以看到,每当线程获取一个连接剩余的连接数将会减 1,等到减为 0 时其他线程就不能再获取了,此时必须等待一个线程将连接释放之后才能继续获取。

    40510发布于 2020-04-07
  • 来自专栏静晴轩

    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进行了优化,为了减少获取和释放锁带来的性能消耗 在并发环境,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列,以后会按照FIFO(先进先出)的规则从队列取到自己。 3、例子 在Java并发,ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认是非公平锁。 二、synchronized锁 详细见Java并发——synchronized锁 三、Lock锁 Java并发——Lock锁 四、synchronized 和 Lock 对比 相同点: 1、synchronized 6、性能不同 在低并发情况下,Synchronized的性能通常优于ReentrantLock;在高并发情况下,ReentrantLock可能表现更好 7、锁的获取状态查询 ReentrantLock可以通过

    2.5K00编辑于 2024-04-25
  • 来自专栏灵墨AI探索室

    Java并发篇:6个必备的Java并发面试种子题目

    终止状态: 线程执行完run()方法的逻辑或者通过调用stop()方法被终止后,线程进入终止状态。终止的线程不能再次启动。理解线程的创建和生命周期对于处理并发编程非常重要。 抽象队列同步器(Abstract Queued Synchronizer)解析抽象队列同步器(Abstract Queued Synchronizer)是Java并发编程中非常重要的同步框架,被广泛应用于各种锁实现类 总之,AQS作为Java线程同步的核心框架,在并发编程起到了至关重要的作用。它提供了强大的同步机制,可以支持各种锁的实现,帮助我们实现线程安全的代码。 通过设置合适的线程池大小,可以平衡系统的并发能力和资源消耗。探索Java的Fork/Join框架Fork/Join框架是Java中用于处理并行任务的一个强大工具。 此外,抽象队列同步器(AQS)是Java并发编程的核心概念,了解其原理和应用场景可以展示对并发编程的深入理解。

    35740编辑于 2023-11-16
  • 来自专栏架构师成长之路

    java并发编程实战(6) 乐观锁 CAS

    我们在系列java并发线程实战(1)线程安全和机制原理,已经提到例子, private volatile int count = 0; public void doAdd(CountDownLatch 这是因为程序是线程不安全的,所以造成的结果count值可能小于4000;具体分析已经在java并发线程实战(1)线程安全和机制原理 提到过。 我们都知道,在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语,从而在硬件层面提升效率。 而随着java不断的发展,Java本地方法(JNI)的出现,使得java程序越过JVM直接调用本地方法提供了一种便捷的方式,因而java并发的手段上也多了起来。 在 Java Java 并没有直接实现 CAS,CAS 相关的实现是通过 C++ 内联汇编的形式实现的。Java 代码需通过 JNI 才能调用。

    1.3K30编辑于 2022-04-14
  • 来自专栏开发语言-Java

    Java并发编程学习6-同步容器类和并发容器

    引言本篇开始将要介绍 Java 平台类库下的一些最常用的 并发基础构建模块,以及使用这些模块来构造并发应用程序时的一些常用模式。 容器里常见的复合操作包括:迭代(反复访问元素,直到遍历完容器的所有元素)跳转(根据指定顺序找到当前元素的下一个元素)条件运算(例如“若没有则添加”)下面假设我们在 Vector 定义两个复合操作的方法 在这种机制,任意数量的读取线程可以并发地访问 Map,执行读取操作的线程和执行写入操作的线程可以并发地访问 Map,并且一定数量的写入线程可以并发地修改 Map。 ConcurrentHashMap 与其他并发容器一起增强了同步容器类,有如下的特点:它们提供的迭代器不会抛出 ConcurrentModificationException,因此不需要再迭代过程对容器加锁 在 ConcurrentHashMap 没有实现对 Map 加锁以提供独占访问,而在 Hashtable 和 synchronizedMap ,获得 Map 的锁能防止其他线程访问这个 Map。

    33821编辑于 2024-09-19
  • 来自专栏架构探险之道

    Java 并发并发原理剖析之ConcurrentLinkedQueue

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

    55620发布于 2019-07-25
  • 来自专栏奔跑的蛙牛技术博客

    并发知识6

    并发散列映射的批操作 javase8 为散列映射提供批操作,即使有其他线程在处理映射,这些操作也能安全的执行。 如果程序创建大量的生命很短的线程,建议使用线程池 线程池 使用线程池应该做的事 调用 Executors 类静态的方法 newCachedThreadPool 或 newFixedThreadPool

    35220发布于 2018-09-05
  • 来自专栏JAVA并发编程

    JAVA并发编程系列(6)ReentrantLock核心原理剖析

    JAVA并发编程系列以及陆续出了5篇,第六篇的主角ReentrantLock该出场了。 之前《一文看懂全部锁机制》谈到可重入锁、《JAVA并发编程AQS原理剖析》谈到了JUC灵魂AQS,那么AQS的思想优秀实践者ReentrantLock是怎么实现AQS的呢? 在《JAVA并发编程volatile核心原理》文中开头我们就简单的列了synchronized的几个缺点,包括:阻塞时间过长,不可中断、是非公平锁。

    35320编辑于 2024-12-09
  • 来自专栏Android开发经验分享

    Java并发工具类

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

    Python并发编程(6)使用多进程

    可以将Python并发编程(2)线程的实现的Thread直接替换成Process。 supervisor() print(f'Answer: {result}') if __name__ == '__main__': main() 同样,我们用进程改写线程Python并发编程 如果把numbers的数字加大,时间减少的会更明显: numbers = [4139079, 2214759, 4516637, 6852285, 44256346, 62456533] 顺序执行花费

    35510编辑于 2023-12-26
  • 来自专栏后端精进之路

    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并发程序设计》

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

    Java 并发编程·Java 并发

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

    3.2K32编辑于 2022-12-01
  • 来自专栏程序猿的大杂烩

    Java并发编程(6)- J.U.C组件拓展

    J.U.C-FutureTask 在Java中一般通过继承Thread类或者实现Runnable接口这两种方式来创建线程,但是这两种方式都有个缺陷,就是不能在执行完成后获取执行的结果,因此Java 1.5 而FutureTask则是J.U.C的类,但不是AQS的子类,FutureTask是一个可删除的异步计算类。 ForkJoinTask: 它是将在ForkJoinPool执行的任务的基类。它提供在任务执行fork()和join()操作的机制,并且这两个方法控制任务的状态。 ; import java.util.concurrent.Future; import java.util.concurrent.RecursiveTask; /** * @program: concurrency-demo BlockingQueue很好的解决了多线程,如何高效安全“传输”数据的问题,从名字也可以知道它是线程安全的。

    45630发布于 2020-09-23
  • 来自专栏王念博客

    java并发的volatile和synchronized

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

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

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

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

    86440发布于 2020-12-28
  • 来自专栏码农架构

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

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

    87220发布于 2020-12-13
领券