Java并发编程
文章平均质量分 86
梳理Java并发编程基础知识
夜雨风云
求实求真
展开
-
synchronized 关键字
synchronized是Java中的关键字,它用于实现同步访问共享资源,可解决共享资源竞争问题,以确保多个线程之间共享资源访问的正确性。当一个方法或代码块被声明为synchronized时,只有一个线程可以执行该方法或代码块。其他尝试访问该方法或代码块的线程将会被阻塞,直到当前线程执行完该方法或代码块。需要说明的是,synchronized关键字可能会导致线程阻塞和性能下降。因此,在使用synchronized关键字时,应该仔细考虑同步访问的必要性,并尽可能地减小同步访问的范围。原创 2023-09-07 22:08:21 · 164 阅读 · 0 评论 -
volatile 关键字
volatile是Java中的关键字,它用于确保多线程环境下变量的可见性和有序性,但不能保证原子性。volatile可以说是Java虚拟机提供的最轻量级的同步机制。使用volatile修饰的共享变量,具备三个特性: (1) 保证操作的可见性。(2) 无法保证操作的原子性。 (3) 保证操作的有序性。原创 2023-09-07 21:51:15 · 343 阅读 · 0 评论 -
并发程序的测试
并发程序存在一定程度的**不确定性**,而在串行程序中不存在这个问题。这种不确定性将增加不用交互模式以及故障模式的数量,因此在设计并发程序时必须对这些模式进行分析。 同样,在测试并发程序时,所面临的主要挑战在于:潜在错误的发生并不具有确定性,而是随机的。要在测试中将这些故障暴露出来,就需要比普通的串行程序测试覆盖更广的范围并执行更长的时间。 这里仅给出框架,后续还需补充。原创 2021-03-24 10:46:50 · 124 阅读 · 1 评论 -
性能与可伸缩性
线程的最主要目的是提高程序的运行性能。(线程通过并发来提高性能) 多线程虽然能提升性能,但同样也会增加复杂性,因此也就增加了在安全性(是指不发生任何错误的行为)和活跃性(是指某个良好的行为终究会发生)上发生失败的风险。更糟糕的是,虽然初衷是提升性能,但会带来其他新的性能问题,如线程之间的协调(如加锁,触发信号以及内存同步等),上下文切换开销,线程的创建与销毁,以及线程调度等。原创 2021-03-24 10:46:36 · 724 阅读 · 0 评论 -
避免活跃性危险
在安全性和活跃性之间常存在着某种制衡。加锁机制虽然能确保线程安全,但是如果过度使用,则可能导致锁顺序死锁(Lock-Ordering DeadLock)。同样,使用线程池和信号量来限制对资源的使用,也可能会导致资源死锁(Resource DeadLock)。Java无法从死锁中恢复过来,因此在设计时一定要排除那些可能导致死锁出现的条件。 常见的活跃性问题主要有:死锁、饥饿、低响应性、丢失信号和活锁等。原创 2021-03-24 10:46:22 · 118 阅读 · 1 评论 -
原子变量与非阻塞同步机制
近几年,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较交换指令)代替锁来确保数据在并发访问中的一致性。非阻塞算法被广泛地用于操作系统和JVM中实现线程/进程调度机制、垃圾回收机制和锁和其他并发数据结构。原创 2021-03-24 10:46:09 · 147 阅读 · 0 评论 -
构建自定义的同步工具
类库中包含许多存在状态依赖性的类,如FutureTask、Semaphore和BlockingQueue等。在这些类的一些操作中有着基于状态的前提条件。如,不能从一个空的队列中删除元素或者不能向一个已满的队列添加元素等。 创建状态依赖类的最简单的方法通常是在类库中现有状态依赖类的基础上进行构造。但如果类库没有提供需要的功能,那么还可以使用Java语言和类库提供的底层机制来构造自己的同步机制,包括内置的条件队列、显式的Condition对象以及abstractQueuedSynchronizer框架。原创 2021-03-24 10:45:55 · 130 阅读 · 0 评论 -
Java 显式锁
显式锁并不是一种替代内置加锁的方式,而是当内置加锁机制不适用时,作为一种可选择的高级功能。原创 2021-03-24 10:45:42 · 151 阅读 · 0 评论 -
单线程应用程序
GUI应用程序是单线程应用程序的典型应用。GUI应用程序多采用单线程方式实现。虽然GUI框架本身是单线程子系统,但应用程序可能不是单线程的,因此在编写GUI代码时,仍需谨慎的考虑线程问题。原创 2021-03-23 15:46:15 · 678 阅读 · 0 评论 -
线程池实践
线程池,从字面意思来看,是指**管理一组同构工作线程的资源池**。 线程池主要解决“为每个任务分配一个线程”方式使用多线程带来的**线程创建和销毁**的低效问题。为了减少创建和销毁线程的次数,实现线程资源的统一管理,引入线程池。原创 2021-03-23 15:37:59 · 274 阅读 · 0 评论 -
线程池原理
线程池,从字面意思来看,是指管理一组同构工作线程的资源池。”在线程池中执行任务“比”为每个任务分配一个线程“优势更多。通过重用现有的线程而不是创建新线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。通过适当调整线程池的大小,可以创建足够多的线程以使处理器保持忙碌状态,同时防止过多线程相互竞争资源而使应用程序耗尽内存或失败。原创 2021-03-23 15:31:24 · 462 阅读 · 0 评论 -
Java 任务
任务通常是一些抽象的且离散的工作单元。通过把应用程序的工作分解到多个任务中,可以简化程序的组织结构,提供一种自然的事务边界来优化错误恢复过程,以及提供一种自然的并行工作结构来提升并发性。原创 2021-03-23 15:26:09 · 368 阅读 · 0 评论 -
基础构建模块
非线程安全容器类、同步容器类、并发容器、阻塞队列和生产者--消费者模式\双端队列、工作密取原创 2021-03-23 15:14:59 · 134 阅读 · 0 评论 -
线程的组合
了解线程安全和同步后,就可尝试构造线程安全的类,并将线程安全的类组合为更大规模的组件或程序。常见的组合模式有:实例封闭、线程安全性的委托、在现有的安全类中添加功能等。这些组合模式能够使一个类更容易成为线程安全的,并在维护这些类时不会无意中破坏类的安全性保证。另外,在维护线程安全性,可以使用文档说明客户代码需要了解的线程安全保证,以及代码维护人员需要了解的同步策略。原创 2021-03-23 15:08:31 · 133 阅读 · 0 评论 -
线程的共享
编写正确的并发程序时,关键问题在于:在访问共享的可变状态时需要进行正确的管理。使用同步的方式可以避免多个线程在同一时刻访问相同的数据。同步还有另一个重要的方面:内存可见性(Memory Visibility)。我们不仅希望防止某个线程正在使用对象状态,而另一个线程在同时修改该状态,而且希望确保当一个线程修改了对象状态后,其他线程能看到发生的变化。原创 2021-03-23 15:06:46 · 1276 阅读 · 0 评论 -
线程安全概述
线程安全的一个比较恰当的定义是:“当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的”。 简言之,线程安全就是指多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。 也就是说,代码本身封装了所有必要的正确性保障手段(如互斥同步),令调用者无需关心多线程的问题,更无需采用任何措施来保证多线程的正确调用。原创 2021-03-23 15:04:31 · 380 阅读 · 0 评论 -
Java内存模型
Amdahl定律揭示可通过增加机器的核心数量和提高单一核心的频率的方式,来提高机器的性能。对于编程来说,如何利用好多核是挖掘处理器性能的关键。并发编程是充分利用多核优势的最直接体现。原创 2021-03-23 15:02:23 · 103 阅读 · 0 评论 -
并发编程简介
并发编程并发能够很好的发挥多处理器系统的强大计算力(发挥多核优势)。对Java语言来说,并发是Java语言持续散发生命力的有力保证,是Java语言继续保证语言领先的关键之一。“多线程”是Java开发的事实标准。多程序执行优势计算机加入操作系统后实现的多个程序的执行,其优势主要体现在以下几个方面:(1) 提高CPU资源利用率多个程序并发执行。对于单个程序,当需要等待某个外部操作执行的结果的同时,当前程序的阻塞会导致整个系统的阻塞。而对于多程序,仅阻塞当前程序,其他程序仍可正常运行,从而保证系统原创 2021-03-23 14:51:53 · 91 阅读 · 0 评论